我正在拼命尝试在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)
从顶部窗口将阵列复制到阵列中。