Могу ли я вызвать $ (document) .ready (), чтобы заново активировать все обработчики событий загрузки? - PullRequest
38 голосов
/ 21 августа 2011

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

В настоящее время я пытаюсь заменить большой блок 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)?

Ответы [ 10 ]

37 голосов
/ 21 августа 2011

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

jQuery.ready();

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

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

29 голосов
/ 09 октября 2013

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

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

function onPageLoad(){
  // All commands here
}

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

12 голосов
/ 21 августа 2011

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

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

Затем добавьте это:

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

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

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

[Изменить]

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

Однако, если вы не хотите использовать это, важно, чтобы вы добавили этот скрипт сразу после того, как включили 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. -->
5 голосов
/ 21 августа 2011

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

// Trigger any bound ready events
if ( jQuery.fn.trigger ) {
    jQuery( document ).trigger( "ready" ).unbind( "ready" );
}
3 голосов
/ 18 января 2018

Вы можете активировать документ. Уже во второй раз, если вы измените весь контент тела:

$('body').html($('body').html())
2 голосов
/ 28 марта 2016

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

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

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

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

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

затем после действия ajax просто позвоните

REinit();
2 голосов
/ 27 апреля 2014

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

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

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

Кому:

$(document).on('ready pjax:success', function() {
    // will fire on initial page load, and subsequent PJAX page loads
});
1 голос
/ 04 июля 2016

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

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

0 голосов
/ 15 января 2019

У меня просто была проблема, что мой ajax код только работал, если он вызывался $(document).ready(function(){});, а не в обычной функции, поэтому я не мог обернуть его.
Код был о загрузке части моей страницы, и из-за некоторых ошибок загрузки я хотел, чтобы он вызывался снова после timeout.

Я обнаружил, что код не должен быть в $(document).ready(function(){});, но может быть запущен им, а также может вызываться сам по себе .

Итак, после того, как я прочитал много решений с разных страниц, я смешал этот код:


$(document).ready(loadStuff);   

function loadStuff(){   
    $.ajax({
        type: "POST",
        url: "path/to/ajax.php",
        data: { some: data, action: "setContent"},
        timeout: 1000, //only one second, for a short loading time
        error: function(){ 
            console.log("An error occured. The div will reload.");
            loadStuff(); 
        },
        success: function(){
            $("#divid").load("path/to/template.php"); //div gets filled with template
        }
    });
}
0 голосов
/ 31 августа 2018

Или попробуйте это:

jQuery.extend ({

    document_ready: function (value) {
        $(document).ready (value);
        $(document).ajaxComplete (value);
    }/* document_ready */

});

И вместо определения функции, говоря:

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

говорят:

jQuery.document_ready (function () { blah blah blah });

Пояснение:

Любая функция, загруженная в «document_ready», будет автоматически загружена как в «$ (document) .ready ()», так и в «$ (document) .ajaxComplete ()» и будет запускаться при обоих обстоятельствах.

...