javascript addEventListener onStateChange не работает в IE - PullRequest
5 голосов
/ 22 мая 2010

У меня есть два всплывающих окна colorbox, которые показывают видео YouTube в каждом. Когда они заканчивают играть, я пытаюсь, чтобы они автоматически закрывали окно colorbox. Этот код ниже прекрасно работает в Firefox, но в IE я не могу заставить работать addEventListener. Я попытался attachEvent безуспешно. Кто-нибудь может предложить какие-либо предложения относительно того, как решить эту проблему? Это кажется простым, но я исчерпал себя, пытаясь найти решение. Кстати, я впервые в stackoverflow и это очень впечатляет.

ОБНОВЛЕНИЕ 1:

Ну, это мой текущий код. Он отлично работает в FF, но IE хорошо выводит. Отладчик IE8 также не сообщает об ошибках ...

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

Обновление 3: решение

Просто вставьте в мой colorbox поле «Завершить» и поместите в него swfobject, и он отлично работал в IE.

Ответы [ 3 ]

4 голосов
/ 29 мая 2010

IE не поддерживает addEventListener не так ли? Вам нужно attachEvent верно?

if (el.addEventListener){   
    el.addEventListener('click', modifyText, false);    
else if (el.attachEvent){   
    el.attachEvent('onclick', modifyText);   
}
2 голосов
/ 28 мая 2010

из тестирования в IE похоже, что вы используете ссылку

ytswf = document.getElementById('ytplayer1');

присваивается до загрузки фактического объекта SWF, поэтому IE считает, что вы имеете в виду простой элемент div

вам нужно запустить этот код

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

сразу после звонка

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

прежде чем закрыть это $(function()

и место var ytswf; сразу после <script> вместо дальнейшего вниз

0 голосов
/ 22 мая 2010

Новый ответ

В объекте плеера YouTube реализован собственный метод addEventListener, который больше похож на синтаксис AS3. Согласно информации, указанной здесь :

player.addEventListener (событие: String, Слушатель: String): Пустота

YouTube предоставляет пример на странице, на которую я ссылаюсь, и я приведу здесь:

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

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

YouTube также предоставляет пример страницы, которая, кажется, доказывает, что их пример кода работает в IE. Я привожу пример страницы здесь .

Теперь, вот попытка переписать соответствующие части вашего кода для работы в соответствии с примерами, предоставленными 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');
}

Итак, получается, что ошибка, которая здесь допущена, возникает из-за путаницы, вызванной использованием имени метода addEventListener. В реализации JavaScript в W3C вторым параметром является функция, а в реализации YouTube вторым параметром является строка. Дайте этому шанс =).

...