5

Ho due finestre popup colorbox che mostrano un video youtube in ciascuna. Quando hanno finito di giocare, sto cercando di farli chiudere automaticamente la finestra colorbox. Questo codice qui sotto funziona perfettamente in firefox, ma in IE non riesco a far funzionare addEventListener. Ho provato attachEvent senza successo. Qualcuno può offrire qualche suggerimento su come risolvere questo? Sembra semplice ma sono esausto cercando di trovare una soluzione. A proposito, questa è la mia prima volta in StackOverflow ed è davvero impressionante.javascript addEventListener onStateChange non funziona in IE

UPDATE 1:

Bene, questo è il mio codice corrente. Funziona perfettamente in FF, ma IE produce solo buoni risultati. IE8 debugger non segnala eventuali errori o ...

function onYouTubePlayerReady(playerId) { 
    if (playerId && playerId != 'undefined') { 
    if(playerId && playerId == 'ytvideo1'){ 
     var ytswf = document.getElementById('ytplayer1'); 
     alert('good'); 
    } else if(playerId && playerId == 'ytvideo2'){ 
     var ytswf = document.getElementById('ytplayer2'); 
    } else { 
    } 

    setInterval('', 1000); 
    ytswf.addEventListener('onStateChange', 'onytplayerStateChange'); 
    alert('great'); 
    } 
} 


function onytplayerStateChange(newState) { 
    alert('amazing'); 
    if(newState == 0){ 
    $.fn.colorbox.close(); 
    alert('perfect'); 
    } 
} 

Update 3: Soluzione

In poche parole onComplete nel mio colorbox e mettere lo SWFObject in questo e ha funzionato perfettamente in IE.

+0

addEvent dovrebbe funzionare. Puoi mostrare il codice di come stai usando addEvent. – Rajat

+0

Intendevo attachEvent. – Rajat

+0

Ho semplicemente fatto ytplayer.attachEvent ("onStateChange", onytplayerStateChange); proprio sotto addEventListener, non ho inserito una condizione, ho pensato che non avrebbe importanza. – Derek

risposta

2

dai test in IE sembra che il riferimento che si sta utilizzando

ytswf = document.getElementById('ytplayer1'); 

viene assegnato prima che l'oggetto swf reale viene caricato, in modo da IE pensa si fa riferimento ad un semplice elemento div

è necessario per eseguire questo codice

function onYouTubePlayerReady(playerId) { 
    ytswf = document.getElementById("ytplayer1"); 
    ytplayer.addEventListener("onStateChange", "onytplayerStateChange"); 
} 

subito dopo si chiama

swfobject.embedSWF("http://www.youtube.com/v/SPWU-EiulRY? 
hl=en_US&hd=0&rel=0&fs=1&autoplay=1&enablejsapi=1&playerapiid=ytvideo1", 
"popupVideoContainer1", "853", "505", "8", null, null, params, atts); 

prima di chiudere che $(function()

e posizionare var ytswf; subito dopo la <script> invece che, più in basso

+0

Beh, ci ho passato 4 ore solo perché mi ha incuriosito, e sfortunatamente sono venuto a mani vuote.Tuttavia non è attachEvent. È ... colorbox. Qualcosa che fa che IE non è in grado di fare riferimento all'oggetto youTube dopo il rendering. Dai un'occhiata al codice sorgente qui: qui gli stati vengono catturati con l'assenza di colorbox: http://plain7.com/test.htm e qui, non andare: http://plain7.com/test2.htm . .. e questo è solo in IE, altri browser lo fanno bene. Mi arrendo :) Sono quasi le 5 del mattino e sono braindead. Potresti provare qualche altra implementazione lightbox (anche se colorbox è il mio preferito) – Raine

+0

hah, ora vedi come mi sono sentito nelle ultime 2 settimane ... grazie per averci consultato, sono sicuro di trovare un'alternativa a colorbox, che prenderà solo alcune modifiche importanti. Segnerò la risposta come corretta semplicemente perché ora so che attachEvent non è il problema. grazie ancora! – Derek

+0

Grazie per i punti, Derek, anche se sento di non aver aiutato molto. Tuttavia, ho pensato: cosa succede se si carica swfObject DOPO che si esegue il rendering della finestra colorbox, come in un callback su colorbox. Non so quali altri problemi potrebbe creare, ma prima di passare a lightbox, potrebbe essere qualcosa che vale la pena provare. – Raine

-1

Nuova risposta

Il giocatore oggetto di YouTube implementa il proprio metodo addEventListener che è più simile a come la sintassi di AS3. Secondo le informazioni di cui here:

player.addEventListener (evento: String, ascoltatore: String): Void

YouTube fornisce un esempio nella pagina che ho linkato io fornirò qui:

function onYouTubePlayerReady(playerId) { 
    ytplayer = document.getElementById("myytplayer"); 
    ytplayer.addEventListener("onStateChange", "onytplayerStateChange"); 
} 

function onytplayerStateChange(newState) { 
    alert("Player's new state: " + newState); 
} 

YouTube fornisce anche una pagina di esempio che sembra dimostrare che il loro codice di esempio funziona in IE. Collegherò la pagina di esempio here.

Ora, ecco un tentativo di riscrivere le parti pertinenti del codice a lavorare come negli esempi forniti da Google/YouTube:

function onYouTubePlayerReady(playerId) { 
    if(playerId && playerId == 'ytvideo1'){ 
    var ytplayer = document.getElementById('ytplayer1'); 
    } else if(playerId && playerId == 'ytvideo2'){ 
    var ytplayer = document.getElementById("ytplayer2"); 
    } else { 
    return; 
    } 

    ytplayer.addEventListener('onStateChange', 'onytplayerStateChange'); 
} 

Così, si scopre che l'errore stato fatto qui si pone dalla confusione creata dall'uso del nome del metodo 'addEventListener'. Nell'implementazione JavaScript W3C, il secondo parametro è una funzione mentre nell'implementazione di YouTube, il secondo parametro è una stringa. Dai uno scatto =).

+0

Ho modificato l'onYouTubePlayerReady nella mia domanda originale per riflettere la risposta. In FF avvisa 1, in IE avvisa 2. FF funziona come previsto, IE non esegue la funzione onytplayerStateChange. Sto usando attachEventHandler correttamente? usare la funzione bind() può aiutare la mia situazione? – Derek

+0

Ancora, funziona in FF, non in IE. Forse un esempio potrebbe aiutarti a risolvere il mio problema. – Derek

+0

Derek, per favore apri la pagina di esempio che ho collegato nella mia risposta e dimmi se stai vedendo gli eventi onStateChange nella tua versione di IE. Ho provato in IE8, e sembrava funzionare bene per me. Inoltre, si noti che il terzo parametro non è necessario in addEventListener. Prova a sostituire il tuo onYouTubePlayerReady con quello che ho fornito, e riferisci. Non dovresti aver bisogno delle dichiarazioni di ramificazione. –

4

IE non supporta addEventListener lo fa ?? Hai bisogno di attachEvent giusto?

if (el.addEventListener){ 
    el.addEventListener('click', modifyText, false);  
else if (el.attachEvent){ 
    el.attachEvent('onclick', modifyText); 
}