【发布时间】:2015-01-10 16:51:48
【问题描述】:
我们正在使用 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"]) 的 Explorer 中收到了正确的结果,但是 background.js在调试模式下根本不加载并继续显示旧内容。我不知道那是不是因为我在调试模式下有 2 个扩展,但这是一个新错误 - 当我单击“重新加载后台代码”时 background.js 没有更新。
【问题讨论】:
-
您是否检查过发送对象的不是您的服务器/PHP? (见stackoverflow.com/questions/19036994/…)
-
@Shlomo 这不是来自我们的服务器。我在调用函数之前和之后使用了
alert(JSON.stringify(object)),它们并不相同。第一个是数组,第二个是对象。 -
请将代码添加到问题中,以便我可以看到您所指的内容。或者,请提供可以找到代码 sn-p 的扩展名、文件和行号。
-
@Shlomo 我们有一个函数调用另一个函数,第二个函数返回
['a','b','c'],第一个函数接收{"0":"a","1":"b","2":"c"}。我们的Extension ID是43889,代码在msgHandler.jscase "loadParam":,如果我们JSON.stringify对象,然后通过其他函数JSON.parse那么对象是相同的,否则它们是不一样的。 -
谢谢...您的扩展程序中的代码既长又复杂。请您提供一个简化的代码 sn-p(或扩展)来演示该问题,我将进行调查。
标签: javascript arrays json browser-extension crossrider