Quelles sont les différences entre JavaScript window.onload
et la méthode de jQuery $(document).ready()
?
L'événement ready
se produit après le chargement du document HTML, tandis que l'événement onload
se produit plus tard, lorsque tout le contenu (par exemple, des images) a également été chargé.
L'événement onload
est un événement standard dans le DOM, tandis que l'événement ready
est spécifique à jQuery. Le but de l'événement ready
est qu'il se produise le plus tôt possible après le chargement du document, de sorte que le code qui ajoute une fonctionnalité aux éléments de la page n'ait pas à attendre que tout le contenu soit chargé.
window.onload
est l'événement JavaScript intégré, mais son implémentation avait de subtiles particularités des navigateurs (Firefox, Internet Explorer 6, Internet Explorer 8). , et Opera ), jQuery fournit document.ready
, qui les résume, et se déclenche dès que le DOM de la page est prêt (n'attend pas d'images, etc.).
$(document).ready
(notez que c'est pas document.ready
, qui n'est pas défini) est une fonction jQuery, qui enveloppe et fournit cohérence avec les événements suivants:
document.ondomcontentready
/document.ondomcontentloaded
- un événement newish qui se déclenche lorsque le DOM du document est chargé (ce qui peut prendre un certain temps avant les images , etc. sont chargés); encore une fois, légèrement différent dans Internet Explorer et dans le reste du mondewindow.onload
(qui est mis en œuvre même dans les anciens navigateurs), qui se déclenche lorsque la page entière est chargée (images, styles, etc.)$(document).ready()
est un événement jQuery. La méthode $(document).ready()
de JQuery est appelée dès que le DOM est prêt (ce qui signifie que le navigateur a analysé le code HTML et construit l'arborescence DOM). Cela vous permet d'exécuter du code dès que le document est prêt à être manipulé.
Par exemple, si un navigateur prend en charge l'événement DOMContentLoaded (comme le font de nombreux navigateurs non IE), il se déclenchera alors sur cet événement. (Notez que l'événement DOMContentLoaded n'a été ajouté qu'à IE dans IE9 +.)
Deux syntaxes peuvent être utilisées pour cela:
$( document ).ready(function() {
console.log( "ready!" );
});
Ou la version abrégée:
$(function() {
console.log( "ready!" );
});
Points principaux pour $(document).ready()
:
$
par jQuery
lorsque vous recevez "$ n'est pas défini."$(window).load()
à la place.window.onload()
est une fonction JavaScript native. L'événement window.onload()
se déclenche lorsque tout le contenu de votre page a été chargé, y compris le DOM (modèle d'objet document), les bannières publicitaires et les images. Une autre différence entre les deux est que, bien que nous puissions avoir plus d'une fonction $(document).ready()
, nous ne pouvons avoir qu'une seule fonction onload
.
Un événement de chargement Windows se déclenche lorsque tout le contenu de votre page est entièrement chargé, y compris le contenu DOM (modèle d'objet de document) et JavaScript asynchrone, cadres et images . Vous pouvez également utiliser body onload =. Les deux sont les mêmes; window.onload = function(){}
et <body onload="func();">
sont différentes manières d'utiliser le même événement.
jQuery $document.ready
L'événement de fonction s'exécute un peu plus tôt que window.onload
et est appelé une fois que le DOM (modèle d'objet de document) est chargé sur ta page. Il n'attendra pas que les images , les cadres, soient complètement chargés .
Tiré de l'article suivant: en quoi $document.ready()
est différent de window.onload()
Avertissement concernant l’utilisation de $(document).ready()
avec Internet Explorer. Si une requête HTTP est interrompue avant tout le document est chargé (par exemple, lorsqu'une page est en streaming sur le navigateur, un autre lien est cliqué) IE déclenchera la $(document).ready
un événement.
Si un code de l'événement $(document).ready()
fait référence à des objets DOM, il est possible que ces objets soient introuvables, et des erreurs Javascript peuvent se produire. Protégez vos références à ces objets ou ajustez le code qui référence ces objets à l'événement window.load.
Je n'ai pas été en mesure de reproduire ce problème dans d'autres navigateurs (en particulier Chrome et Firefox).
$(document).ready(function() {
// Executes when the HTML document is loaded and the DOM is ready
alert("Document is ready");
});
// .load() method deprecated from jQuery 1.8 onward
$(window).on("load", function() {
// Executes when complete page is fully loaded, including
// all frames, objects and images
alert("Window is loaded");
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
$(document).on('ready', handler)
se lie à l'événement ready de jQuery. Le gestionnaire est appelé lorsque le DOM est chargé . Des ressources telles que des images sont peut-être toujours manquantes . Il ne sera jamais appelé si le document est prêt au moment de la reliure. jQuery utilise l'événement DOMContentLoaded - pour cela, en l'émulant s'il n'est pas disponible.
$(document).on('load', handler)
est un événement qui sera déclenché une fois que toutes les ressources sont chargées à partir du serveur. Les images sont chargées maintenant. Alors que onload est un événement HTML brut, ready est construit par jQuery.
$(document).ready(handler)
est en fait un promesse . Le gestionnaire sera appelé immédiatement si le document est prêt au moment de l'appel. Sinon, il est lié à l'événement ready
-.
Avant jQuery 1.8 , $(document).load(handler)
existait comme alias de $(document).on('load',handler)
.
toujours utilisez le window.addEventListener
pour ajouter un événement à la fenêtre. Parce que de cette façon, vous pouvez exécuter le code dans différents gestionnaires d’événements.
Code correct:
window.addEventListener('load', function () {
alert('Hello!')
})
window.addEventListener('load', function () {
alert('Bye!')
})
Code non valide:
window.onload = function () {
alert('Hello!') // it will not work!!!
}
window.onload = function () {
alert('Bye!')
}
En effet, onload est simplement la propriété de l'objet, qui est écrasé.
Par analogie avec addEventListener
, il est préférable d'utiliser $(document).ready()
plutôt que de se charger.
La $(document).ready()
est un événement jQuery qui se produit lorsque le document HTML a été entièrement chargé, tandis que l'événement window.onload
se produit plus tard. quand tout y compris les images sur la page chargée.
Window.onload est également un événement javascript pur dans le DOM, tandis que l'événement $(document).ready()
est une méthode dans jQuery.
$(document).ready()
est généralement le wrapper de jQuery pour s'assurer que tous les éléments chargés seront utilisés dans jQuery ...
Regardez le code source de jQuery pour comprendre son fonctionnement:
jQuery.ready.promise = function( obj ) {
if ( !readyList ) {
readyList = jQuery.Deferred();
// Catch cases where $(document).ready() is called after the browser event has already occurred.
// we once tried to use readyState "interactive" here, but it caused issues like the one
// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
if ( document.readyState === "complete" ) {
// Handle it asynchronously to allow scripts the opportunity to delay ready
setTimeout( jQuery.ready );
// Standards-based browsers support DOMContentLoaded
} else if ( document.addEventListener ) {
// Use the handy event callback
document.addEventListener( "DOMContentLoaded", completed, false );
// A fallback to window.onload, that will always work
window.addEventListener( "load", completed, false );
// If IE event model is used
} else {
// Ensure firing before onload, maybe late but safe also for iframes
document.attachEvent( "onreadystatechange", completed );
// A fallback to window.onload, that will always work
window.attachEvent( "onload", completed );
// If IE and not a frame
// continually check to see if the document is ready
var top = false;
try {
top = window.frameElement == null && document.documentElement;
} catch(e) {}
if ( top && top.doScroll ) {
(function doScrollCheck() {
if ( !jQuery.isReady ) {
try {
// Use the trick by Diego Perini
// http://javascript.nwbox.com/IEContentLoaded/
top.doScroll("left");
} catch(e) {
return setTimeout( doScrollCheck, 50 );
}
// detach all dom ready events
detach();
// and execute any waiting functions
jQuery.ready();
}
})();
}
}
}
return readyList.promise( obj );
};
jQuery.fn.ready = function( fn ) {
// Add the callback
jQuery.ready.promise().done( fn );
return this;
};
Aussi, j'ai créé l'image ci-dessous comme une référence rapide pour les deux:
window.onload: Un événement JavaScript normal.
document.ready: Un événement jQuery spécifique lorsque l'ensemble du code HTML a été chargé.
Une chose à retenir (ou devrais-je dire rappel) est que vous ne pouvez pas empiler onload
comme vous pouvez avec ready
. En d'autres termes, la magie jQuery autorise plusieurs ready
s sur la même page, mais vous ne pouvez pas le faire avec onload
.
Le dernier onload
annulera tout précédent onload
s.
Une bonne façon de gérer cela consiste à utiliser une fonction apparemment écrite par un certain Simon Willison et décrite dans tilisation de plusieurs fonctions JavaScript Onload .
function addLoadEvent(func) {
var oldonload = window.onload;
if (typeof window.onload != 'function') {
window.onload = func;
}
else {
window.onload = function() {
if (oldonload) {
oldonload();
}
func();
}
}
}
// Example use:
addLoadEvent(nameOfSomeFunctionToRunOnPageLoad);
addLoadEvent(function() {
/* More code to run on page load */
});
Document.ready
(un événement jQuery) se déclenchera lorsque tous les éléments seront en place. Ils pourront être référencés dans le code JavaScript, mais le contenu ne sera pas nécessairement chargé. Document.ready
s'exécute lorsque le document HTML est chargé.
$(document).ready(function() {
// Code to be executed
alert("Document is ready");
});
Le window.load
attendra toutefois que la page soit entièrement chargée. Cela inclut les cadres internes, les images, etc.
$(window).load(function() {
//Fires when the page is loaded completely
alert("window is loaded");
});
L'événement document.ready se produit lorsque le document HTML a été chargé et l'événement window.onload
se produit toujours plus tard, lorsque tout le contenu (images, etc.) a été chargé.
Vous pouvez utiliser l'événement document.ready
si vous souhaitez intervenir "tôt" dans le processus de rendu, sans attendre le chargement des images. Si vous avez besoin que les images (ou tout autre "contenu") soient prêtes avant que votre script "fasse quelque chose", vous devez attendre jusqu'à window.onload
.
Par exemple, si vous implémentez un motif "Diaporama" et que vous devez effectuer des calculs en fonction de la taille de l'image, vous pouvez attendre jusqu'à window.onload
. Sinon, vous pourriez rencontrer des problèmes aléatoires, en fonction de la vitesse de chargement des images. Votre script serait exécuté simultanément avec le fil qui charge les images. Si votre script est suffisamment long ou que le serveur est assez rapide, vous ne remarquerez peut-être pas de problème si les images arrivent à temps. Mais la pratique la plus sûre serait de permettre aux images d’être chargées.
document.ready
pourrait être un événement agréable pour vous de montrer un signe de "chargement ..." aux utilisateurs, puis sur window.onload
, vous pouvez terminer tous les scripts nécessitant le chargement de ressources, puis supprimer le "Chargement ..." signe.
Exemples :-
// document ready events
$(document).ready(function(){
alert("document is ready..");
})
// using JQuery
$(function(){
alert("document is ready..");
})
// window on load event
function myFunction(){
alert("window is loaded..");
}
window.onload = myFunction;
window.onload
est une fonction JavaScript intégrée. window.onload
déclenche lorsque la page HTML est chargée. window.onload
ne peut être écrit qu'une seule fois.
document.ready
est une fonction de la bibliothèque jQuery. document.ready
se déclenche lorsque HTML et tous les codes JavaScript, CSS et images inclus dans le fichier HTML sont complètement chargés. document.ready
peut être écrit plusieurs fois en fonction des besoins.
Lorsque vous dites $(document).ready(f)
, vous indiquez au moteur de script de procéder comme suit:
$
et sélectionnez-le. Comme il ne fait pas partie de la portée locale, il doit effectuer une recherche dans la table de hachage, ce qui peut entraîner des conflits ou non.ready
de l'objet sélectionné, ce qui implique une autre recherche de table de hachage dans l'objet sélectionné pour rechercher la méthode et l'appeler.Dans le meilleur des cas, il s'agit de 2 recherches dans une table de hachage, mais cela ne tient pas compte du travail lourd effectué par jQuery, où $
est l'évier de la cuisine de toutes les entrées possibles de jQuery. Il est donc probable qu'une autre carte envoie la requête gestionnaire correct.
Alternativement, vous pouvez faire ceci:
window.onload = function() {...}
qui va
onload
est une propriété ou non en effectuant une recherche dans une table de hachage, puisque c'est le cas, elle s'appelle comme une fonction.Dans le meilleur des cas, cela coûte une seule recherche dans la table de hachage, ce qui est nécessaire car onload
doit être récupéré.
Idéalement, jQuery compilerait leurs requêtes en chaînes pouvant être collées pour faire ce que vous souhaitiez que jQuery fasse, mais sans la répartition à l'exécution de jQuery. De cette façon, vous avez le choix entre
eval
.Prenons un scénario dans lequel vous avez deux vues partielles dans la page d'index.
Exemple
<div id="ReportHere" class="container-fluid">
@Html.Action("ProjectAbc", "ProjectSalesVolume", new { reportType = "Projected Sales Volume", region = "Karachi", sector = "All" })
</div>
@Html.Action("AbcFilters", "ProjectSalesVolume")
Maintenant, la page action de ProjectAbc contient un script dans la fonction window.onload
Exemple Graphique
window.onload = function () {
debugger;
var chart = new CanvasJS.Chart("chartContainer", {
animationEnabled: true,
theme: "light2", // "light1", "light2", "dark1", "dark2"
title: {
text: '@(Model.topTitleChart)'
},
axisY: {
title: '@(Model.leftTitleChart)'
},
data: [{
type: "column",
indexLabel: "{y}",
indexLabelPlacement:"inside",
dataPoints: @Html.Raw(Model.dataPoints)
}]
});
chart.render();
}
et l'action a une vue partielle de type retour.
return PartialView("ProjectAbc", model);
Et la page de filtre a été rappelée à nouveau à ProjectAbc
Exemple
@using (Ajax.BeginForm("ProjectAbc", new AjaxOptions { HttpMethod = "Post" }))
{
//property binding here
<input type="submit" value="filter"/>
}
Maintenant, après le chargement de la page pour la toute première fois, lorsque vous frappez le filtre depuis la vue du filtre (rendu avec ProjectAbc dans la page d'index), la méthode située dans window.onload ne sera pas appelée. Dans ce scénario, nous avons donc besoin de document.ready car window.onload est appelé une seule fois lors de l'actualisation de la page