[英]addEventListener Created an Infinite Loop
我添加了一個事件監聽器,它創建了一個無限循環,我真的不知道我做錯了什么。
它會不斷地單擊圖像
這是我的代碼:
function attachOnClickEvent(cases,theme,debut,capture){
var images=document.getElementsByTagName('img');
for(var i=0;i<images.length;i++){
images[i].addEventListener("click",x(cases,theme,debut,capture),false);
}
};
var x=function(cases,theme,debut,capture){newImage(this,cases,theme,debut,capture);};
function newImage(elem,cases,theme,debut,capture){
var images=preloadImages(cases,theme);
var imgTab=document.getElementsByTagName('img');
var Id=elem.id;
elem.src=images[randomTab[Id]];
};
希望有人能找到我的錯誤..謝謝!
getElementsByTagName
返回一個實時NodeList x
而不是將其添加為處理程序 <img>
1
有兩件事你需要考慮,首先,正如我在2
提到的那樣,當你沒有意義時,你正在調用x
。 其次,您可以通過向下循環來避免實時列表的一些問題
獲得所需結果的一個方法是重寫像這樣的attachOnClickEvent
function attachOnClickEvent(cases, theme, debut, capture) {
var images = document.getElementsByTagName('img'),
handler = function (e) {
return x(cases, theme, debut, capture);
},
i;
for (i = images.length - 1; i >= 0; --i) {
images[i].addEventListener("click", handler, false);
}
}
一個問題似乎是您沒有正確使用回調。
回調需要是函數對象,不能按照您的意圖返回。
function (cases, theme, debut, capture) {
return function() { newImage(this, cases, theme, debut, capture); };
}
嘗試返回匿名函數。
會更好地了解你如何調用這些函數,但我注意到這一行:
images[i].addEventListener("click",x(cases,theme,debut,capture),false);
您正在調用函數x
,而不是將其指定為事件偵聽器。 由於該函數會向頁面添加圖像,因此循環永遠不會完成,因為它會遍歷頁面上的所有圖像。 這一行應該是:
images[i].addEventListener("click", x , false );
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.