2008-10-21 13 views
6

Bu sorunun ayrıntılarına girmeden önce durumu netleştirmek istiyorum. Web analitik şirketimiz, büyük siteler için bir danışman olarak çalışır ve (tek bir SCRIPT etiketi eklemekten başka), sayfaların kendileri üzerinde hiçbir kontrolü yoktur.Güvenli, evrensel, addEventHandler'ı Javascript'te kullanma şekli?

Mevcut komut dosyası, sayfadaki "yeni" (addEventListener veya attachEvent) işleyicilerinden tamamen habersiz "eski" yolunu (orijinal bir işleyiciyi de yürüten, element.onclick = blah'ın süslü bir sürümünü) kullanan işleyicileri yükler. Komutumuzu, çok fazla özel geliştirme gerektirmeden daha fazla sitede yayınlanabilir hale getirmek için bunu düzeltmek isteriz.

Burada ilk düşüncede kendi komut dosyasımızın addEventListener/attachEvent olması gerekiyordu, ancak bu bir sorun sunuyor: müşterinin sitesinden "eski" yolunu kullanarak bir işleyiciyi ayarlıyor, "yeni kurduğumuz işleyiciyi sileceğiz" "yol. Hızlı ve kirli testler, tüm tarayıcı aralığını test etmeme rağmen IE7 ve FF3'te bu durumun gerçekleştiğini gösteriyor. Ayrıca, sayfanın etkinlik işleyicileri zaten ayarlandıktan sonra "yeni" yolunu kullanırsak, işleyicilerini de silebiliriz.

Sorunuz: Javascript'te, sayfada diğer olay işleyicilerinin nasıl yüklendiğinden bağımsız olarak çalışan addEventListener/attachEvent kullanarak bir olay işleyicisi eklemek için hangi güvenli tekniği kullanabilirim?

Lütfen unutmayın: komut dosyasının kurulu olduğu siteyi değiştirmenin hiçbir yolu yoktur. (Bunu vurgulamak zorundayım çünkü bu gibi sorulara verilen varsayılan cevap her zaman "her şeyi aynı şekilde yapmak için sayfayı yeniden yaz.")

cevap

5

Hızlı-kirli testinizi tekrar deneyebilir misiniz? Bu FF3'te benim için olmaz.

elem.onclick = function() { alert("foo"); }; 
elem.addEventListener("click", function() { alert("bar"); }, false); 

Öğeyi tıklattığımda her iki işleyici de bana ateş eder.

addEventListener numaralı son boole argümanını (yakalama aşamasını kullanıp kullanmayacağınızı) unuttuğunuzu tahmin ediyorum. Ayrıca IE'nin attachEvent'un click'a değil onclick'a ihtiyacı olduğunu unuttuğumu tahmin ediyorum.

+0

Ve bu, IE'de veya başka herhangi bir tarayıcıda sorun değil. Gerçekte soran kişi tarafından "tahmin" davranış, bu herhangi bir istemci tarafı kodu –

+0

Argh için ciddi sorunlara yol açacaktır, haklı görünüyorsun. Soru için özür dileriz, açıkçası, hata bir berbat bir test vakasıydı ve tarayıcıdaki herhangi özel bir hata değildi.(En azından IE7 ve FF3.) Bana doğru yönde işaret ettiğiniz için teşekkürler. – blakeyrat

1

addEventListener/attachEvent bir anlamda güvenlidir. Daha önce eklenmiş herhangi bir işleyiciyi değiştirmeden bir Düğüm'e yeni bir olay işleyicisini eklerler (bir kez onxxx özelliği ile atanmış olsa bile). AddEventListener/attachEvent kullanarak yabancı bir sayfaya bazılarını getiren bir şirket için tek uygulama olmalıdır. Özelliklerle onxxx işleyicisini atamak, barındırma sayfalarını (daha önce aynı şekilde atanmış olan) barındıran sayfaları bozacaktır (

+0

Evet, ancak sorun şu ki, sayfa daha sonra element.onclick = "" kullanıyorsa; addEventListener kullandıktan sonra, dinleyicimizi siler. Varolan işleyicileri yükleme yöntemimiz, element.onclick = "" ile çalışır; çünkü işleyicinin önceki içeriğini saklarız ve bizimki tetiklendiğinde "benzetiriz". – blakeyrat

+0

metnimi tekrar oku - sadece düzeltildi. element.onclick gerçekten addEventListener/attachEvent ile eklenmiş olan işleyicilerinizi silmeyecektir. Ayrıca: "simulation" olayları, daha kötüsü kötülüklerden biridir, lütfen bunu yapmayın. –

+0

Re: Olayları simüle ederek, bunun oldukça eski bir "internet" ürünü olduğunu ve IE 5 ve 5.5 ile uyumlu bir şekilde yapmanın başka bir yolu olmadığını hatırlamak zorundasınız. – blakeyrat