2010-02-16 9 views
9

niedawno wpadłem na następujący problem:Czy istnieje + = dla window.onload w JavaScript?

W mojej stronie internetowej na wszystkich stronach html nazywam funkcję zdarzenia onload ciała:

<body onLoad="func1();"> 

To jest część mojego szablonu HTML, więc pojawia się na każdej stronie mojej witryny i nie mogę tego zmienić. Teraz chodzi o to, że na niektórych stronach muszę wywoływać dodatkowe funkcje i próbowałem z właściwości window.onload, ale zmywa wywołanie func1 ...

Teraz mogę powiedzieć:

window.onload = func2(); //where func2() calls to func1() 

ale wydaje się to brudne i kulawy? Czyż nie?

Czy istnieje sposób dodania niektórych funkcji do tych, które mają zostać wykonane, bez usuwania starego? Ponadto używam asp.net, jeśli mogłoby to pomóc ...

Dzięki!

+0

To, co widzę w odpowiedziach, to że jquery jest prawdopodobnie najlepszym z możliwych. Lub możemy poszukać brudnych sztuczek i hacków. – anthares

+2

Nie sądzę, że metoda "anonimowych funkcji" to "brudna sztuczka lub włamanie". Jest całkiem zgrabny ... i wykorzystuje jedną z najpotężniejszych funkcji JavaScript. –

+0

Zgadzam się, to także dobra alternatywa. – anthares

Odpowiedz

19

Możesz użyć jQuery do łańcucha na mechanizmach ładujących. Wielokrotne używanie jQuery.load lub jQuery(document).ready będzie łączyć twoje programy obsługi (jak sądzę). Inną opcją jest programowanie, co oznacza, że ​​potrzebujesz funkcji pomocniczej, która połączy twoje programy obsługi ładowania. Można to zrobić z zamknięciem (lub funkcji anonimowej):

var addOnLoadHandler = function(newHandler) { 

    if (typeof window.onload != 'function') { 
     window.onload = newHandler; 
    } 

    else { 
     var oldHandler = window.onload; 
     window.onload = function() { 
      if (oldHandler) { 
       oldHandler(); 
      } 
      newHandler(); 
     }; 
    } 
}; 

trzeba będzie powiązać funkcje programowo choć, więc trzeba by zrobić:

addOnLoadHandlers(function() { 
alert("Hi I am the first onLoad handler!"); 
}); 

addOnLoadHandlers(function() { 
alert("Hi I am the second onLoad handler!"); 
}); 

w pliku JavaScript (lub w twoim pliku html).

Innym podejściem jest użycie tablicy:

var onloaders = new Array(); 

function runOnLoads() { 
    for (i = 0; i < onloaders.length; i++) { 
     try { 
      var handler = onloaders[i]; 
      handler(); 
     } catch(error) { 
      alert(error.message); 
     } 
    } 
} 

function addLoader(obj) { 
    onloaders[onloaders.length] = obj; 
} 

w HTML lub pliku JavaScript zrobić:

addLoader(function() { 
alert("Hi I am the first onLoad handler!"); 
}); 

addLoader(function() { 
alert("Hi I am the second onLoad handler!"); 
}); 

Następnie w HTML można po prostu zrobić <body onload="runOnLoads()">

3

czy za javascript library jak jQuery, wiem, że istnieją inne sposoby, ale jQuery uczyni Twoje życie o wiele łatwiejsze ...

$(function(){ 
    //Do stuff when DOM is loaded. 
    func1(); 
    $('#link').click(function(){ 
     //bind a click event 
    }); 
}); 

Klasycznym rozwiązaniem jest po prostu trzymać wszystkich swoich funkcji na dole strony :)

+0

OK, ale niektóre z funkcji, które chcę wywołać na każdej stronie, a niektóre tylko na niektórych określonych stronach. A kiedy mówię "na każdym" stronie, chcę napisać to w jednym miejscu. Jak jquery mi pomoże? – anthares

+0

Co jeśli nie chce używać jQuery? @anthares, jeśli chcesz, aby niektóre funkcje były wywoływane tylko na konkretnych stronach, potrzebujesz javascript na tych stronach, które dodadzą konkretne programy obsługi ładunków, których potrzebujesz. –

+0

@anthares, cóż, odkąd mówisz asp.net, używasz masterpage? jeśli tak, ale ogólne, jeśli nie, to myślę, że musisz zawinąć funkcję dotyczącą tych wspólnych i wywołać ją w każdej stronie. JQuery sprawia, że ​​wszystko staje się łatwiejsze i gorsze. –

5

Możesz skorzystać najlepiej z funkcji anonimowych:

function addLoadEvent(func) { 
    var oldonload = window.onload; 
    if (typeof window.onload != 'function') { 
     window.onload = func; 
    } 
    else { 
     window.onload = function() { 
      oldonload(); 
      func(); 
     } 
    } 
} 

zapożyczona z Top 10 custom JavaScript functions of all time.

3

w jQuery możesz wykonać

$(document).onload(function() { 
    // do something 
} 

// następnie później zrobić

$(document).onload(function() { 
    // do something here too! 
} 

jQuery inteligentnie dodać oba zdarzenia do zdarzenia onload i oba będą wykonywane po załadowaniu strony. Z jQuery otrzymujesz także wsparcie crossbrowser jako dodatkowy bonus.

5

jQuery ma ładny skrót do dodawania wielu zdefiniowanych procedur obsługi do zdarzenia "ready" (nie działa z anonimowymi funkcjami, w których musisz użyć $ (document) .ready (function() {});).

prostu

$(myFunction); 
$(myFunction2); 

Wielką zaletą jest to, że jeśli DOM już załadowany, to nadal zostaje zwolniony, a cokolwiek zwiążesz na window.onload po zdarzeniu nie zostanie wywołana.

Powiązane problemy