Может ли JavaScript прослушивать изменения состояния из объекта QuickTime, встроенного в веб-страницу? - PullRequest
4 голосов
/ 10 июня 2010

Я пытаюсь управлять объектом QuickTime, который я встроил в веб-страницу, используя JavaScript, и хочу слушать и реагировать на события DOM, которые выдает объект. Apple опубликовала учебник по этому вопросу , который, похоже, не работает вообще. Код, который я сделал, используя их документацию, выглядит следующим образом:

$(document).ready( function() {
     $('#plugin').html( QT_GenerateOBJECTText( 'http://streaming1.wecreate.com:443/ckkw_kfun.mp3' , '300', '300', '', 'obj#ID', 'qt', 'emb#ID', 'qt', 'emb#NAME', 'qt', 'postdomevents', 'true', 'EnableJavaScript', 'true', 'autoplay', 'true' ) );
    qt = document.getElementById('qt');
    if(!qt ) {
        alert("Couldn't get QT Handle");
     }
     RegisterListeners();
});

function myAddListener(obj, evt, handler, captures) {
     if ( document.addEventListener )
          obj.addEventListener(evt, handler, captures);
     else
          obj.attachEvent('on' + evt, handler);
}
function RegisterListener(eventName, objID, embedID, listenerFcn) {
     var obj = document.getElementById(objID);
     if(!obj )
          obj = document.getElementById(embedID);
     if(obj)
          myAddListener(obj, eventName, listenerFcn, false);
}
function RegisterListeners() {
     RegisterListener('qt_begin', 'qt', 'qt', qtStateChanged);
     RegisterListener('qt_play', 'qt', 'qt', qtStateChanged);
     RegisterListener('qt_pause', 'qt', 'qt', qtStateChanged);
}
function qtStateChanged() {
    alert("State Changed!");
}

Этот код не так чист, как мог бы - я должен был нести объект qt через все это, но я хотел оставить его как можно ближе к демонстрационному коду Apple, насколько это возможно.

В Firefox код успешно загружает объект QuickTime и начинает воспроизведение потока (согласно параметру автозапуска), но я не получаю ни одного вызова qtStateChanged (), хотя я установил параметры postdomevents и enablejavascript на объекте QuickTime.

В Chrome я получаю логотип QuickTime, но нет звука или элементов управления. Объект сообщает о событии qt_begin, и я получаю предупреждение JavaScript. В IE6 (у нас все еще есть технологически отсталые клиенты), проигрыватель загружается, но опция автозапуска не работает, а обратные вызовы JavaScript вообще не работают.

Я также пытался управлять плеером из JavaScript, опять же безрезультатно. Ниже приведены три различных оператора jQuery, которые пытаются приостановить проигрыватель. Ни один из них не работает ни в одном из трех браузеров, в которых я тестировал:

<p onclick="JavaScript:$(qt).Pause();">Suck it, Trebek</p>
<p onclick="JavaScript:$('#qt').Pause();">Suck it again, Trebek</p>
<p onclick="JavaScript:$('#plugin').Pause();">Suck it a third, Trebek</p>   

Есть ли у кого-нибудь понимание этой связи между JavaScript и QuickTime? Учебник, который не был написан 10 лет назад, был бы очень кстати.

Спасибо.

Ответы [ 3 ]

1 голос
/ 11 июня 2012

AC_QuickTime.js - это общая боль.

Я пришел к выводу, что события просто не работают в IE.

Там, где, возможно, стоит упомянуть другие странные эффекты.

  • Убедитесь, что у вас установлена ​​последняя версия по этой ссылке . Я начал с другой версии, которая вообще не работала.
  • AC_QuickTime.js добавляет объект источника события в дерево dom в IE. Проблема в том, что он украдет 16 пикселей поверх кадр игрока.

Превратите txt = _QTGenerateBehavior () + txt; в txt = txt + _QTGenerateBehavior (); в AC_QuickTime.js, чтобы переместить этого ублюдка на дно.

Вот пример кода для хорошей меры. Некоторые переменные не определены, так как этот код является частью замыкания. Помните. Этот код все еще не работает в IE. (проверено IE 8)

element.innerHTML = QT_GenerateOBJECTText(
  'sample_mpeg4.mp4', set_c.width, set_c.height + 16, '',
  'obj#id'  , element.id + 'PlayerElement',
  'emb#NAME', element.id + 'PlayerElement' ,
  'emb#id'  , element.id + 'EmbPlayerElement' ,
  'scale' , 'tofit' , 'AUTOPLAY', 'True', 'CONTROLLER', 'True',
  'EnableJavaScript', 'True', 'postdomevents', 'True',
  'qtsrc', url);
var try_register = 5;
var event_handler = function(ev){
  console.log("Event! " + ev.type);
};
var callback = function(){
  try_register--;
  console.log("Register Event");
  var obj = document.getElementById(element.id + 'PlayerElement');
  if(obj){
    if(document.addEventListener){
      obj.addEventListener('qt_error', event_handler, false);
      obj.addEventListener('qt_pause', event_handler, false);
      obj.addEventListener('qt_stalled', event_handler, false);
      obj.addEventListener('qt_ended', event_handler, false);
    } else {
      // IE
      obj.attachEvent('onqt_error', event_handler);
      obj.attachEvent('onqt_pause', event_handler);
      obj.attachEvent('onqt_stalled', event_handler);
      obj.attachEvent('onqt_ended', event_handler);
    }
  } else {
    if(try_register > 0)
      setTimeout(callback, 250);
  }
};
setTimeout(callback, 250);
1 голос
/ 15 июня 2011

Внедренный объект QuickTime не является стандартным элементом HTML, он работает через интерфейс плагина браузера и был сделан сторонним поставщиком, тогда не у всех браузеров он есть.Было поддержано очень плохое API для интерактивного.Насколько я знаю, вы не можете прослушивать событие изменения состояния от объекта QuickTime, потому что он недостаточно стабилен и недоступен через почти известные браузеры.Даже если вам повезет с Safari, он просто не будет работать в IE, Firefox, Opera ...

Удачи!

0 голосов
/ 13 июля 2011

ОК, обновите мои комментарии выше. В моих тестах это просто сломано. Когда я спросил, оглушительное молчание в списке рассылки quicktime-users. Я уверен, что это ошибка: события больше не запускаются фильмами QuickTime.

...