2016-07-19 91 views
6

Ben window.top.document için bir etkinlik gönderme çalışıyorum Frame1 içindedispatchEvent(), geçme yerine işlevini yürütür o

kodu olarak:

function callingBell(){ 
    alert('ding dong'); 
} 

var event = window.top.document.createEvent("CustomEvent"); 
event.initCustomEvent('READY', false, false, { 'bell': callingBell }); 
window.top.document.dispatchEvent(event); 

yılında frame2:

window.top.document.addEventListener('BOMREADY', function(e) { 

    bell= e.detail.bell; 

}, false); 

Detaylar: bir ebeveyn jsp var. Ebeveyn jsp içinde 2 çocuk jspsim var. Senaryo ilk kez iyi çalışıyor. Ebeveyn çerçevesi yenilenmezken iki çocuk jspsini yenilediğimde/yeniden yüklediğimde, yukarıdaki sorun oluşur. Uyarı "ding dong" görüntülenme sayısı, tam olarak çocuk karelerini yenilememe sayısıdır. Anlamı: 7. yenilemede, uyarı 7 kez görüntülenir. Window.top.document içinde bir şeyden şüpheleniyorum, dinleyiciye iletmeden önce işlevi yürütmek için.

İkinci yenileme sonrasında, yürütme "window.top.document.dispatchEvent (event)" öğesine ulaştığında, önce hedef dinleyiciye girmek yerine, callBell işlevi çağrılır ve yürütme dinleyiciye ulaşmadan önce uyarı görüntülenir kodu.

Ayrıca, eğer callBell bir işlev değilse, dinleyici beklendiği gibi bir kez çağrılır.

GÜNCELLEME: Ben sonrası için dinleyici gerekiyor gibi nihai bir çözüm olarak bunu yapamaz,

e.target.removeEventListener('READY', arguments.callee, false); 

ama: ben sadece kullanarak addEventListener içindeki olay dinleyicisi kaldırarak bu sorunu çözebilir Etkinlik.

+0

Wich tarayıcı kullanıyor musunuz? –

+0

Chrome ... Bu, tüm tarayıcılarda tekrarlanabilir – stackMan10

+1

Yinelenen, çocuğun her yenilendiğinde eklenmesidir. Geri arama işlevini adlandırılmış bir işlev yaparsanız, eklemeden önce dinleyiciyi her zaman çıkarabilirsiniz. – Stoffe

cevap

1

Bu sorunu aldığınızdan şüpheleniyorum, çünkü dinleyicinizi geri aramanızdan kaldırmıyorsunuz. Bu yüzden, gerçekte her yenilendiğinde, olaylarınızı toplayıp birden çok uyarı alın.

Bu Aslında bu olması nedeniyledir: Bu yardımcı olur

window.top.document.addEventListener('BOMREADY', _callback(e), false); 

function _callback(e) { 
    window.top.document.removeEventListener('BOMREADY', _callback(e), false); 

    // Keep executing your function 
    bell = e.detail.bell; 
    bell(); 
} 

Umut!

+0

Yayında, etkinliği kaldırdığımda çalıştığını belirttim. Ama dinleyiciyi çıkaramıyorum çünkü başka bir amaç için ihtiyacım var. – stackMan10