Javascript CrossRider—是否有一种方法可以将数组作为函数参数传递,而不将其转换为对象?
我们正在使用CrossRider开发Internet Explorer的扩展。我们有一个从下载的对象。我发现当这个对象被发送到回调时,数组被转换成具有整数键的对象。为什么数组会转换为对象?有什么方法可以阻止它?我知道我们可以通过调用函数Javascript CrossRider—是否有一种方法可以将数组作为函数参数传递,而不将其转换为对象?,javascript,arrays,json,browser-extension,crossrider,Javascript,Arrays,Json,Browser Extension,Crossrider,我们正在使用CrossRider开发Internet Explorer的扩展。我们有一个从下载的对象。我发现当这个对象被发送到回调时,数组被转换成具有整数键的对象。为什么数组会转换为对象?有什么方法可以阻止它?我知道我们可以通过调用函数JSON.stringify对象和JSON.parse,但是有没有一种方法可以发送数组而不将其转换为字符串?我检查了,甚至在调用函数时,['a','b','c']都被转换为对象({“0”:“a”,“1”:“b”,“2”:“c”}) 我使用的是Internet Ex
JSON.stringify
对象和JSON.parse
,但是有没有一种方法可以发送数组而不将其转换为字符串?我检查了,甚至在调用函数时,['a','b','c']
都被转换为对象({“0”:“a”,“1”:“b”,“2”:“c”}
)
我使用的是Internet Explorer 11,但此扩展应适用于所有版本的Internet Explorer
编辑(1):我在Internet Explorer 11和Google Chrome中测试了调试模式。我创建了一个新的扩展名-ID67708。在Chrome中,它可以正常工作,在Explorer中则不行。代码如下:
background.js:
/************************************************************************************
This is your background code.
For more information please visit our wiki site:
http://docs.crossrider.com/#!/guide/scopes_background
*************************************************************************************/
function callme1() {
var r1 = ['a','b','c'];
alert('r1 = ' + JSON.stringify(r1));
return r1;
}
appAPI.ready(function($) {
// Place your code here (ideal for handling browser button, global timers, etc.)
alert('callme1() = ' + JSON.stringify(callme1()));
});
extension.js:
/************************************************************************************
This is your Page Code. The appAPI.ready() code block will be executed on every page load.
For more information please visit our docs site: http://docs.crossrider.com
*************************************************************************************/
function callme2() {
var r2 = ['a','b','c'];
alert('r2 = ' + JSON.stringify(r2));
return r2;
}
appAPI.ready(function($) {
// Place your code here (you can also define new functions above this scope)
// The $ object is the extension's jQuery object
// alert("My new Crossrider extension works! The current page is: " + document.location.href);
alert('callme2() = ' + JSON.stringify(callme2()));
});
在Chrome中,所有警报都是[“a”、“b”、“c”]
,在Explorer中,它们是{“0”:“a”、“1”:“b”、“2”:“c”}
,在返回对象之前和之后。但是在我们的扩展(ID43889)中,如果我们JSON.stringify
对象,然后JSON.parse
它,那么它仍然是一个数组(我没有找到如何用简单的扩展重现它)
顺便说一下,如果我在Explorer或Chrome中的控制台JSON.stringify(['a','b','c'])
中键入,我会得到相同的结果-“[“a”,“b”,“c”]”
我还发现了另一个恼人的错误——CrossRider将我的登台扩展转换为生产,我必须再次手动切换到登台。这两个扩展都至少发生了5次
编辑(2):我尝试使用
appAPI.JSON.stringify
而不是JSON.stringify
,现在我在Explorer的extension.js中收到了正确的结果([“a”、“b”、“c”]
),但是background.js根本没有在调试模式下加载,并且一直显示旧的内容。我不知道这是否是因为我在调试模式下有2个扩展,但这是一个新的错误-当我单击“重新加载背景代码”时background.js没有更新。我也有同样的问题,消息api。不确定您的情况(保存到DB时?)
虽然我不记得我的全部调试结果,但我认为是这样的:
Crossrider api将值内部序列化为JSON,以便通过postMessage发送它们/它们自己的实现与后台IE进程进行后台通信(对于所有浏览器/本机不支持通过postMessage例如IE8传递对象)。
他们没有使用本机JSON对象,而是使用(不完整的)JSON实现(我认为只在他们的IE后台进程中使用,因为它不是真正的浏览器页面,也没有内置JSON)
这意味着,即使在没有本地JSON可用的情况下使用它们的appAPI.JSON,仍然会得到损坏的数组
我的解决方案是使用外部json库,我想我使用的是JSON3
它的性能会降低,但如果它不是真正的大对象,它就不会引人注目
您还可以尝试使用外部库对他们的JSON appAPI.JSON进行修补,这可能会修复他们的api您是否检查过发送对象的不是您的服务器/PHP?(看)@Shlomo它不是来自我们的服务器。我在调用函数之前和之后使用了
alert(JSON.stringify(object))
,它们是不同的。第一个是数组,第二个是对象。请将代码添加到问题中,以便我可以看到您所指的内容。或者,请提供代码段所在位置的扩展名id、文件和行号。@Shlomo我们有一个函数调用另一个函数,第二个函数返回['a','b','c']
,第一个函数接收{“0”:“a”,“1”:“b”,“2”:“c”}
。我们的扩展ID是43889,代码位于msgHandler.js
案例“loadParam”:
,如果我们JSON.stringify
对象,然后通过另一个函数JSON.parse
,那么对象是相同的,否则它们是不同的。谢谢。。。扩展中的代码既长又复杂。请您提供一个简化的代码片段(或扩展)来演示问题,我将对此进行调查。为什么我们应该使用appAPI.JSON.stringify
而不是JSON.stringify
等。?它们之间有什么区别?请咨询corssrider以获得完整答案,我的答案是:crossrider不保证您可以访问所有浏览器api。只是他们的api提供了什么。通常,您可以访问所有浏览器API,但在不同的浏览器和背景/扩展代码中会有所不同。如果您选中了,并且JSON.stringify可用,并且在所有目标平台中都能按预期工作,我想您可以直接使用它。