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

标签 javascript java gwt jsni

我正在拼命地尝试创建一个 Anno JSNI 方法中的对象,但我有一个奇怪的问题:jsni 方法中的代码不起作用,但如果我在浏览器控制台中执行相同的操作,它就可以正常工作。

Java 部分

我正在使用 JSONArray,我在其中添加了一些 JSONObject(根据 Anno 文档,包含所有元素)。这是我的 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 事件上调用的,因此所有资源都已加载并呈现。因此,当显示元素并调用函数时,我的控制台中出现此错误:

Couldn't find Anno.target 'h1'. --- anno.js:265

注意:在 Anno.js 中,h1 是 target 的默认值。

但我的步骤值是正确的,当我在控制台中执行相同的命令时它起作用了:

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

最佳答案

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

关于javascript - GWT-JSNI 在外部 JS 库中传递 JavaScriptObject,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31179690/

相关文章:

javascript - setTimeout(x, 0) 在 Chrome 中不会延迟

java - 关于分位数估计的可重复性

java - 如何以编程方式移动 GWT Horizo​​ntalSplitPanel 的拆分器?

java - GWT 服务异常日志记录的最佳实践

javascript - 在 Javascript 中转义错误消息

javascript - Jquery 单击成功或完成时触发

javascript - Javascript 中的归约函数

java - Linux (centos)、openjdk 8、openjfx 和 netbeans 8

java - 如何在Spark 2.3.1中使用map和reduce函数进行分组和计数

java - 通过 uiBinder - GWT 从 Panel 更改 MenuBar 样式