В идеале ваши сценарии должны быть предварительно упакованы и объединены в один файл, чтобы избежать нескольких HTTP-запросов. Вместо того, чтобы полагаться на загрузку определенного набора JavaScript на определенной странице c, вы можете просто добавить атрибут или класс данных к элементу body и использовать его для переключения вашего поведения. Это не только лучше для производительности, но и позволит избежать проблем, связанных с турболинками и постоянным сеансом браузера при посещении страницы. поддерживается в течение некоторого времени, но я решил это, в основном выполнив:
<body data-action="<%= action_name %>" data-controller="<%= controller_name %>">
$(document).on('turbolinks:load', function(){
let data = $('body').data();
// pagescript: is just the namespace for the events to avoid potential name collisions
// Use whatever you want instead
$(document).trigger('pagescript:' + data.controller + '#' + data.action, data)
.trigger('pagescript:' + data.controller + '#*', data)
.trigger('pagescript:' + '*#' + data.action , data);
});
Это вызывает набор пользовательских событий при каждом изменении страницы. Вы можете добавить прослушиватели событий для прослушивания определенных c страниц или действий:
// A specific controller_name and action
$(document).on('pagescript:controller_name#action_name', (e) => { });
// Any action belonging to a specific controller
$(document).on('pagescript:controller_name#*', (e) => { });
// Any action matching action_name
$(document).on('pagescript:*#action_name', (e) => { });
Например:
$(document).on('pagescript:users#new', (e) => {
alert("Welcome new user!");
});
Но эту проблему также можно решить с помощью лучшего дизайна кода. Подумайте о модулях, которые можно использовать для улучшения поведения на любой странице, вместо того, чтобы писать код, улучшающий этот c doodad на указанной c странице.