CrossRider - 有没有办法将数组作为函数参数传递而不将它们转换为对象?

时间:2014-11-13 14:01:33

标签: javascript arrays json browser-extension crossrider

我们正在使用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没有更新。

1 个答案:

答案 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