Javascript 如何修复:“;对非NPObject包装的JSObject调用了NPMethod“;错误?
嗨 我试图从javascript调用flash对象中定义的方法 (firefox-3.0/Linux)并获得异常:“NPMethod已调用 非- NPObject包装的JSObject” 如果我对window.document.flash\u object.func()使用eval,它会抛出 “对非NPObject包装的JSObject调用了NPMethod” 其中,如果我在给定的页面中定义javascript函数 下: 函数myFunc(){ 返回flash_object.func() } 然后对window.document.myFunc()进行评估,结果正常 我正在通过一个名为Selenium的测试框架运行这两个eval。 [eval(window.document.flash_object.func())和 eval(window.document.myFunc())] 问题似乎在于调用flash对象方法而不传递“this”引用。下面是重现此问题的示例html/js代码:“在非NPObject包装的JSObject上调用NPMethod”Javascript 如何修复:“;对非NPObject包装的JSObject调用了NPMethod“;错误?,javascript,flash,firefox,Javascript,Flash,Firefox,嗨 我试图从javascript调用flash对象中定义的方法 (firefox-3.0/Linux)并获得异常:“NPMethod已调用 非- NPObject包装的JSObject” 如果我对window.document.flash\u object.func()使用eval,它会抛出 “对非NPObject包装的JSObject调用了NPMethod” 其中,如果我在给定的页面中定义javascript函数 下: 函数myFunc(){ 返回flash_object.func() } 然
函数changeColor(){
mymovie.changeColor();
}
函数getColorNP(){
var func=mymovie.getColor;
func();
}
getColorNP
getColor
getColorNP抛出异常
错误:对非NPObject包装的JSObject调用了NPMethod!
源文件:http://my.host/Colors/colors.html
getColorNP抛出异常
错误:对非NPObject包装的JSObject调用了NPMethod!
源文件:http://my.host/Colors/colors.html
现在,向javascript大师提问:
给定flash对象和方法名,如何调用该对象上的方法。比方说,函数接受两个参数:一个flash对象和一个方法名作为字符串。我想对该函数中的object.method()进行求值。这可能吗?如果可能的话,请你解释一下如何做到这一点
由于flash对象的方法不是标准的javascript函数,我认为不可能通过bind()进行函数绑定。还有其他选择吗
Thx,
钱德拉你看了吗
我也在使用selenium,有两个项目支持flex/flash:
FlashSelenium:是Selenium RC客户端驱动程序的扩展,它使Selenium RC客户端测试驱动程序能够调用Flex应用程序的ActionScript方法。FlashSelenium依靠开发人员手动公开Flex应用程序特定的方法和组件。
Selenium Flex API:是Selenium IDE的扩展,是一种自动公开Flex应用程序UI组件的机制
我最近开始使用它们,并且在firefox上运行测试时遇到了与您提到的相同的问题(NPMethod在非NPObject包装的JSObject上调用!),并且当javaScript来自另一个窗口时,firefox似乎不允许javaScript调用Flash
在我的例子中,通过使用*firefoxproxy调用selenium解决了这个问题
关于,将调用包装到闭包中是可以的(并且您不需要求值)当您尝试将flash函数(本机代码)设置为某个变量,然后调用该变量时,会发生此错误。 以您的函数为例:
function getColorNP() { // this will call error
var func = mymovie.getColor;
func();
}
function getColorNP() { //this will work
mymovie.getColor();
}
如果您需要将flash函数保存到某个变量,您应该使用lambda函数包装它。像这样:
function getColorNP() { // this will work also
var func = function(){mymovie.getColor()};
func();
}
因此,当您在javascript中使用flash函数时,您不应该停止链接链。这是一个变体,在尝试在flash中设置jQuery窗口焦点/模糊事件处理程序时,我遇到了“在非NPObject包装的JSObject上调用NPMethod”错误,如下所示:
if (ExternalInterface.available) {
ExternalInterface.addCallback("on_focus", on_activate);
ExternalInterface.addCallback("on_blur", on_deactivate);
ExternalInterface.call("eval", "if ($) $(window).focus($('object')[0].on_focus);");
ExternalInterface.call("eval", "if ($) $(window).blur($('object')[0].on_blur);");
}
修复方法是通过添加额外的函数闭包来延迟SWF选择器:
if (ExternalInterface.available) {
ExternalInterface.addCallback("on_focus", on_activate);
ExternalInterface.addCallback("on_blur", on_deactivate);
ExternalInterface.call("eval", "if ($) $(window).focus(function() { $('object')[0].on_focus() });");
ExternalInterface.call("eval", "if ($) $(window).blur(function() { $('object')[0].on_blur() });");
}
if (ExternalInterface.available) {
ExternalInterface.addCallback("on_focus", on_activate);
ExternalInterface.addCallback("on_blur", on_deactivate);
ExternalInterface.call("eval", "if ($) $(window).focus($('object')[0].on_focus);");
ExternalInterface.call("eval", "if ($) $(window).blur($('object')[0].on_blur);");
}
if (ExternalInterface.available) {
ExternalInterface.addCallback("on_focus", on_activate);
ExternalInterface.addCallback("on_blur", on_deactivate);
ExternalInterface.call("eval", "if ($) $(window).focus(function() { $('object')[0].on_focus() });");
ExternalInterface.call("eval", "if ($) $(window).blur(function() { $('object')[0].on_blur() });");
}