IE9 + jwplayer:__flash__addCallback错误如果在调用player.load()之前将玩家移动到dom中

moo*_*dog 6 flash jquery internet-explorer jwplayer media-player

更新:这个问题的前提被证明是错误的.除非移动是对用户单击的响应,否则不会发生此问题.请看这里.


几天来我一直在敲我的头,我希望有人可以提供帮助.

我有一个jquery脚本,使用jwplayer javascript api调用jwplayer对象("myplayer").例如,要使用特定视频加载myplayer,我会调用:

myplayer.load('my_url');
Run Code Online (Sandbox Code Playgroud)

这在firefox和Internet Explorer中都可以正常工作,只要我不首先将播放器移动到DOM中的其他位置即可.

然而,我的脚本有时移动从位置A到B位置的球员,然后回到位置A,调用之前 myplayer.load().这在firefox中运行良好.但在Internet Explorer 9中,我在这一行上收到错误:

return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
Run Code Online (Sandbox Code Playgroud)

在这个函数里面:

function __flash__addCallback(instance, name) {
  instance[name] = function () { 
    return eval(instance.CallFunction("<invoke name=\""+name+"\" returntype=\"javascript\">" + __flash__argumentsToXML(arguments,0) + "</invoke>"));
  }
}
Run Code Online (Sandbox Code Playgroud)

如果我跟踪什么是在Internet Explorer中的调试器发生的事情,我看到myplayer.load('my_url')来电this.callInternal("jwLoad",u)jwplayer.js,这显然是在执行this.callInternal("jwLoad",u)时发生错误.

细节:

html看起来像这样:

<div id='stage'>
    <div id='myplayer_wrapper'>
        <object id='myplayer'>...</object>
    </div>
</div>
<div id='holding-pen'></div>
Run Code Online (Sandbox Code Playgroud)

当玩家没有被使用时,我将其wrapper-div移动到握笔:

var el = $('#myplayer_wrapper');            
$('#holding-pen').append(el);
Run Code Online (Sandbox Code Playgroud)

将播放器的wrapper-div移动到握笔后,html现在看起来像:

<div id='stage'></div>
<div id='holding-pen'>
    <div id='myplayer_wrapper'>
        <object id='myplayer'>...</object>
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

当我想使用播放器时,我将其wrapper-div移回stage-div:

var el = $('#myplayer_wrapper');            
$('#stage).append(el);
Run Code Online (Sandbox Code Playgroud)

将播放器的wrapper-div移动到stage-div后,html看起来与原来的相同:

<div id='stage'>
    <div id='myplayer_wrapper'>
        <object id='myplayer'>...</object>
    </div>
</div>
<div id='holding-pen'></div>
Run Code Online (Sandbox Code Playgroud)

在页面加载时,我创建了播放器对象并将其移动到握笔.然后我将它移动到舞台并加载视频.

如果用户点击例如图像缩略图,我将视频播放器移动到握笔并将所选图像移动到舞台上.

如果用户然后点击视频缩略图,我将从握笔中取出视频播放器并将其移回舞台.然后我用所选视频加载播放器.这是Internet Explorer中出现"_ flash _addCallback"问题的地方.

有没有人对可能发生的事情有任何见解?或者我是如何在Internet Explorer中使用它的任何建议?

非常感谢你!

Wal*_*rée 1

就网络上的各种帖子而言,这似乎是 IE(6、7、8 和 9)的已知问题。这取决于Flash版本和IE版本的组合。

IE似乎为人们期望从媒体播放器中听到的词语保留了方法:

  • 停止
  • 暂停
  • 长度

...该__flash__addCallback()函数似乎使用了相同的词。play它们stop是电影的重要组成部分Flash,决定电影何时播放或停止。我无法确认后续版本是否Flash对此进行了修改。

支持这一点的来源:

一个有趣的变化: http://beweb.pbworks.com/w/page/53110280/Flash%20IE8%20Javascript%20Error

有些人建议使用SWFObject来解决诸如此类的浏览器问题,其他人则研究了 Soundcloud 修复播放器的方法 - 尽管这篇 SoundCloud 文章粉碎了任何一丝希望。

归根结底,问题在于FlashExpect如何JavaScript与自身通信,这会因IE. 您可能必须:

  • 更新你的jwplayer
  • 在jwplayer的错误跟踪器上创建问题
  • 自己解决问题...

帮助我解决许多 IE 问题的方法是将 DOCTYPE 更改为<!DOCTYPE html>. 简单而有效。请注意,IE7最好将 DOCTYPE 一词写为大写。每当我尝试这样做时,我就知道我已经变成了绝望的僵尸。:P

最后但并非最不重要的一点是,请确保关闭下面最后一个单引号:

$('#stage).append(el);
Run Code Online (Sandbox Code Playgroud)