【问题标题】:CrossRider - is there a way to pass arrays as function parameters without converting them to objects?CrossRider - 有没有办法将数组作为函数参数传递而不将它们转换为对象?
【发布时间】: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


【解决方案1】:

我遇到了同样的问题,消息 api。不知道你的情况是什么(保存到数据库时?)

虽然我不记得我的整个调试结果,但我认为是这样的: 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

【讨论】:

  • 为什么我们应该使用appAPI.JSON.stringify而不是JSON.stringify等?它们有什么区别?
  • 向 corssrider 询问完整答案,我的回答:crossrider 不保证您可以访问所有浏览器 api。只是他们的api提供的。通常您可以访问所有浏览器 api,但在浏览器和背景/扩展代码之间会有所不同。
  • 如果您检查并且 JSON.stringify 可用并且在您的所有目标平台上按预期工作,我想您可以使用它。
猜你喜欢
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2022-09-27
  • 2017-07-10
  • 1970-01-01
  • 2013-07-11
  • 2023-01-27
  • 1970-01-01
相关资源
最近更新 更多