Прежде всего, я попробовал ответы в этом, и подобные вопросы, но это, похоже, не работает для меня вообще.
Я хотел бы сделать материал в событии клика, связанного с элементом, который создается через 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, когда страница загружается в первый раз.
Почему это происходит? Это причина? И как я мог понять, какое поведение я получаю в активе?
Вы привязываетесь к элементу контейнера (обычно document
или body
) и делегируете событие объекту, который должен быть создан:
$(document).on("click", "#div .link", function() {
$(this).after("<%= insert some long view here %>");
});
переплет
Как вы указали, JS связывает события с элементами DOM при загрузке страницы
Если ваш элемент отсутствует при загрузке, JS
не сможет связываться, что вызовет проблему. Чтобы исправить это, вам нужно делегировать привязку к элементу выше в иерархии DOM
, что позволяет JS связывать событие с любыми новыми элементами по отношению к вашему контейнеру
$("#div").on("click", ".link", function() {
#div IS в DOM при загрузке страницы. У меня есть также пытался с $(document).on("click", "#div .link", function() {
но все равно я не могу получить то, что хочу. Работает со второго щелчка, но не для первого
my_asset.js.coffee
и в my_view.js.erb
? Почему это работает в активе, а не в представлении? И в каком порядке они выполняются?