Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/477.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript CrossRider—是否有一种方法可以将数组作为函数参数传递,而不将其转换为对象?_Javascript_Arrays_Json_Browser Extension_Crossrider - Fatal编程技术网

Javascript CrossRider—是否有一种方法可以将数组作为函数参数传递,而不将其转换为对象?

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

我们正在使用CrossRider开发Internet Explorer的扩展。我们有一个从下载的对象。我发现当这个对象被发送到回调时,数组被转换成具有整数键的对象。为什么数组会转换为对象?有什么方法可以阻止它?我知道我们可以通过调用函数
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可用,并且在所有目标平台中都能按预期工作,我想您可以直接使用它。