Najlepsza praktyka korzystania z okna.onload

Rozwijam strony internetowe/komponenty/moduły i wtyczki Joomla i co jakiś czas wymagam możliwości korzystania z JavaScript, który uruchamia zdarzenie, gdy strona jest załadowana. W większości przypadków odbywa się to za pomocą funkcji window.onload.

Moje pytanie brzmi:

  1. czy jest to najlepszy sposób na wywołanie zdarzeń JavaScript podczas ładowania strony, czy jest lepszy / nowszy sposób?
  2. jeśli jest to jedyny sposób na wywołanie zdarzenia podczas ładowania strony, jaki jest najlepszy sposób na upewnienie się że wiele zdarzeń może być uruchamianych przez różne skrypty?
Author: Henrik Paul, 2009-02-18

7 answers

window.onload = function(){}; działa, ale jak zapewne zauważyłeś, pozwala na podanie tylko 1 słuchacza .

Powiedziałbym, że lepszym/nowszym sposobem zrobienia tego byłoby użycie frameworka, lub po prostu użycie prostej implementacji natywnych metod addEventListener i attachEvent (dla IE), które pozwalają usunąć słuchaczy dla zdarzeń, jak również.

Oto implementacja między przeglądarkami:

// 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);

Do okna.zastosowanie przypadku onload: listen("load", window, function() { });


EDIT Chciałbym poszerzyć moją odpowiedź o cenne informacje, na które wskazywali inni.

Tu chodzi o DOMContentLoaded (Mozilla, Opera i webkit nightlies obecnie to obsługują) orazonreadystatechange (dla IE) zdarzenia, które można zastosować do obiektu , aby zrozumieć, kiedy dokument jest dostępny do manipulowania (bez czekania na wszystkie obrazy/arkusze stylów itp.. do załadowania).

Istnieje wiele "hacky" implementacji dla obsługa tego między przeglądarkami, więc zdecydowanie sugeruję użycie frameworka dla tej funkcji.

 44
Author: Luca Matteis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 13:24:57

Okno.zdarzenia onload są nadpisywane na wielu utworach. Aby dodać funkcje Użyj okno.addEventListener (standard W3C) lub okno.attachEvent (dla IE). Użyj poniższego kodu, który zadziałał.

if (window.addEventListener) // W3C standard
{
  window.addEventListener('load', myFunction, false); // NB **not** 'onload'
} 
else if (window.attachEvent) // Microsoft
{
  window.attachEvent('onload', myFunction);
}
 10
Author: Devaroop,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-21 14:24:05

Nowoczesne frameworki javascript wprowadziły ideę zdarzenia "document ready". Jest to zdarzenie, które zostanie wywołane, gdy dokument będzie gotowy do przeprowadzenia na nim manipulacji DOM. Zdarzenie "onload" zostanie wywołane dopiero po załadowaniu wszystkiego na stronie.

Wraz ze zdarzeniem" document ready", frameworki umożliwiły kolejkowanie wielu bitów kodu Javascript i funkcji, które mają być uruchamiane podczas wywołania zdarzenia.

Więc jeśli jesteś przeciwny frameworkom, najlepiej sposobem na to jest wdrożenie własnego dokumentu.Kolejka.

Jeśli nie jesteś przeciwny frameworkom, powinieneś przyjrzeć się jQuery i document.gotowe, Prototype i dom: loaded, Dojo i addOnLoad lub Google dla [your framework] i "document ready",.

Jeśli nie wybrałeś frameworka, ale jesteś zainteresowany, jQuery jest dobrym miejscem na początek. Nie zmienia to żadnej z podstawowych funkcjonalności Javascript i na ogół pozostanie poza twoim sposób i pozwolić ci robić rzeczy, jak chcesz, kiedy chcesz.

 10
Author: Alan Storm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-24 16:41:31

Joomla jest dostarczana z MooTools, więc najłatwiej będzie użyć biblioteki MooTools dla dodatkowego kodu. MooTools jest dostarczany z niestandardowym zdarzeniem o nazwie domready, które jest wywoływane po załadowaniu strony i przetworzeniu drzewa dokumentu.

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

Więcej informacji o MooTools można znaleźć tutaj . Joomla 1.5 jest obecnie dostarczany z MT1.1, Podczas gdy Joomla 1.6 alpha będzie zawierać MT1.2

 2
Author: Arlen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-06-24 19:17:08

Osobiście wolę tę metodę . Nie tylko pozwala na posiadanie wielu funkcji onload, ale jeśli jakiś skrypt zdefiniował ją przed, ta metoda jest wystarczająco ładna, aby sobie z tym poradzić... Jedynym problemem pozostaje, jeśli strona ładuje kilka skryptów, które nie używają funkcji window.addLoad(); ale to jest ich problem :).

P. S. Jego również wielki, jeśli chcesz "łańcucha" więcej funkcji później.

 1
Author: Mike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-18 03:26:57

To jest brudny ale krótszy sposób: P

function load(){
   *code*
}

window[ addEventListener ? 'addEventListener' : 'attachEvent' ]
( addEventListener ? 'load' : 'onload', function(){} )
 1
Author: Aamir Afridi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-14 09:42:53

Ponieważ zawsze dołączam pliki jQuery/bootstrap JS na dole dokumentu i nie mają dostępu do $ nad dokumentem, opracowałem maleńką wtyczkę" init", która jest jednym i jedynym skryptem JS, który dołączam na samej górze moich stron:

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;
    }
};

Za pomocą tego mogę zdefiniować dowolny anonimowy loader nad stroną, przed włączeniem jQuery i bootstrap i upewnić się, że odpali po jQuery:

init.push(function() {

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

    $('[name="keyword_id"]').select2();
});
 0
Author: yergo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-23 09:16:28