我创建了一个自定义皮肤来播放YouTube视频。它曾经适用于所有主流浏览器。它现在不再适用于桌面计算机的Safari。这是链接:
http://www.don-nan.net/gas_separator.php
控制台会记录一条错误,上面写着“错误:错误调用NPObject上的方法”
错误是由http://www.don-nan.net/chromeless.css第100行的ytplayer.playVideo()引起的。该脚本在Firefox和Chrome中运行良好。
答案 0 :(得分:2)
https://code.google.com/p/gdata-issues/issues/detail?id=4887
我更改了名为loadPlayer的函数。以前,该功能看起来像:
// The "main method" of this sample. Called when someone clicks "Run".
function loadPlayer() {
// Lets Flash from another domain call JavaScript
var params = { allowScriptAccess: "always", wmode: "transparent" };
// The element id of the Flash embed
var atts = { id: "ytPlayer" };
// All of the magic handled by SWFObject (http://code.google.com/p/swfobject/)
swfobject.embedSWF("http://www.youtube.com/apiplayer?" +
"&enablejsapi=1&playerapiid=player1",
}
正如论坛底部的评论所述,版本号必须作为url中的参数传递。因此,改变这一行:
swfobject.embedSWF("http://www.youtube.com/apiplayer?" +
为:
swfobject.embedSWF("http://www.youtube.com/apiplayer?version=3" +
解决了这个问题。
答案 1 :(得分:0)
我遇到了完全相同的问题,而且我已经进一步跟踪了它。
在Safari中,我的“//www.youtube.com/apiplayer ...”嵌入式最终在检查器中显示为https请求,即使我的页面是通过http提供的。即使我明确指定该方案应该是http(“http://www.youtube.com/apiplayer ...”),我也会看到https请求。我认为这会触发导致NPObject错误的混合模式安全问题。
您网站上也发生了同样的事情。
这是最简单的例子:
<html>
<body>
<object type="application/x-shockwave-flash"
data="http://www.youtube.com/apiplayer">
</object>
</body>
</html>
这会在Chrome中向www.youtube.com和s.ytimg.com发出http请求,但我在Safari中看到了https请求。
然而,我尝试过的其他玩家并没有这样做:
http://vimeo.com/moogaloop.swf
http://www.viddler.com/player/key
如果我将User-Agent更改为Safari以外的其他内容,也不会发生这种情况!