2010-03-17 52 views
3

HI,如何解決:「NPMethod調用非NPObject包裝JSObject」錯誤?

我試圖調用從JavaScript (火狐-3.0/Linux)或獲取異常flash對象定義的方法: 「NPMethod呼籲 非 NPObject包裹JSObject」。

如果我在window.document.flash_object.func()上使用eval,它會拋出 「在非NPObject上調用的NPMethod包裝JSObject」。

凡爲,如果我在側限定一個JavaScript功能的頁面下面給出 :

函數myFunc的(){ 返回flash_object.func();

}

,後來做window.document.myFunc的eval()函數,它工作正常。

我正在通過名爲Selenium的測試框架運行這兩個evals。 [eval(window.document.flash_object.func())和 eval(window.document.myFunc())]。

這個問題似乎是調用flash對象方法而不傳遞this參考的問題。這裏是示例html/js代碼來重現此問題:「NPMethod調用非NPObject包裝JSObject」。現在

<script> 
function changeColor() { 
    mymovie.changeColor(); 
} 
function getColorNP() { 
var func = mymovie.getColor; 
func(); 
} 
</script> 
<button type="button" onclick="getColorNP();">getColorNP</button> 
<button type="button" onclick="getColor();">getColor</button> 

getColorNP throws the exception 
Error: NPMethod called on non-NPObject wrapped JSObject! 
Source File: http://my.host/Colors/colors.html 
getColorNP throws the exception 
Error: NPMethod called on non-NPObject wrapped JSObject! 
Source File: http://my.host/Colors/colors.html 

,問題JavaScript的大師: 鑑於Flash對象和方法名,我該如何調用該對象的方法。比方說,一個函數有兩個參數:一個flash對象和一個方法名字符串。我想對該函數內的object.method()進行評估。如果可能的話,這是否可能,請你向我解釋如何做到這一點。由於Flash對象的方法不是標準的JavaScript函數,我認爲它不可能通過bind()函數進行綁定。還有其他的選擇嗎?

THX, 錢德拉

回答

1

你看看Calling a Flex/AS3 Callback from Javascript

我使用硒以及和有這兩個項目以支持Flex /閃光:

FlashSelenium:是一個擴展到Selenium RC客戶端驅動程序,使Selenium RC客戶端測試驅動程序可以調用Flex應用程序的ActionScript方法。 FlashSelenium依賴開發人員手動公開Flex應用程序特定的方法和組件。 http://code.google.com/p/flash-selenium/

Selenium Flex API:是Selenium IDE的一種擴展,它是一種自動公開Flex應用程序UI組件的機制。 http://code.google.com/p/sfapi/

我最近開始使用它們,並得到了同樣的問題(NPMethod稱爲非NPObject包裝JSObject!),當在Firefox上運行測試時,似乎firefox不允許在JavaScript從另一個窗口調用Flash時調用Flash 。

在我的情況下,這個問題是通過使用* firefoxproxy調用selenium解決的。

問候,

1

結束語呼叫到一個封閉的罰款(你不需要EVAL)

0
function callFlash(domobj, method_name){ 
    domobj[method_name]() 
} 
6

此錯誤occures當您嘗試設置閃光燈功能(本機代碼)一些變量,然後調用這個變量。如果你需要你的閃光功能保存一些變量,你應該lambda函數把它包

function getColorNP() { // this will call error 
var func = mymovie.getColor; 
func(); 
} 

function getColorNP() { //this will work 
mymovie.getColor(); 
} 

任何方式: 作爲一個例子把你的功能。像這樣:

function getColorNP() { // this will work also 
var func = function(){mymovie.getColor()}; 
func(); 
} 

所以,當你在JavaScript中使用flash函數,你不應該制動然後鏈接鏈。

+1

謝謝,這是一個救星...... – 2013-07-09 15:36:20

+0

感謝的人,爲我節省了很多時間 – sleepycal 2014-05-07 14:27:06

0

在這方面的一個變化,我得到了「NPMethod呼籲非NPObject包裹JSObject」的錯誤,而試圖建立一個jQuery窗口焦點/模糊的事件處理程序在Flash中,像這樣:

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() });"); 
    }