2013-03-22 19 views
41

Ben zaten bir kez daha bir yöntem çağrısı atandı window.onload olayı başka bir yöntem çağrısı eklemek nasıl merak ediyorum.window.onload olayı ekleme?

Bu görevin var komut

varsayalım yerde ... Haliyle

window.onload = function(){ some_methods_2() }; 

, sadece some_methods_2 adı verilecek daha sonra bu görevin var senaryodaki sonra

window.onload = function(){ some_methods_1() }; 

ve . some_methods_1 iptal etmeden önceki window.onload geri arama eklemek için herhangi bir yolu var mı? (ve aynı işlev bloğunda hem some_methods_1() hem de some_methods_2()'u dahil etmeden).

Bu sorunun gerçekten yaklaşık window.onload hakkında değil, javascript ile ilgili bir soru olduğunu düşünüyorum. window.onload'a bir şey atamak istemiyorum, eğer başka bir geliştirici kod üzerinde çalışacak ve window.onload (önceki koduma bakmadan) kullanan bir kod parçası ekleyecekti, .

Ben de jquery aynı şeyi yaklaşık

$(document).ready() 

merak ediyorum. Daha önce gelenleri yok etmeden nasıl ekleyebilirim, ya da sonra ne olabilir?

+1

'$ (document) .ready()' biriktikçe olarak onload fonksiyonu ve zincir güncelleyecektir. JQuery elinizde ise kullanın. –

cevap

28

jQuery kullanıyorsanız, özel bir şey yapmanız gerekmez. IE < 9 için Karaxuna tarafından gösterildiği gibi, jQuery kullanmıyorsanız

$(document).ready(func1) 
... 
$(document).ready(func2) 

, sen addEventListener kullanabilirsiniz artı attachEvent: $(document).ready() ile eklenmiş Eylemciler birbirinin üstüne değil, sırayla yürütmek yok .

onload'un $(document).ready()'a eşdeğer olmadığını unutmayın - eski CSS için bekler, görüntüler ... ikincisi yalnızca DOM ağacı için beklerken. Modern tarayıcılar (ve IE9'dan beri IE), jQuery ready olayına karşılık gelen belgede DOMContentLoaded olayını destekler, ancak IE < 9 bunu yapmaz. , Hala (Ben örnek olarak onload kullanıyorum, ancak diğer seçenekler için kullanılabilir yapabilirsiniz (örneğin, DOM düğümlerinin ile ilgili değildir)


ne seçeneği varsa

if(window.addEventListener){ 
    window.addEventListener('load', func1) 
}else{ 
    window.attachEvent('onload', func1) 
} 
... 
if(window.addEventListener){ 
    window.addEventListener('load', func2) 
}else{ 
    window.attachEvent('onload', func2) 
} 
onload):

var oldOnload1=window.onload; 
window.onload=function(){ 
    oldOnload1 && oldOnload1(); 
    func1(); 
} 
... 
var oldOnload2=window.onload; 
window.onload=function(){ 
    oldOnload2 && oldOnload2(); 
    func2(); 
} 

veya küresel ad kirletici (ve muhtemelen ad çarpışmaları karşılaşmadan), ithalat/ihracat hayattan desen kullanmaktan kaçınmak için:

window.onload=(function(oldLoad){ 
    return function(){ 
    oldLoad && oldLoad(); 
    func1(); 
    } 
})(window.onload) 
... 
window.onload=(function(oldLoad){ 
    return function(){ 
    oldLoad && oldLoad(); 
    func2(); 
    } 
})(window.onload) 
+1

"document.attachEvent ('inload' ...)" ifadesini kastediyorsunuz, 'load' değil. ;) –

+0

@JamesWilkins haklısınız. Sabit, teşekkürler –

+0

document.addEventListener ("load") kullanmamalısınız (firefox sürümümde çalışmaz), ancak bunun yerine window.addEventListener ("load"). Http://stackoverflow.com/q/16404380/94102 adresine bakın: –

42

Daha önce, varsa window.onload önceki değeri böylece kod bir önceki işleyicisi çağırabilirsiniz yerine

addEvent(window, 'load', function(){ some_methods_1() }); 
addEvent(window, 'load', function(){ some_methods_2() }); 

function addEvent(element, eventName, fn) { 
    if (element.addEventListener) 
     element.addEventListener(eventName, fn, false); 
    else if (element.attachEvent) 
     element.attachEvent('on' + eventName, fn); 
} 
+0

çapraz tarayıcı uyumlu hale getirmek için, her ikisini de kullanmalıyım? Ayrıca, daha sonra komut dosyasında daha önce addEventListener kullanarak daha sonra window.onload'a bir geri arama eklerseniz, addEventListener ile ne atandım, iptal edilsin mi? – pepper

+3

@pepper yanıt güncellendi. Hayır, iptal edilmeyecek – karaxuna

6

iki yolu

  1. mağaza temelde vardır attachEvent (ie8) ve addEventListener kullanabilirsiniz veya kodunuz, addEventListener yaklaşımını kullanarak

  2. 'u uyguladıktan sonra ve başka bir ad kullanmanız gerekir). Başka komut window.onload kullanmak istiyor ve işbirliği ancak JavaScript temel varsayımını yapmak çalıştığınız gibi tüm komut işbirliği olmasıdır düşünmeden keserse

İkinci yöntem size biraz daha fazla güvenlik verecektir .

Bilinmeyen diğer betiklerle çalışmak üzere tasarlanmamış kötü bir betiğin, örneğin prototiplerle uğraşarak, global ad alanını kirleterek veya dom'a zarar vererek, her zaman bir sayfayı parçalayabileceğini unutmayın.

+0

bu harika! jquery'nin $ (document) .ready() veya bind()? – pepper

+0

Jquery'nin sadece Javascript olduğunu biliyor musunuz, değil mi? Kontrol etmedim ama tahminim muhtemelen (2) mevcut ise veya eski tarayıcılar için (1). – 6502

+0

elbette, sadece soruyorum çünkü $ (document) .ready() window.onload'dan biraz farklı ... "Hazır olay, HTML belgesi yüklendikten sonra ortaya çıkar, tüm içerik (örneğin görüntüler) de yüklendi. " – pepper

1

Bupopüler bir seçenek olmayabilir, ama bazen komut çeşitli parçalar halinde dağılmış bir türlü olmuyor, bu durumda ben hızlı bir düzeltme başka bir yerde daha sonra

if(window.onload != null){var f1 = window.onload;} 
window.onload=function(){ 
    //do something 

    if(f1!=null){f1();} 
} 

olduğunu tespit ettik. ..

if(window.onload != null){var f2 = window.onload;} 
window.onload=function(){ 
    //do something else 

    if(f2!=null){f2();} 
} 

bu gerekli

İlgili konular