Puedo llamar $(document).ready() para reactivar todos los controladores de eventos en carga?


¿Alguien sabe SI y CÓMO podría volver a llamar a todos los controladores de eventos en carga? Estoy haciendo referencia a algunos .archivos js sobre los que NO tengo control, y estos .las bibliotecas js hacen su inicialización en document (document).ready (), y desafortunadamente no proporcionan ninguna función fácil de reiniciar.

Actualmente estoy tratando de reemplazar un bloque div grande con contenido de una llamada ajax, por lo que tengo que volver a inicializar las bibliotecas externas. Por lo tanto, sería bueno llamar just(documento).ready() in para reiniciar TODO.

Hasta ahora, he intentado esto en la llamada ajax:

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

Llamar a $(document).ready(); también falla silenciosamente. La consola JavaScript no muestra errores. ¿Alguien sabe si esto es posible (sin modificar los archivos de la biblioteca javascript)?

Author: Mike Richards, 2011-08-21

9 answers

Ya que me preguntó cómo hacerlo sin modificar los archivos JS externos, responderé de esa manera. He rastreado a través de la función .ready() en jQuery en el depurador y parece que la función raíz que se llama cuando la página está lista es esta:

jQuery.ready();

Pero, parece que no puede simplemente llamarlo de nuevo para lograr lo que desea porque parece que cuando se dispara la primera vez, se desvincula de las funciones que se registraron previamente (por ejemplo, olvidarlas). Como tal, llamar a jQuery.ready() manualmente una segunda vez no vuelve a activar las mismas llamadas de función de nuevo y lo comprobé en el depurador (el punto de interrupción solo se golpeó una vez, no la segunda vez).

Por lo tanto, parece que no puede resolver este problema sin cambiar la implementación de jQuery para que no se desvincule (para permitir varios disparos) o cambiar cada pieza de código de controlador listo para usar sus propios eventos que puede disparar tantas veces como desee.

 36
Author: jfriend00,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-21 01:44:31

Hice algo como:

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

function onPageLoad(){
  // All commands here
}

Ahora puedo llamar a esta función en cualquier momento que necesite.

 25
Author: Fabio Nolasco,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-09 17:34:44

Una forma sencilla de lograr esto es simplemente inventar su propio evento como este:

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

Luego agrega esto:

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

Y por último, cada vez que necesite ejecutarlo de nuevo, simplemente llame a esto:

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

[Editar]

Si realmente no puede editar los archivos de script externos, he creado un jsFiddle que hace posible lo que desea hacer, puede echar un vistazo al código aquí: http://jsfiddle.net/5dRxh /

Sin embargo, si no quieres usar esto, es importante que añadas este script JUSTO DESPUÉS de incluir jQuery, así:

<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. -->
 12
Author: Alxandr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-21 02:06:15

No creo que esto se pueda hacer ya que jquery desenlaza el evento ready después de que se ejecuta. De la fuente:

// Trigger any bound ready events
if ( jQuery.fn.trigger ) {
    jQuery( document ).trigger( "ready" ).unbind( "ready" );
}
 4
Author: natedavisolds,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-21 02:12:07

Creo que es sencillo cambiar el evento ready a pjax success

Cámbialo de:

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

A:

$(document).on('ready pjax:success', function() {
    // will fire on initial page load, and subsequent PJAX page loads
});
 1
Author: Islam Wazery,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-27 14:43:14

Usted puede hacer esto simple.

Hacer una función:

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

Coloque solo la función Reinit() dentro de doc.listo:

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

Luego, después de una acción ajax, simplemente llame

REinit();
 1
Author: catalin87,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-27 21:42:34

Esto será lo que quieres, solo mantén el evento listo hasta que estés realmente listo.

Https://api.jquery.com/jquery.holdready /

 1
Author: Lomax,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-04 15:18:28

Puede activar el documento.listo segunda vez si cambia todo el contenido del cuerpo:

$('body').html($('body').html())
 1
Author: zoberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 23:15:54

O, prueba esto:

jQuery.extend ({

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

});

Y en lugar de definir una función diciendo:

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

Di:

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

Explicación:

Cualquier función cargada en "document_ready" se cargará automáticamente en "document(document).ready () " y " document (documento).ajaxComplete () " y se disparará bajo ambas circunstancias.

 0
Author: rexthestrange,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-31 13:54:08