Как связать событие click с объектом, которого еще нет в DOM?

0

Прежде всего, я попробовал ответы в этом, и подобные вопросы, но это, похоже, не работает для меня вообще.

Я хотел бы сделать материал в событии клика, связанного с элементом, который создается через ajax, поэтому он не находится в DOM вначале.

Я замечаю, что следующий coffeescript в my_asset.js.coffee работает так, как ожидалось:

$ ->  
  $('#div').on "click", ".link", (e) -> 
    #do stuff 

Согласно JQuery Doc: эта функция связана всем "selected_div" нажмите событие, даже если они будут добавлены к DOM через AJAX позже, и do stuff, часть работает нормально

Однако я хотел бы:

$(this).after("<%= insert some long view here %>")

Итак, для этого, я думаю, я должен переместить $(this).after части из asset.js.coffee в my_view.js.erb где я мог бы встроить render partial

Там, в my_view.js.erb, я попробовал следующий (эквивалентный) javascript:

$(function() {  
  $("#div").on("click", ".link", function() {
    $(this).after("<%= render partial here %>");
  });
});

Но это не работает для первого щелчка (это происходит, однако, для последующих кликов)

Я думаю, что это связано с тем, что .link не находится в DOM, когда страница загружается в первый раз.

Почему это происходит? Это причина? И как я мог понять, какое поведение я получаю в активе?

  • 0
    #Div в DOM при загрузке страницы? Попробуйте использовать: $ ("body"). On ("click", "#div .link", function () {
  • 0
    Да, это. Пробовал, но это не работает
Теги:
dom
coffeescript

1 ответ

0

Вы привязываетесь к элементу контейнера (обычно document или body) и делегируете событие объекту, который должен быть создан:

$(document).on("click", "#div .link", function() {
    $(this).after("<%= insert some long view here %>");
});

переплет

Как вы указали, JS связывает события с элементами DOM при загрузке страницы

Если ваш элемент отсутствует при загрузке, JS не сможет связываться, что вызовет проблему. Чтобы исправить это, вам нужно делегировать привязку к элементу выше в иерархии DOM, что позволяет JS связывать событие с любыми новыми элементами по отношению к вашему контейнеру

  • 0
    Ну, я попробовал это, но это не работает для меня. Я хотел бы прояснить, что в том, что я пытался: $("#div").on("click", ".link", function() { #div IS в DOM при загрузке страницы. У меня есть также пытался с $(document).on("click", "#div .link", function() { но все равно я не могу получить то, что хочу. Работает со второго щелчка, но не для первого
  • 0
    Могу ли я использовать ту же функцию (то же самое при нажатии на ту же ссылку) в my_asset.js.coffee и в my_view.js.erb ? Почему это работает в активе, а не в представлении? И в каком порядке они выполняются?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню