2014-08-01 2 views
1

Я добавил слушателя событий и создал бесконечный цикл. Я действительно не понимаю, что я сделал неправильно.addEventListener Создал бесконечную петлю

Что произойдет это держит щелкая изображения сам по себе

Вот мой код:

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]]; 

}; 

Надежда кто-то может найти свою ошибку .. Спасибо!

+0

Я вижу здесь 3 объявления функций, но нет вызовов функций. Можете ли вы опубликовать более полный пример кода? В частности, размещайте свой HTML-код и показывайте привязки событий. – oliakaoil

+0

Еще лучше, сделайте jsfiddle – Kolby

ответ

0

Возможно, проблема в том, что вы неправильно используете обратные вызовы.

Обратные вызовы должны быть функциональными объектами и не могут быть возвращены по мере того, как вы собираетесь.

function (cases, theme, debut, capture) { 
    return function() { newImage(this, cases, theme, debut, capture); }; 
} 

Попробуйте вернуть анонимную функцию.

+0

Эй, когда я возвращаю анонимную функцию, она работает, но мне нужно удалить некоторые из этих событий по дороге, поэтому я не могу работать только с анонимными функциями ... – Charles

+0

Затем присоедините свои параметры к элементу изображения и вы можете использовать 'this' для доступа к ним снова – Cheruvian

+0

Я не слишком уверен, как это сделать .. Не могли бы вы привести мне пример? – Charles

3
  1. getElementsByTagName возвращается живой NodeList
  2. Вы активизируете функциюx каждый раз, вместо того, чтобы добавить его в качестве обработчика
  3. Новый <img> создается
  4. NodeList имеет его длина увеличена на 1
  5. Следующая итерация на том же расстоянии от конца, как и предыдущий

Есть две вещи, которые необходимо учитывать, во-первых, как я упоминаю в 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); 
    } 
} 
+0

Что мне делать вместо добавления x в качестве обработчика?Также изображения создаются ранее с помощью другой функции – Charles

+0

Поскольку вы пытаетесь передать свои параметры через, вам нужно создать новое закрытие над ними (то есть функцию), которая обертывает 'x', см. Мое редактирование –

0

Было бы лучше, чтобы увидеть, как вы называть эти функции, но я заметил, что на этой линии:

images[i].addEventListener("click",x(cases,theme,debut,capture),false); 

Вы вызываете вашу функцию x, а не назначая его как событие л istener. Поскольку эта функция добавляет изображение на страницу, цикл никогда не завершается, так как он выполняет итерацию по всем изображениям на странице. Эта строка должна быть следующей:

images[i].addEventListener("click", x , false); 
+0

Я пробовал это тоже не работает – Charles

Смежные вопросы