Подтвердить что ты не робот

Можно ли вызвать $(document).ready() для повторного активации всех обработчиков событий загрузки?

Кто-нибудь знает, ЕСЛИ И КАК Я мог бы повторно вызвать все обработчики событий on-load? Я ссылаюсь на некоторые .js файлы, над которыми у меня нет контроля, и эти .js-библиотеки выполняют свою инициализацию в $(document).ready() и, к сожалению, не предоставляют никакой простой функции для повторной инициализации.

В настоящее время я пытаюсь заменить большой блок div содержимым на вызов ajax, и поэтому мне нужно повторно инициализировать внешние библиотеки. Поэтому было бы просто просто вызвать $(document).ready(), чтобы повторно инициализировать ВСЕ.

До сих пор я пробовал это при вызове ajax:

success: function(data) {
    alert('1'); // Displays '1'
    $('#content').html(data);
    alert('2'); // Displays '2'
    $(document).ready();
    alert('3'); // Does not display
}

Вызов $(document).ready(); также терпит неудачу. Консоль JavaScript не показывает ошибок. Кто-нибудь знает, возможно ли это (без изменения файлов библиотеки javascript)?

4b9b3361

Ответ 1

Поскольку вы спросили, как это сделать, не изменяя внешние JS файлы, я отвечу именно так. Я проследил через функцию .ready() в jQuery в отладчике, и оказалось, что корневая функция, вызываемая при готовности страницы, такова:

jQuery.ready();

Но, похоже, вы не можете просто называть его еще раз, чтобы выполнить то, что хотите, потому что кажется, что когда он срабатывает в первый раз, он отвязывает функции, которые ранее были зарегистрированы (например, забыли их). Таким образом, вызов jQuery.ready() вручную второй раз не перезапускает одни и те же вызовы функций снова, и я проверил, что в отладчике (точка останова была удалена только один раз, а не второй раз).

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

Ответ 2

Я сделал что-то вроде:

// When document is ready...
$(function(){
    onPageLoad();
});

function onPageLoad(){
  // All commands here
}

Теперь я могу вызвать эту функцию в любое время.

Ответ 3

Простой способ добиться этого - это просто придумать свое собственное событие следующим образом:

$(document).bind('_page_ready', function() { /* do your stuff here */});

Затем добавьте следующее:

$(function() { $(document).fire('_page_ready'); }); // shorthand for document.ready

И последнее, когда вам нужно снова запустить его, вы просто вызываете это:

$(document).fire('_page_ready');

[изменить]

Если вы действительно не можете редактировать внешние script файлы, я сделал jsFiddle, который делает то, что вы хотите сделать возможным, вы можете посмотреть здесь код: http://jsfiddle.net/5dRxh/

Однако, если вы не хотите использовать это, важно добавить этот script ПРАВОЙ ПОСЛЕ того, как вы включите jQuery, например:

<script src="jquery.js" type="text/javascript"></script>
<script>
    //script from jsFiddle (only the plugin part at the top).
</script>
<!-- All the other script-files you want to include. -->

Ответ 4

Я не думаю, что это можно сделать, поскольку jquery отключает готовое событие после его выполнения. Из источника:

// Trigger any bound ready events
if ( jQuery.fn.trigger ) {
    jQuery( document ).trigger( "ready" ).unbind( "ready" );
}

Ответ 5

Вы можете сделать это просто.

Сделайте функцию:

function REinit() {
        /// PLACE HERE ALL YOUR DOC.READY SCRIPTS
}

Поместите только функцию Reinit() внутри doc.ready:

$(document).ready(function(){
    REinit();
});

то после действия ajax просто вызовите

REinit();

Ответ 6

Я думаю, что просто изменить событие готовности на успех pjax

Измените его:

$(document).ready(function() {
    // page load stuff
});

To:

$(document).on('ready pjax:success', function() {
    // will fire on initial page load, and subsequent PJAX page loads
});

Ответ 7

Это будет то, что вы хотите, просто держите готовое событие, пока вы не будете готовы.

https://api.jquery.com/jquery.holdready/