GWT-JSNI在外部JS库中传递JavaScriptObject

时间:2015-07-02 08:45:11

标签: javascript java gwt jsni

我决定尝试在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事件上调用,因此所有的资源都被加载和呈现。因此,当显示元素并调用函数时,我在控制台中出现此错误:

  

无法找到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时,局部范围看起来像这样(更大的图像here):

local scope for the console commands

但是当我使用jsni方法时,本地范围完全不同,我的参数存储为实际数组而不是正常处理(更大的图像here):

enter image description here

2 个答案:

答案 0 :(得分:2)

问题是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/Array/isArray
而且jQuery也有一个,这让我觉得难以理解的是Anno并没有使用它而不是使用破碎的if arg.__proto__ is Array.prototype(除非是设计)。首先要做的是:在Anno上提出问题。

作为一种变通方法,应该可以使用$wnd.Array.apply($wnd.Array, steps)从顶部窗口将数组复制到数组中。

答案 1 :(得分:0)

在我看来,错误消息说它无法找到目标dom元素而不能找到目标属性。当您的代码被触发时,元素是否存在?确保它是,并回到我身边。