firefox NPMethod called on non-NPObject wrapped JSObject!错误

  Firefox使用JavaScript调用flash中注册的方法时,如果此方法通过js函数返回后执行,而不是直接通过swf容器获取到后再执行,那么在Firefox下会出现“NPMethod called on non-NPObject wrapped JSObject!”错误,其他浏览器如chrome,ie不报错。

  解决办法就是直接通过swf的容器获取到flash中注册的方法后执行,而不是通过js方法返回flash中注册的方法。

  测试代码如下

as脚本

function loadPicture(){
//......代码......
//......代码......
}

flash.external.ExternalInterface.addCallback("forJS", null, loadPicture);//注册JavaScript中调用的回调函数

HTML测试代码

<script type="text/javascript">
document.write('<div class="dvswf">' + (document.all ? '<object id=swfId classid=clsid:D27CDB6E-AE6D-11cf-96B8-444553540000><param name="src" value="/images/loadSwf.swf"></object>'
: '<embed id="swfId" type="application/x-shockwave-flash" src="/images/loadSwf.swf"/>') + '</div>');

function $(Id){return document.getElementById(Id);}
function getFlashMethod(swfID, container) {
    if (window[swfID] && window[swfID].forJS) return container ? window[swfID] : window[swfID].forJS;
    if (document[swfID] && document[swfID].forJS) return container ? document[swfID] : document[swfID].forJS;
    if ($(swfID).forJS) return container ? $(swfID) : $(swfID).forJS;
    return false;
}
function callswfmethod(container) {
    var o = getFlashMethod('swfId', container);
    if (o) {//能获取到注册的JavaScript回调方法或者swf容器
        container ? o.forJS()//为容器时从容器中直接获取flash.external.ExternalInterface.addCallback注册的函数然后执行Firefox和其他浏览器未报错
        : o(); //如果返回的是flash.external.ExternalInterface.addCallback注册的函数,firefox 执行此方法会出现“NPMethod called on non-NPObject wrapped JSObject!”错误,其他浏览器如chrome,ie不报错
    }
}
</script> 
<input type="button" value="调用flash.external.ExternalInterface.addCallback注册的函数--返回函数" onclick="callswfmethod()" />

<input type="button" value="调用flash.external.ExternalInterface.addCallback注册的函数--返回flash容器" onclick="callswfmethod(true)" />

 

加支付宝好友偷能量挖...


原创文章,转载请注明出处:firefox NPMethod called on non-NPObject wrapped JSObject!错误

评论(0)Web开发网
阅读(194)喜欢(0)JavaScript/Ajax开发技巧