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.
Quale browser usi? –
Chrome ... Questo è riproducibile in tutti i browser – stackMan10
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