簡體   English   中英

GWT-JSNI在外部JS庫中傳遞JavaScriptObject

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM