JavaScript可以从嵌入在网页中的QuickTime对象中侦听状态更改吗?

时间:2010-06-10 16:26:31

标签: javascript events audio streaming quicktime

我正在尝试使用JavaScript控制嵌入到网页中的QuickTime对象,并希望监听并响应对象抛出的DOM事件。 Apple有published a tutorial on the matter似乎根本不起作用。我使用他们的文档编写的代码如下:

$(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对象并开始播放流(根据autoplay选项),但即使我设置了postdomevents和enablejavascript参数,我也没有收到对qtStateChanged()的单个调用在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 个答案:

答案 0 :(得分:1)

嵌入的QuickTime对象不是标准的HTML元素,它通过浏览器插件界面工作,它是由第三方提供商制作的,然后并非所有浏览器都拥有它。它一直支持非常差的API交互式。据我所知,你无法从QuickTime对象中侦听状态更改事件,因为它不够稳定并且几乎不能通过几乎着名的浏览器提供。即使你幸运地使用Safari,它也不会适用于IE,Firefox,Opera ......

祝你好运!

答案 1 :(得分:1)

AC_QuickTime.js是一个彻头彻尾的痛苦。

我得出结论,事件在IE中不起作用。

我应该提到其他奇怪的效果。

  • 确保您拥有this link的最新版本。我从一个根本不起作用的不同版本开始。
  • AC_QuickTime.js将事件源对象添加到IE上的dom树中。 问题在于,它会在上面偷16个像素 球员框架。

txt = _QTGenerateBehavior()+ txt; 转换为AC_QuickTime.js中的 txt = txt + _QTGenerateBehavior(); ,将该混蛋移至底部。

这里有一些好的衡量标准的示例代码。 由于此代码是闭包的一部分,因此某些变量未定义。 记得。 此代码仍不适用于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);

答案 2 :(得分:0)

好的,请更新我上面的评论。在我的测试中,这很简单。当我问起时,在quicktime用户邮件列表上震耳欲聋的沉默。我确定这是一个错误:QuickTime电影不再触发事件。