#javascript #jquery #ruby-on-rails
#javascript #jquery #ruby-on-rails
Вопрос:
я пытаюсь переместить мой javascipt со страницы просмотра, где он работает, в файл assets / javascripts. Однако, когда я выполняю перемещение, javascript больше не выполняется. Я не уверен, почему?
$('.dropbtn').click(function(){
if($(this).hasClass("active") ) {
$(this).parent(".dropdown").find('.dropdown-content').removeClass('show');
$(this).removeClass('active');
}
else{
$('.dropdown-content').removeClass('show');
$(this).parent(".dropdown").find('.dropdown-content').addClass('show');
$(this).addClass('active');
}
});
Комментарии:
1. Я бы предположил, что это потому, что он больше не включается на страницу. Итак, я не думаю, что нам нужен ваш код JavaScript здесь — если он работал до перемещения, но не после , то код JS не виноват — это перемещение нарушило его, и мы должны выяснить, почему файлы не были включены должным образом.
2. Вы используете javascript непосредственно в,
html
не используя<script>
тег3. @MaheerAli нет, я не. Я переместил его в свой собственный файл .js, но он все еще не работает
4. @VLAZ есть предложения?
5. @b.herring нет, не зная, как файлы должны быть включены. И поскольку я на самом деле недостаточно знаю о том, как Rails все собирает и объединяет, я сомневаюсь, что смогу помочь. Но другие разработчики ROR, вероятно, могли бы — я предполагаю, что им понадобятся подробности о том, как включаются ваши файлы. Прошло слишком много времени с тех пор, как я занимался своей крошечной разработкой на Ruby on Rails, поэтому я не могу вспомнить, что бы это могло быть. Но это должно быть что-то вроде выдержки из конфигурационных файлов для этого проекта.
Ответ №1:
Если ваш файл Javascript включен в конвейер ресурсов, он будет объединен, уменьшен и предварительно обработан в один большой файл .js, который включен — по умолчанию — в ваш макет <head>
. К тому времени, когда браузер читает этот файл, элемент dom, связанный с .dropbtn
классом, еще не загружен, поэтому click
прослушиватель событий никогда не добавляется.
Решением было бы поместить ваш код внутрь функции, которая вызывается после загрузки документа:
$(document).ready(function(){
// your code goes here.
});
Однако, если вы используете turbolinks (который включен по умолчанию в rails), вам необходимо использовать:
$(document).on('turbolinks:load', function(){
// your code goes here.
});
Причина этого в том, что после загрузки документа turbolinks обновит его вместо перезагрузки после каждого запроса, поэтому $(document).ready()
будет запускаться только один раз, в то время как 'turbolinks:load'
будет запускаться каждый раз, когда turbolinks загружает содержимое в ваше приложение.
Комментарии:
1. спасибо за ваш ответ. Похоже, что при добавлении вашего кода в мой происходит синтаксическая ошибка. Он выделяет последнюю
));
часть вашего кода розовым цветом. Я пытался что-то удалить, но не могу исправить.2. Да, вы правы. Я пропустил скобки, но я обновил ответ!