未捕获的错误:在NPObject上调用方法时出错

35

我在我的页面上有一个 Flash 视频,如下所示:

<script type="text/javascript">
var flashvars = {
};
var params = {
    movie: "VideoMain.swf",
    quality: "high",
    bgcolor: "#000000",
    allowScriptAccess: "always",
    wmode: "transparent"
};
var attributes = {
  id: "VideoMain",
  name: "VideoMain",
  classid: "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
  width: "100%",
  height: "100%"
};
swfobject.embedSWF("./video/VideoMain.swf", "myVideoContent", "100%", "100%", "11.0.0","", flashvars, params, attributes);
</script>

<div id="myVideoContent">
    <h1>Oooppsss....you need flash or a newer version of flash</h1>
    <p><a href="http://www.adobe.com/go/getflashplayer"><img src="http://www.adobe.com/images/shared/download_buttons/get_flash_player.gif" alt="Get Adobe Flash player" /></a></p>
</div>
上面的内容被追加到#VideoMain中。
然后我有以下内容:
$('#X.click').click(function(e) {
    var flash = document.getElementById("VideoMain");
    flash.sendToActionScriptPublishVideo(true);
});

这会导致控制台错误:

Uncaught Error: Error calling method on NPObject.
(anonymous function)
jQuery.event.dispatchjquery.js:3256
jQuery.event.add.elemData.handle.eventHandlejquery.js:2875

有什么想法可能是错的?谢谢

2个回答

74

NPObject是浏览器通过“接口”与任何“外部”代码进行交互的方式(这里的“外部”指的是JavaScript无法识别的代码,否则就像全局窗口对象之类的浏览器自有对象)。嵌入式Flash插件肯定会实现该“接口”(因此浏览器将其视为另一个NPObject)。

当您在该对象上调用方法时,有几个函数包装该调用,将传递给对象的数据序列化并返回给浏览器的运行时。很难确定确切的问题所在,但一些常见的原因可能包括:

  1. 插件没有公开(或尚未注册)您尝试调用的名称的方法。
  2. 以不允许跨脚本编写的方式嵌入了插件(限制可能存在于两个方面,Flash要求调用来自受信任的域,并且您可以通过对象标记中的设置限制插件与环境的通信)。
  3. 在通过JavaScript调用的插件代码中抛出错误-我不确定是否是同一个错误,但很有可能。

2
第三个问题是我遇到的错误 - 如果你正在使用Flash,那么JS调用的函数中会抛出一个错误 - 使用try..catch块可以将其包含,或者帮助你缩小问题范围,以便你可以修复它。 - divillysausages
5
JS 尝试调用暴露的 Flash 方法时出现错误,但未正确调用 System.security.allowDomain() / System.security.allowinsecureDomain()。如果您调用了 allowDomain(),请确保 HTML 和 SWF 在相同的协议下加载(HTTPS 或 HTTP)。请注意,本文仅为翻译,不包含解释或其他内容。 - Maxim Kachurovskiy
2
  1. 你添加为回调的方法必须作用域为:public
  2. 如果你期望在 Flash 中传递一个字符串,将未定义的值传递给此方法可能会创建此消息。
- YopSolo
对我来说,Security.allowDomain("domain.com") 解决了问题,其中 domain.com 是托管调用我的 swf 的 JavaScript 的网站域。 - simo
1
(4) YopSolo的解决方案对我有用。这很奇怪:我经常这样做,私有方法总是正常工作,但这次需要公共方法。 - SentineL

1
我曾经遇到过同样的错误信息。只有当Flash在进行ExternalInterface调用并在Flash崩溃后返回时才会出现这个问题(无论什么原因)。我实施的解决方法是:检查Flash对象是否仍在运行,并检查回调函数是否仍为该对象的函数。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接