Turbolinks ломает jQuery, который используется на нескольких страницах

Я посмотрел на исправления, большинство из них говорят использовать следующее:

var ready;
ready = function() {

// code here

};

$(document).ready(ready);
$(document).on('page:load', ready);

Проблема в том, что на каждой странице, где у меня есть видео html5, я использую jQuery, чтобы включить воспроизведение / паузу кликов со следующим кодом:

$('#support-vid').click(function() {
    $(this).get(0).paused ? $(this).get(0).play() : $(this).get(0).pause();
});

Однако на первой странице видео работает корректно, jQuery выполняется так, как должно быть. Хотя, когда я перехожу на другую страницу, это просто не работает. Я должен сильно обновить, чтобы заставить его функционировать как надо.

Каков наилучший способ справиться с этим?

2 ответа

Этот ответ может иметь решение javascript/jQuery...

Однако проблема заключается в Turbolinks...

Есть два способа пойти в таких сценариях:

1: Не отслеживайте код JavaScript, который определяет желаемое поведение... Итак, где-то в вашем макете, в пределах <body></body> раздел вашего документа, может быть, после <%= yield %> часть, вы могли бы сделать следующее:

<script type="text/javascript" data-turbolinks-eval=true>
    $(function() {
        $('#support-vid').on('click',function() {
            $(this).get(0).paused ? $(this).get(0).play() : $(this).get(0).pause();
        });
    });
</script>

Таким образом, тег script будет вынужден оцениваться при каждой загрузке страницы... data-turbolinks-eval=true поведение по умолчанию для сценариев с неявно установленным типом "text/javascript", так что вам на самом деле не нужно писать это... Однако вы должны написать type="text/javascript",

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

var ready = function() {
// code here
};

$(document).on('ready page:load', ready);

$(document).on('click', '#support-vid', function() {
    var my_element = $(this).get(0);
    my_element.paused ? my_element.play() : my_element.pause();
});

Проблема в том, что когда вы привязываете обработчик событий, как это

$('#support-vid').click(function()

вы привязываете этот обработчик к определенному элементу. Когда турболинки перезагружают страницу, она заменяет все тело и, как следствие, заменяет ваш элемент абсолютно новым элементом с такими же атрибутами, в данном случае идентификатором. И ваш обработчик событий никогда не сработает снова.

Существует два подхода к решению этой проблемы: первый называется "делегирование события", когда ваш обработчик привязывает событие к документу, который никогда не заменял, и использует фильтры, как в коде выше. Второй подход - обработчик события перепривязки на каждом событии готовности страницы и страница турболинков: событие загрузки выглядит так:

var ready = function() {
    // code here
    $('#support-vid').click(function() {
        $(this).get(0).paused ? $(this).get(0).play() : $(this).get(0).pause();
    });
};

$(document).on('ready page:load', ready);
Другие вопросы по тегам