[英]GWT-JSNI passing a JavaScriptObject in an external JS library
我瘋狂地試圖在JSNI方法中創建一個Anno對象,但我有一個奇怪的問題:jsni方法中的代碼不起作用,但如果我在瀏覽器控制台中執行相同的操作,則可以正常工作。
Java部分
我正在使用JSONArray
,我添加了一些JSONObject
(包含所有元素,根據Anno doc)。 這是我的JSNI方法:
// I'm using the getJavaScriptObject() on my JSONArray
private static native void launch( JavaScriptObject steps )/*-{
var anno = new $wnd.Anno(steps);
anno.chainIndex().show();
}-*/;
瀏覽器部分
為了清楚onShow
,該方法在onShow
事件上調用,因此所有的ressource都被加載和呈現。 因此,當顯示元素並調用函數時,我在控制台中出現此錯誤:
找不到Anno.target'h1'。 --- anno.js:265
注意:在Anno.js中,h1是目標的dafault值。
但我的步驟值是正確的,當我在控制台中執行相同的命令時,它可以工作:
var testAnno = new Anno([{
content: "namespinnerFrequencyA",
position: "center-right",
target: ".dataAuto0"
},{
content: "chooseFrequencyB",
position: "top",
target: ".dataAuto1"}]);
testAnno.show();
我不明白為什么它在一個案例中起作用而在另一個案例中起作用。 我也試過使用JSON.stringify
然后JSON.parse
但它也不起作用。
編輯:
我想出了什么。 在調試anno.js時我想到了一些東西:當我在控制台中初始化Anno時,本地范圍看起來像這樣( 這里的圖像更大):
但是當我使用jsni方法時,本地范圍完全不同,我的參數存儲為實際數組而不是正常處理( 此處更大的圖像):
問題是GWT代碼在iframe中運行(用於沙盒/隔離),Anno僅支持來自相同瀏覽上下文的數組類型。
有關描述,請參見http://perfectionkills.com/instanceof-considered-harmful-or-how-to-write-a-robust-isarray/和http://web.mit.edu/jwalden/www/isArray.html問題。
ECMAScript 5.1添加了一個Array.isArray()
函數來解決這個問題並且具有廣泛的瀏覽器支持(備份到IE9): https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/磁盤陣列/ IsArray的
而且jQuery也有一個,這使得我不能理解Anno不使用它而不是使用破壞的if arg.__proto__ is Array.prototype
(除非它是設計的)。 首先要做的事情是:在Anno上提出一個問題。
作為一種解決方法,應該可以使用$wnd.Array.apply($wnd.Array, steps)
將數組從頂部窗口復制到一個數組中。
在我看來,錯誤消息說它無法找到目標dom元素,而不是它找不到目標屬性。 當您的代碼被觸發時,元素是否存在? 確保它是,並回到我身邊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.