Pratique exemplaire pour l'utilisation de window.onload

je développe des sites Web Joomla / composants / modules et plugins et de temps en temps j'ai besoin de la capacité D'utiliser JavaScript qui déclenche un événement lorsque la page est chargée. La plupart du temps, cela se fait en utilisant le window.onload fonction.

Ma question est:

  1. est-ce la meilleure façon de déclencher des événements JavaScript lors du chargement de la page ou y a-t-il une meilleure/nouvelle façon?
  2. Si c'est le seul moyen de déclencher un événement sur chargement de la page, ce qui est la meilleure façon de s'assurer que plusieurs événements peuvent être exécutés par les différents scripts?
37
demandé sur Henrik Paul 2009-02-18 02:12:34

7 réponses

window.onload = function(){}; fonctionne, mais comme vous l'avez peut-être remarqué, il vous permet de spécifier seulement 1 écouteur.

je dirais que la meilleure / nouvelle façon de faire cela serait d'utiliser un framework, ou tout simplement d'utiliser une implémentation simple du natif addEventListener et attachEvent (pour IE), ce qui vous permet de supprimer les écouteurs pour les événements.

Voici un cross-browser de mise en œuvre:

// Cross-browser implementation of element.addEventListener()
function listen(evnt, elem, func) {
    if (elem.addEventListener)  // W3C DOM
        elem.addEventListener(evnt,func,false);
    else if (elem.attachEvent) { // IE DOM
         var r = elem.attachEvent("on"+evnt, func);
         return r;
    }
    else window.alert('I\'m sorry Dave, I\'m afraid I can\'t do that.');
}

// Use: listen("event name", elem, func);

Pour la fenêtre.case onload utilisation: listen("load", window, function() { });


EDIT j'aimerais développer ma réponse en ajoutant des informations précieuses qui ont été pointées par d'autres.

il s'agit de la DOMContentLoaded (Mozilla, Opera and webkit nightlies support this) et le onreadystatechange (pour IE) événements qui peut être appliqué à la document objet à comprendre lorsque le document est disponible pour être manipulées (sans attendre pour tous les images/feuilles de style, etc.. pour être chargé).

il y a beaucoup d'implémentations "hacky" pour la prise en charge de cette fonctionnalité par les navigateurs croisés, donc je suggère fortement d'utiliser un framework pour cette fonctionnalité.

44
répondu Luca Matteis 2014-01-07 13:24:57

La fenêtre.les événements onload sont annulés sur plusieurs créations. Pour ajouter des fonctions utilisez le fenêtre.addEventListener(standard W3C) ou la fenêtre.attachEvent(pour IE). Utiliser le code suivant qui a fonctionné.

if (window.addEventListener) // W3C standard
{
  window.addEventListener('load', myFunction, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
  window.attachEvent('onload', myFunction);
}
10
répondu Devaroop 2012-08-21 14:24:05

les cadres javascript modernes ont introduit l'idée d'un événement "prêt au document". Il s'agit d'un événement qui se déclenchera lorsque le document sera prêt à subir des manipulations DOM. L'événement "onload" ne se déclenche qu'après que tout le contenu de la page a été chargé.

avec l'événement" document ready", les cadres ont fourni un moyen de mettre en file d'attente plusieurs bits de code Javascript et des fonctions à exécuter lorsque l'événement déclenche.

Donc, si vous êtes opposés à Cadres, la meilleure façon de procéder est de mettre en œuvre votre propre document.onload de la file d'attente.

si vous n'êtes pas opposé à frameworks, alors vous voudrez regarder dans jQuery et document.prêt,Prototype et dom:loaded, Dojo et addOnLoad ou Google pour [votre framework] et"document ready",.

si vous n'avez pas choisi de cadre mais que vous êtes intéressé, jQuery est un bon point de départ. Cela ne change rien au noyau de Javascript fonctionnalité, et restera généralement hors de votre chemin et vous permettra de faire les choses comme vous le souhaitez lorsque vous le souhaitez.

10
répondu Alan Storm 2014-04-24 16:41:31

Joomla est livré avec MooTools, donc vous trouverez plus facile d'utiliser la bibliothèque MooTools pour votre code supplémentaire. MooTools est livré avec un événement personnalisé appelé domready qui démarre lorsque la page est chargée et que l'arborescence des documents est analysée.

window.addEvent( domready, function() { code to execute on load here } );

Plus d'informations sur MooTools peuvent être trouvées ici. Joomla 1.5 actuellement navires avec MT1.1 tandis que la Joomla 1.6 alpha inclura MT1.2

2
répondu Arlen 2009-06-24 19:17:08

Personnellement, je préfère cette méthode. Non seulement il vous permet d'avoir plusieurs onload fonctions, mais si certains script a défini avant vous avez obtenu, cette méthode est assez agréable à manipuler... Le seul problème est qu'une page charge plusieurs scripts qui n'utilisent pas le window.addLoad() function; mais c'est leur problème :).

P. S. il est également idéale si vous voulez "chaîne" en plus de fonctions plus tard.

1
répondu Mike 2009-02-18 03:26:57

C'est le chemin sale mais plus court :P

function load(){
   *code*
}

window[ addEventListener ? 'addEventListener' : 'attachEvent' ]
( addEventListener ? 'load' : 'onload', function(){} )
1
répondu Aamir Afridi 2012-09-14 09:42:53

à partir de je toujours inclure jQuery / bootstrap fichiers JS sur le bas du document et n'ont pas d'accès à $ sur le document, j'ai développé un petit plugin" init " qui est un seul et unique script JS que j'ai inclus en haut de mes pages:

window.init = new function() {
    var list = [];

    this.push = function(callback) {
        if (typeof window.jQuery !== "undefined") {
            callback();
        } else {
            list.push(callback);
        }
    };

    this.run = function() {

        if (typeof window.jQuery !== "undefined") {
            for(var i in list) {
                try {
                    list[i]();
                } catch (ex) {
                    console.error(ex);
                }
            }
            list = [];
        }
    };

    if (window.addEventListener) {
        window.addEventListener("load", this.run, false);
    } else if (window.attachEvent) {
        window.attachEvent("onload", this.run);
    } else {
        if (window.onload && window.onload !== this.run) {
            this.push(window.onload);
        }
        window.onload = this.run;
    }
};

en utilisant ceci je peux définir n'importe quel chargeur anonyme sur la page, avant l'inclusion de jQuery et bootstrap et rester sûr qu'il va tirer une fois que jQuery est présent:

init.push(function() {

    $('[name="date"]').datepicker({
        endDate: '0d',
        format: 'yyyy-mm-dd',
        autoclose: true
    }).on('hide', function() {
        // $.ajax
    });

    $('[name="keyword_id"]').select2();
});
0
répondu yergo 2015-10-23 09:16:28