我正在拼命尝试在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.js中,h1是目标的默认值。

但是我的steps值是正确的,当我在控制台中执行相同的命令时,它可以工作:
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):

但是当我使用jsni方法时,局部作用域绝对不同,我的参数存储为实际数组,而不是正常处理(更大的图像here):

最佳答案

问题在于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)从顶部窗口将阵列复制到阵列中。

10-02 10:21