У меня возникла проблема с нежелательной функцией множественного вызова после загрузки динамического содержимого.
HTML
<div class="wrap">
<a href="javascript:;" class="addNewImage">add new image</a><br /><br /><br />
<div id="fancyDIV">
<a tabindex="1" rel="group" href="#" class="fancyLink" title="title 01"><img src="http://www.picssel.com/playground/jquery/images/01t.jpg" alt="t1" /><span>number1</span></a>
<a tabindex="1" rel="group" href="#" class="fancyLink" title="title 02"><img src="http://www.picssel.com/playground/jquery/images/02t.jpg" alt="t1" /><span>number2</span></a>
</div>
</div>
JS
$("#fancyDIV").on("focusin", function(){
$('span').on('click', function(e) {
alert(0);
});
}); // on
var $indice = 3;
$("a.addNewImage").click(function(){
if ($indice > 8) {
alert('sorry, there are no more images to add'); return false;
}else{
$("#fancyDIV").append('<a tabindex="1" rel="group" href="#" class="fancyLink"><img src="http://www.picssel.com/playground/jquery/images/0'+$indice+'t.jpg" alt="thumb'+$indice+'" /><span>number'+$indice+'</span></a>');
$indice++;
}
});
Если сразу после загрузки я нажимаю на диапазон, предупреждение появляется только 1 раз, правильно.
Если я добавлю динамически больше изображений, то, если я нажму на последний интервал, он также будет выполняться один раз, это правильно.
Но если я добавлю более динамические изображения, и я нажимаю на любой из предыдущих интервалов, это предупреждение появляется мне несколько раз. Этого не может быть, потому что в конечном итоге на этом этапе вместо предупреждения отправьте запрос ajax. И отправляет мне десятки одинаковых запросов.
Я бы хотел, чтобы это предупреждение появилось только один раз, независимо от того, сколько я добавлю новые фотографии. Может ли это быть?
Изменить (что мне нужно): я хочу динамически загружать компонент и иметь возможность нажимать на него, чтобы отправить запрос ajax.Normally, это будет работать только для тех элементов, которые загружаются в начале, поскольку те, которые добавлены динамически, не работают. Я смог сделать это с помощью focusIn, но к тому времени запрос ajax отправляется столько раз, сколько я нажимаю, чтобы добавить новый элемент. Но я хочу отправить запрос только один раз.
Вы никогда не хотите иметь вложенные вызовы .on
подобное. Если вы удалите внешний, $("#fancyDIV")
, то это почти правильный способ сделать это.
Причина, по которой это не совсем работает, заключается в том, что обработчик задан до создания элементов. Это означает, что обработчик не установлен на этих элементах.
Вокруг этого есть два пути. Вы можете добавить обработчик к новым элементам, когда они будут созданы. Лично я предпочел бы другой путь, который должен добавить обработчик к некоторому элементу предка, но установить его для работы на потомках, соответствующих определенному CSS-селектору. (Это использует так называемую "пузырьковую" функцию обработки событий DOM.) Например:
$('#fancyDiv').on('click', 'span', function(e) {
alert(0);
});
Это запустит обработчик, когда будет #fancyDiv
любой элемент <span>
внутри #fancyDiv
.
Кстати, было бы разумно использовать CSS-классы или что-то еще, так как существует риск того, что больше элементов <span>
могут быть добавлены в код позже.