我正在尝试使用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年前没有写过的教程将是一个很好的福音。
感谢。
答案 0 :(得分:1)
嵌入的QuickTime对象不是标准的HTML元素,它通过浏览器插件界面工作,它是由第三方提供商制作的,然后并非所有浏览器都拥有它。它一直支持非常差的API交互式。据我所知,你无法从QuickTime对象中侦听状态更改事件,因为它不够稳定并且几乎不能通过几乎着名的浏览器提供。即使你幸运地使用Safari,它也不会适用于IE,Firefox,Opera ......
祝你好运!答案 1 :(得分:1)
AC_QuickTime.js是一个彻头彻尾的痛苦。
我得出结论,事件在IE中不起作用。
我应该提到其他奇怪的效果。
将 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电影不再触发事件。