【问题标题】:Uncaught Error: Error calling method on NPObject未捕获的错误:在 NPObject 上调用方法时出错
【发布时间】:2012-01-20 04:38:25
【问题描述】:

我的页面上有一个 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

有什么想法可以在这里出错吗?谢谢

【问题讨论】:

    标签: jquery adobe flash swfobject


    【解决方案1】:

    NPObject 是通过浏览器公开的任何“外来”代码的“接口”(外来代码,如 JavaScript 的外来代码,否则它可能是浏览器自己的对象,例如全局窗口对象)。嵌入式 Flash 插件肯定会实现这个“接口”(因此浏览器将其视为另一个 NPObject)。

    当您在该对象上调用方法时,有几个函数会包装该调用,将传递给对象的数据序列化并返回到浏览器的运行时。很难确定究竟是什么不起作用,但一些常见的原因包括:

    1. 插件未公开(或尚未注册)具有您尝试调用的名称的方法。
    2. 插件以不允许跨脚本的方式嵌入(限制可能在双方,Flash 要求调用来自受信任的域,您可以通过对象中的设置限制插件与环境通信标记。
    3. 通过 JavaScript 调用的插件代码中引发的错误 - 我不确定这是否是相同的错误,但很有可能。

    【讨论】:

    • 第三个问题对我来说是错误的——如果你使用的是 Flash,那么 JS 调用的函数中会抛出一个错误——使用 try..catch 块可以包含它,或者帮助您缩小问题所在,以便您解决问题
    • 当 JS 试图调用暴露的 Flash 方法但未调用正确的 System.security.allowDomain() / System.security.allowinsecureDomain() 时,我收到此错误。如果您调用 allowDomain(),请确保您的 HTML 是通过与 SWF 相同的协议(HTTPS 或 HTTP)加载的。
    • 4) 您作为回调添加的方法的范围必须为:public 5) 将未定义的值传递给此方法可以创建此消息(如果您期望 Flash 中的字符串)
    • 对我来说,Secrity.allowDomain("domain.com") 解决了这个问题,其中 domain.com 是托管调用我的 swf 的 javascript 的网站域
    • (4) YopSolo 的解决方案对我有用。这很奇怪:很多次我都这样做了,而且私有方法总是可以正常工作,但这次需要公共方法。
    【解决方案2】:

    我收到了同样的错误信息。该问题仅在 Flash 进行了在 Flash 崩溃后返回的 ExternalInterface 调用时发生(无论出于何种原因)。我实施的修复是:检查 Flash 对象是否仍在运行,以及回调是否仍然是该对象的函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多