gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:02 25 4
gpt4 key购买 nike

我正在拼命地尝试创建一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com