我们正在使用CrossRider为Internet Explorer开发扩展程序。我们有一个从http://jsons.[part_of_link_suppressed].com.s3.amazonaws.com/selectors.json下载的对象。我发现当这个对象被发送到回调时,数组被转换为具有整数键的对象。为什么数组转换为对象,有没有办法防止它?我知道我们可以通过调用函数JSON.stringify
对象和JSON.parse
,但有没有办法发送数组而不将它们转换为字符串?我检查了甚至['a','b','c']
在用它调用函数时转换为对象({"0":"a","1":"b","2":"c"}
)。
我使用的是Internet Explorer 11,但此扩展程序适用于所有版本的Internet Explorer。
编辑(1):我在Internet Explorer 11和Google Chrome中测试了调试模式。我创建了一个新的扩展程序 - ID 67708.在Chrome中它运行正常,在资源管理器中它没有。这是代码:
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"]
,在资源管理器中为{"0":"a","1":"b","2":"c"}
,在返回对象之前和之后。但是在我们的扩展程序(ID 43889)中,如果我们JSON.stringify
对象然后JSON.parse
它,那么它仍然是一个数组(我没有找到如何使用它来重现它简单的扩展)。
顺便说一句,如果我在资源管理器或Chrome中输入控制台JSON.stringify(['a','b','c'])
,我会得到相同的结果 - "["a","b","c"]"
。
我还发现了另一个恼人的错误 - CrossRider将我的登台扩展转换为生产,我必须再次切换到手动转移。两次扩展至少发生了5次。
修改(2):我尝试使用appAPI.JSON.stringify
代替JSON.stringify
,现在我在extension.js中的资源管理器中收到了正确的结果(["a","b","c"]
),但在调试模式下根本没有加载background.js并继续显示旧内容。我不知道是不是因为我在调试模式下有2个扩展但这是一个新的错误 - 当我点击"重新加载背景代码"时,background.js没有更新。
答案 0 :(得分:1)
我遇到了同样的问题,使用了消息api。不确定你的情况是什么(保存到DB时?)
虽然我不记得我的整个调试结果,我认为它是这样的: Crossrider api在内部将值序列化为JSON,以便通过postMessage /他们自己的实现发送它们以与后台IE进程进行后台通信(对于所有浏览器/非本地支持通过postMessage传递对象,例如IE8)。 他们没有使用本机JSON对象,而是(破坏)JSON实现(我认为只在他们的IE后台进程,因为它不是真正的浏览器页面,并且没有内置的JSON) 这意味着即使您在没有可用的原生JSON时使用他们的appAPI.JSON,您仍然可以获得损坏的数组。
我的解决方案是使用外部json库,认为我使用的是JSON3 http://bestiejs.github.io/json3/ http://cdnjs.cloudflare.com/ajax/libs/json3/3.3.2/json3.min.js 它的性能会降低,但如果它不是很大的对象,那就不会引人注意了。
你也可以尝试使用外部库修补他们的JSON appAPI.JSON,它可能会修复他们的api