0

Я знаю, что использование JavaScript в партитурах - плохая идея, потому что страница будет загружать новый скрипт каждый раз, когда загружается новая частичная. Я знаю и прочитал this question, но его ответ не сработал для меня (установка скрипта в приложение/javascripts/application.js). Я думаю, что это потому, что я работаю с частицами, которые динамически генерируются на странице. Я думаю, что динамически генерируемая частица не реагирует на сценарий, загруженный на начальную страницу.Ruby on Rails - JavaScript в динамически сгенерированных партитурах

Например, у меня есть «Rule» div с входом выбора, который имеет скрипт, чтобы что-то делать, когда изменяется вход выбора. Это работает для каждого Rule div, создаваемого при загрузке страницы. Но тогда есть также кнопка «+» или «ДОБАВИТЬ», которая будет динамически генерировать больше разделов Rule, которые не отвечают на сценарий, если только этот скрипт не находится в частичном.

Есть ли хороший способ сохранить сценарий из частичного, если частичная динамическая генерация?

ответ

4

JQuery наборы слушателей на странице загрузки (т.е. $(selector).on(etc.)), поэтому он не слушает событий на динамически добавляемых элементов. Однако есть способ обойти это. Вам нужно использовать то, что называется делегатом.

$(document).ready(function() { 
    $('body').on('change', 'input.selector', function(e) { 
     // do something 
    }); 
}); 

Я не уверен, что ваше мероприятие (здесь я ставлю change) или селектор для выбора вы используете (здесь я ставлю input.selector), но если заменить те, с соответствующей информацией, он должен работать даже с динамически добавленными элементами.

+0

ОК, поэтому я предполагаю, что делегирование событий имеет какое-то отношение к использованию тела (в отличие от динамически генерируемого div). Поэтому «тело» знает, что его элементы выбора что-то делают с изменениями, и не имеет значения, когда они добавляются. Это верно? ... К сожалению, ваш код не работает для меня. Я скопировал это слово в слово, за исключением того, что я изменил «сделать что-то» на console.log («привет»); но я не мог получить «привет» для регистрации. – Isaac

+0

У вас есть правильная идея. Код, который я вставил, не будет работать, если вы не смотрите на входы с селектором классов, который, как я полагаю, вы не являетесь. Замените «input.selector» на селектор для входов, на которые вы хотите следить за изменениями. – ptd

+0

Извините! Мне пришлось работать над чем-то, что имело более высокий приоритет, прежде чем возвращаться к этому. Я чувствую себя глупо в том, что не знаю, как заменить input.selector. И еще одно: нужно было иметь слушателя внутри $ (document) .ready (function() {}); Сейчас он работает фантастически с моими динамическими частицами. Спасибо! – Isaac

1

Вы можете использовать JQuery, чтобы выполнить код только после того, как документ загружен на DOM:

$(document).ready(function() { 
    //Call your functions here 
}); 

Таким образом, ваш JS будет иметь доступ к все, что на странице, потому что вы обеспечиваете что это полностью загружена.

Если ваши блоки не установлены на готовом документе, вы можете использовать делегирование событий, как это было предложено ptd. В основном это означает, что вы устанавливаете обработчик в родительском div (который будет присутствовать в готовом документе), который гласит: «Эй, когда вы нажимаете на этот динамический div внутри меня, вызывайте эту функцию».

$('div#master').on('click', 'div.dynamic', function(event) { 
    console.log("action here") 
    var $dynamicDiv = $(event.currentTarget) //The current Target is the thing you clicked on, not the parent. 
});  
+0

Это не работает :(Просто попробовал убедиться, что он не работает, чтобы убедиться. Динамически сгенерированные div на самом деле не находятся на странице, когда документ «готов». Они создаются после того, Пользователь нажимает кнопку. – Isaac

+0

Похоже, что у вас уже есть обработчик событий, когда пользователь нажимает кнопку. В то же время вы должны установить другой обработчик событий в div, который вы помещаете на страницу. $ ("div. new_div ") .on (" click ", function() {// установить новый обработчик здесь}) –

+0

Разве это еще не добавит скрипт для каждого обработчика нового div? – Isaac

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