Il mio sito utilizzava jquery.load()
per eseguire la navigazione su una grande porzione della pagina. Ho davvero apprezzato la capacità di solo includere solo una parte specifica del contenuto caricato, qui il div con id = "content":Gli script in esecuzione in jquery.ajax() pagine caricate eseguono document.ready troppo presto
$(frame_selector).load(url +" #content", function(response, status, xhr) {...});
Ma ora ho bisogno di essere in grado di eseguire script che fanno parte delle pagine essere caricato dinamicamente. Jquery.load()
elimina questi script, ma non lo è jquery.ajax()
. Così ho duplicato la funzionalità parziale contenuto di jquery.load
in una chiamata AJAX come tale:
$.ajax({
url: url,
dataType: 'html',
success: function(data, textStatus, XMLHttpRequest) {
// Only include the response within the #content id element.
$(frame_selector).html(jQuery("<div>")
.append(data)
.find("#content")
);
}
});
Il problema è che gli script che vengono dinamicamente caricati dalla chiamata AJAX non sono in esecuzione in modo affidabile. A volte non sembrano avere alcun effetto, forse perché stanno correndo troppo presto. Gli script stanno solo manipolando DOM in jQuery, non facendo affidamento su immagini o flash o su qualcosa che non dovrebbe essere ancora caricato. Per evitare di rimanere bloccato ho questo orribile trucco per far funzionare le cose. Invece dello script AJAX-caricato utilizzando solo:
$(document).ready(function() {...}); // unreliable
ho ritardare l'200ms di script prima di eseguire:
$(document).ready(window.setTimeout(function() {...}, 200)); // HATE THIS
Qualcuno sa come posso fare questo lavoro in modo affidabile senza codificare un ritardo? Sto indovinando che è una condizione di competizione tra il <script>
e la mia logica per caricare #content
in un nuovo div, ma non sono sicuro di cosa fare al riguardo.
È possibile richiedere sincrono per acquisire i dati. – dz1984
Questa è un'idea orribile. L'interfaccia utente del browser verrà bloccata mentre le richieste sincrone sono in esecuzione. –