2014-12-18 2 views
-2

Эта вещь меня заводит.event.preventDefault не работает с загруженным контентом AJAX

Итак, я загружаю простой HTML-код через AJAX, и как только он загружается в DOM, я делаю это.

$('#wrap a.link').click(function(e) { 
    e.preventDefault(); 
    alert("asdasdad"); 
}); 

Это просто не мешает переходу ссылки на URL-адрес в атрибуте href.

Мой синтаксис кажется правильным, и я убедился, что элемент находится в DOM и что функция находит элемент a.link.

$("#wrap a.link").each(function(key, value) { 
    console.log("found a link"); // this shows up in the console 
}); 

Я также попытался с помощью off() и stopImmediatePropagation() только в случае, если какой-то другой случай не может мешать, но ничего. Я также попытался связать событие внутри цикла each() с тем же результатом.

Что может быть причиной такого поведения?

+0

Возможно потому, что это просят много, даже здесь. Поиск Google для «события jQuery динамического элемента» даже дает результат SO. Хотя я не уменьшал ни одного слова, я не против дублирования. – vcanales

+1

'как только он загружается в DOM, я это делаю. Поэтому, если это утверждение верно, это не проблема делегирования. Или, может быть, вы не используете соответствующий обратный вызов ajax. Во всяком случае, ваш код пропустит какой-то контекст, чтобы понять, что происходит не так, например, как вы его называете ??? –

+0

'# wrap' является в DOM, так как тело загружается, и, как вы можете видеть из' each() 'элементы находятся внутри' # wrap', поэтому я предполагаю, что загруженный код находится в DOM. Я ошибаюсь, чтобы предположить это? – Pier

ответ

6

Bind события к телу для динамических элементов:

$('body').on('click','#wrap a.link',function(e) { 
    e.preventDefault() 
}); 
+0

Это работает. Это тот же ответ, что и @PeterKA, но вы ответили за минуту до того, как он это сделал. Можете ли вы объяснить, почему это работает? – Pier

+1

Это не технически то же самое, но он имеет тот же эффект. Он работает, потому что динамические элементы не находятся в DOM при загрузке JS; это похоже на попытку привязки событий к элементам, которые не существуют. Если вы привязываете его к телу, jquery в основном перезаписывает событие каждый раз, просматривая тело для селектора по второму параметру. – vcanales

+0

Я понимаю это, но элементы были добавлены к элементу, находящемуся в DOM, и цикл 'each' находит элементы в DOM. – Pier

6

Используйте событие делегации:

$(document).on('click', '#wrap a.link', function(e) { 
    e.preventDefault(); 
    alert("asdasdad"); 
}); 

Внимание: Держите уникальные идентификаторы.

+2

Плюс так вам не нужно ждать, пока контент будет загружен; вы можете сделать это, находится ли элемент в DOM или нет. – Pointy

+0

OP сказал: 'как только он загружается на DOM, я делаю это. Не уверен, что происходит дальше. EDIT: просто увидели комментарий другого пользователя OP, поэтому было неправильное утверждение в вопросе –

+0

Если он загружен через ajax, он просто не загружается в DOM заранее. – vcanales

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