2016-07-19 267 views
6

Sto cercando di inviare un evento per window.top.document comedispatchEvent() con una funzione come parametro, esegue la funzione, invece di passarlo

codice frame1:

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

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

in frame2:

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

    bell= e.detail.bell; 

}, false); 

Maggiori dettagli: ho un jsp genitore. All'interno del jsp genitore, ho 2 jsps figlio. Lo scenario funziona bene la prima volta. Quando aggiorno/ricarico i jsps di due figli mentre il frame principale non viene aggiornato, si verifica il problema sopra riportato. Il numero di volte in cui viene visualizzato l'avviso "ding dong" è esattamente il numero di volte che aggiorno i frame figlio. Significato: al settimo aggiornamento, l'avviso appare 7 volte. Sospetto che qualcosa nel window.top.document sia scaduto per eseguire la funzione prima di passarla al listener.

Al secondo aggiornamento in poi, quando l'esecuzione raggiunge "window.top.document.dispatchEvent (evento)", anziché entrare nel listener di destinazione per primo, viene chiamata la funzione callingBell e l'avviso viene visualizzato prima che l'esecuzione raggiunga l'ascoltatore codice.

Inoltre, se callBell non è una funzione, l'ascoltatore viene chiamato una volta, come previsto.

UPDATE: posso risolvere questo problema semplicemente rimuovendo il listener di eventi all'interno del addEventListener utilizzando:

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

ma, non posso fare questo come soluzione finale, come ho bisogno l'ascoltatore per una successiva evento.

+0

Quale browser usi? –

+0

Chrome ... Questo è riproducibile in tutti i browser – stackMan10

+1

La ripetizione è perché viene aggiunta ogni volta che il bambino viene aggiornato. Se si rende la funzione callback richiamata, è sempre possibile rimuovere l'ascoltatore prima di aggiungerlo. – Stoffe

risposta

1

Sospetto che si verifichi questo problema perché non si rimuove il listener sulla richiamata. Questo è il motivo per cui ogni volta che si aggiorna effettivamente si impilano gli eventi e si ottengono avvisi multipli.

Questo è come vorrei effettivamente fare questo:

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(); 
} 

Spero che questo aiuti!

+0

Ho menzionato nel mio post che funziona quando rimuovo l'evento. Ma non riesco a rimuovere l'ascoltatore perché ne ho bisogno per qualche altro scopo. – stackMan10