仅在使用 Function.apply() 时,带有 swf 的 Firefox“Bad NPObject”错误

Posted

技术标签:

【中文标题】仅在使用 Function.apply() 时,带有 swf 的 Firefox“Bad NPObject”错误【英文标题】:Firefox "Bad NPObject" error with swf only when using Function.apply() 【发布时间】:2015-04-26 01:30:25 【问题描述】:

我在使用 flash 和 firefox(最新,35.0.1)时遇到了困难,但找不到任何解决方案。 我想用 javascript 调用一个 ActionScript 函数,使用 ExternalInterface。 所以我写了这个简单的 javascript 函数(App 只是一个包装我的函数的对象):

App.swfCall = function(callbackName, params) 
    var callback = $('#swf object, #swf embed')[0][callbackName];
    if(typeof(callback) === "function") 
        callback.apply(null, params); // executed but throws NPObject error...
    

而 Firefox 抛出错误:

错误的 NPObject 作为私有数据!

我发现的有关此错误的唯一帮助与我的问题无关,因为:

此时一切准备就绪;实际上,该操作首先由用户对 swf 本身的操作发起 不存在跨域问题(所有内容都在同一个域中)

实际上,如果我不使用 Function javascript 对象(使用 call()apply()),一切正常.所以 这个 起作用了:

App.swfCall = function(callbackName, data) 
    var swf = $('#swf object, #swf embed')[0];
    if(typeof(swf[callbackName]) === "function") 
        swf[callbackName](data);
    
;

反正这个有很多问题:

我可以只向函数传递一个参数 ...而且我要检查参数是否为“数据”参数不为空 因此我不能传递空参数(不是最大的问题)

所以我只需要能够将参数传递给 swf(0,一个或多个!) 而且我也很想了解正在发生的事情。

我说没有跨域问题,其实是facebook内的iframe。但显然所有内容都在其中并且在同一个域上,所以这应该不是问题.. 应该吗?

谢谢!

【问题讨论】:

尝试阅读此***.com/questions/1038668/… 谢谢,但我的问题不应该与跨域问题有关,因为一切都在同一个域上。无论如何,我会尝试将 allowscriptaccess 设置为“always”,尽管默认情况下它设置为“sameDomain”,这应该足够了。所以我不确定这是否能解决任何问题.. allowscriptaccess 应该为 true 与跨域策略无关,请阅读文档 我明确地将 allowscriptaccess 设置为“always”;正如预期的那样,我仍然有错误。在您的链接中还提到了 System.security.allowDomain,尽管最初的问题再次是 2 个域上的两个文件。也许我误解了一些东西,但我仍然有这个“Bad NPObject”错误。奇怪的是,它只是通过不使用 Function 对象来工作......我不明白为什么。无论如何,谢谢你的帮助 【参考方案1】:

如果您想将参数作为数组放入函数中,您可以使用 ECMA6 中定义的新扩展运算符尝试:

App.swfCall = function(callbackName, data) 
  var swf = $('#swf object, #swf embed')[0];
  if(typeof(swf[callbackName]) === "function") 
    swf[callbackName](....data);
  
;

操作员的描述可以在这里找到: https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Operators/Spread_operator

【讨论】:

如何启用 ES6? 无需激活。最近的浏览器支持它!见kangax.github.io/compat-table/es6

以上是关于仅在使用 Function.apply() 时,带有 swf 的 Firefox“Bad NPObject”错误的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript Function.apply() 函数详解

仅在窗口调整大小时防止 div 重叠(带样式组件)

apply和call的使用和区别

apply()与call()的区别

function.apply.bind 在以下代码中是如何工作的?

callapplybind 的区别?call 和 apply 哪个性能会更好?如何实现 callapplybind?