2010-02-16 19 views
9

son zamanlarda şu sorunla karşılaştım:Javascript'te window.onload için + = var mı?

Tüm html sayfalarındaki web sitemde onLoad olayı üzerinde bir işlev çağırıyorum:

<body onLoad="func1();"> 

Bu benim html şablonumun bir parçasıdır, bu yüzden görünür Sitemdeki her sayfada ve bunu değiştiremiyorum. Şimdi, anlaşma bazı sayfalarda, bazı diğer işlevleri çağırmak zorunda kaldı ve ben window.onload özelliği ile denedim, ama func1 çağrısı siliyor ...

Şimdi sadece diyebilirim:

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

ama bu kirli ve topal gibi görünüyor? Öyle değil mi?

Yani, eskisini silmeden, yük altında çalıştırılacak olanlara bazı fonksiyonlar eklemenin bir yolu var mı? Buna ek olarak eğer asp.net kullanıyorum eğer bu yardımcı olabilirse ...

Teşekkürler!

+0

jquery olasılıkla alabileceğimiz en iyi olmasıdır. Ya da bazı kirli hileler ve hackler için gidebiliriz. – anthares

+2

Ben "anonim fonksiyonlar" yöntemi "kirli hile veya kesmek" olduğunu sanmıyorum. Aslında oldukça düzgün ... ve JavaScript'in en güçlü özelliklerinden birini kullanıyor. –

+0

Katılıyorum, bu da iyi bir alternatif. – anthares

cevap

19

jQuery'yi yükleyicileri zincirlemek için kullanabilirsiniz. jQuery.load veya jQuery(document).ready'u tekrar tekrar kullanmak işleyicilerinizi zincirleyecektir (inanıyorum). Diğer seçenek programsal olarak bunu yapmaktır, yani sizin için yükleyicileri zincirleyecek bir yardımcı fonksiyona ihtiyacınız vardır. Bir kapatma (veya anonim fonksiyonu) ile yapabilirsiniz:

var addOnLoadHandler = function(newHandler) { 

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

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

Yapman olurdu böylece, programlı olsa işlevlerini bağlamak zorunda kalacak:

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

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

bir javascript dosyasında (ya da html dosyanızda).

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; 
} 
HTML'inizde

veya Javascript yapmanız dosyası:

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

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

Sonra html sadece jquery içinde <body onload="runOnLoads()">

3

Eğer

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

klasik yaklaşım sadece fonksiyonlarının tüm sopa olduğunu ... bir javascript kütüphanesi jquery gibi, ben çok daha kolay hayatınızı yapacaktır diğer yaklaşımlar ama jquery olduğunu biliyor kabul var Sayfanın :) altındaki

+0

Tamam, ancak bazı sayfalarda ve bazı sayfalarda yalnızca bazı sayfalarda aranmak istiyorum. Ve "her sayfada" dediğimde, bunu tek bir yere yazmak istiyorum. JQuery bana nasıl yardım edecek? – anthares

+0

Ya jQuery'yi kullanmak istemiyorsa? Bazı fonksiyonlar sadece belirli sayfalarda çağrılacak istiyorsanız @anthares, ihtiyacınız olan belirli Onload işleyicileri katacak bu sayfalarda JavaScript. Eğer asp.net söylemek beri –

+0

@anthares, iyi, bir masterpage kullanıyorsunuz? Sonra sanırım değil eğer öyleyse ama orada genel olanlar, ortak olanları aroung bir işlev sarın ve everypage içinde aramak gerekiyorsa. JQuery sadece her şeyi daha kolay ve daha kolay hale getirir. –

5

anonim fonksiyonların en iyi şekilde yapmak isteyebilirsiniz:

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

ödünç.

3

yapabilirsiniz

diğer yaklaşım bir dizi kullanmaktır yapabileceğiniz

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

// daha sonra da

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

jQuery akıllıca yüklendiğinde etkinliğinde her iki etkinlik eklenecek yapmak ve hem Sayfa yüklendiğinde çalıştırılacaktır. JQuery ile ek bir bonus olarak crossbrowser desteği de alırsınız.

5

jQuery, "hazır" etkinliğe birden çok tanımlı tanıtıcı eklemek için hoş bir kısa yol sunar ($ (document) .ready (function() {});) işlevini kullanmanız gereken anonim işlevlerle çalışmaz.

basitçe

$(myFunction); 
$(myFunction2); 

Bir büyük avantajı DOM zaten yüklenmiş olup olmadığını, bu yine bir şey oysa olay denilen almazsınız sonra window.onload bağlanan, kovuluyor olmasıdır. Ben cevapları görmek ne