Firefox 扩展将 Javascript 数组作为对象发送

2024-02-21

我在将 JavaScript 数组传递给我正在编写的附加组件时遇到问题附加生成器 https://builder.addons.mozilla.org/.

为了进行通信,我使用事件并使用数组发送事件,但附加组件(内容脚本)获取一个对象,而不是数组。

这是事件:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script>
<script type="application/x-javascript">

$(function() {
    $(window).bind('Runner-PageEvent', function(event) {
        console.log('PAGE: Reakcja na Runner-PageEvent na stronie');
    });

    $(window).bind('RunnerResult', function(event) {
        console.log('PAGE: Result is ' + event.originalEvent.detail.Result);

//// PROBLEM!!!
        console.log('PAGE: Should be array: ' + event.originalEvent.detail.array); // firebug shows object

        });

    $(window).bind('Runner-DetectCallback', function(event) {
        console.log('PAGE: Reakcja na Runner-DetectCallback na stronie');
        $('#browser-detection').text('Extension detected').css('background-color', 'green').css('color', 'white');
    });

    var event = new CustomEvent("Runner-Detect", {});
    window.dispatchEvent(event);
    console.log('PAGE: Runner-Detect sent');
});

function CallExtension() {
    var event = new CustomEvent("Runner-PageEvent", { detail : {
            a: "messageA",
            b: "messageB",
            c: "messageC",
            d: "messageD",
            arrayA: ["a", "b", "c", "d"],
            arrayB: [0, "info", "info2", 3]
        }});
    window.dispatchEvent(event);
    console.log('PAGE: CALL EXTENSION clicked');
}

</script> 
</head>
<body>
<div id="browser-detection" style="background-color: red">No extension</div>
<br/>
Run extension: <button onclick="CallExtension()">Run!</button>
</body>
</html>

Firebug 将事件显示为具有一个属性的对象detail.tab作为包含四个项目的数组。

内容脚本接收一个对象e, where e.detail.tab是一个对象(但应该是一个数组)。

window.addEventListener(
    'eventname', 
    function(e) { 
        // console.log(e.detail.tab.length); -> produce an error on console (Ctrl+Shift+J)
        // console.log(e.detail.tab[0]); -> as above
        for(var x in e.detail.tab){
            console.log(x);
            console.log(e.detail.tab[x]);
        }            
        self.port.emit('SendToExtension', e.detail);
    }
);


不知道是Add-on Builder有问题还是我做错了什么?
请帮忙!


似乎有一个错误CustomEvent() https://developer.mozilla.org/en-US/docs/DOM/Event/CustomEvent将信息传入和传出沙箱(XPCNativeWrapper https://developer.mozilla.org/en-US/docs/XPCNativeWrapper)。它的序列化不正确CustomEventInit.detail在某些情况下的价值,并且在第一次这样的情况之后,未能通过detail根本没有价值——表明正在发生某种内存/状态损坏。

  1. 以下内容请参考此测试页:jsbin.com/ajegib/1 http://jsbin.com/ajegib/1.

  2. 安装或在“测试”模式下运行此 Firefox 附加组件:CustomEvent data_ 跨沙箱 https://builder.addons.mozilla.org/package/156591/latest/.

  3. 请注意,测试网页和扩展程序的内容脚本都具有如下代码:

    window.addEventListener ("EventWithArrayData", function (zEvent) {
        console.log (
            "Event detail: ", zEvent.detail, Array.isArray (zEvent.detail)
        );
    } );
    
    var zEvent = new CustomEvent ("EventWithArrayData",
        {"detail": [5,6,7] }
    );
    window.dispatchEvent (zEvent)
    
  4. Open both Firebug's console, and the Firefox Error Console (CtrlShiftJ) to observe the results as custom events with array values for detail are sent. (You can press the Normal array data button, to send them.)

What should happen:

网页和扩展程序都应该将两个事件的数据视为数组。

  1. The Firebug安慰should展示:

    **The Normal button was pressed.**
    In web page (Normal) from page: [1, 2, 3]  true
    In web page (Normal) to page: [5, 6, 7]  true
    
  2. The FF Error安慰should展示:

    info: In Content Script (Normal) from page:  1,2,3 true
    info: In Content Script (Normal) to page:  5,6,7 true
    

What does happen:

  1. On the 第一个活动:

    1. The Firebug控制台显示:

      **The Normal button was pressed.**
      In web page (Normal) from page: [1, 2, 3]  true
      In web page (Normal) to page: {0: 5, 1: 6, 2: 7}  false
      
    2. The FF Error控制台显示:

      info: In Content Script (Normal) from page:  [object Object] false
      info: In Content Script (Normal) to page:  5,6,7 true
      
  2. On the 所有后续事件:

    1. The Firebug控制台显示:

      **The Normal button was pressed.**
      In web page (Normal) from page: [1, 2, 3]  true
      In web page (Normal) to page: null  false
      
    2. The FF Error控制台显示:

      info: In Content Script (Normal) from page:  [object Object] false
      info: In Content Script (Normal) to page:  null false
      

Observe:

  1. 在所有情况下,web page正确地看到自己的事件发送的数组数据。它看到一个数组。
  2. 但是,该扩展看到的是一个类似数组的对象。
  3. 从扩展发送的数组数据在第一次传递时对扩展正确显示,但在所有后续尝试中都为空。
  4. 从扩展发送的数组数据在页面上显示为对象,然后根本不显示(null)!

解决方法:

Both 自定义事件文档 https://developer.mozilla.org/en-US/docs/DOM/Event/CustomEvent and DOM 标准 http://dom.spec.whatwg.org/#interface-customevent声明eventInitDict.detail可以有任何类型。但对于通过附加沙箱发送的事件,情况显然并非如此。
好像没有火狐浏览器的错误 https://bugzilla.mozilla.org/index.cgi为了这。也许我们应该开一个。

不管怎样,似乎有效的解决方法是对我们发送的数据进行 JSON 编码CustomEvent().

像这样发送:

var detailVal   = JSON.stringify ( [1, 2, 3] );

var zEvent = new CustomEvent ("EventWithJSON_Data",
    {"detail": detailVal }
);
window.dispatchEvent (zEvent)

像这样接收:

window.addEventListener ("EventWithJSON_Data", function (zEvent) {
    var datArray    = JSON.parse (zEvent.detail);
    console.log (
        "JSON data: ", datArray, Array.isArray (datArray)
    );
} );


You can see this at work on the test page + extension by pressing the JSON-encoded array data button. (Be sure to refresh the page first to clear the corruption discussed above.)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Firefox 扩展将 Javascript 数组作为对象发送 的相关文章

随机推荐

  • Elixir:修改模块属性值

    是否有可能实现以下行为 其中尝试更改模块属性的值以改变模块方法的行为 defmodule Adder do num to add 10 def addTo input do input num to add end IO inspect A
  • 重新签署包含框架的 IPA

    我正在重新签名 iOS 应用程序 使用 iResign 以便将其上传到 App Store 作为其中的一部分 我正在更改捆绑包 ID 我只有 IPA 没有源代码 该应用程序包含第三方框架 辞职似乎进展顺利 但是当我使用应用程序加载器上传时
  • application.properties中的spring boot .env变量

    我已经创建了 env 文件 我现在在其中保存变量 我希望它们在我的 application properties 中定义 但这不起作用 我需要添加什么来获取变量 env 文件 MYSQLDB USER root MYSQLDB ROOT P
  • TopoJSON 属性保留

    我正在使用 topojson 转换现有的 GeoJSON 数据集 但它不保留属性 它遵循标准 GeoJSON 格式 并将属性放置在与几何图形同一级别的 属性 对象中 下面的片段 但是当 topojson 成功完成时 我最终会得到一个可以使用
  • 在两个逻辑 CPU 之间共享 TLB 条目 (Intel)

    我想知道当属于同一程序且具有相同PCID的两个线程被安排在同一物理CPU上运行时是否可以共享TLB条目 我已经研究过SDM https www intel com content www us en developer articles t
  • 通过电子邮件或手机在 Laravel 中重置密码

    默认情况下 Laravel 5 5 的密码重置系统适用于电子邮件 但我需要添加对手机号码的支持 通过 OTP 验证并生成令牌并重定向到密码重置页面 我正在做所有这部分 并且我在password resets表上创建了一个移动列 但问题是 I
  • .CSHTML 页面将不会呈现

    我正在尝试让我的服务器运行 cshtml 文件 使用 WebMatrix 3 我可以通过右键单击并选择 在浏览器中查看 来查看页面 但该查看是通过本地计算机端口进行的 如果我尝试从 Internet 访问这些页面 则会收到 500 错误 这
  • ASP.NET Core 和 JQuery 不显眼的 AJAX 无法正常工作

    如果我在 net 4 5 中启动一个新项目并点击 管理 nuget 包 搜索 ajax 然后点击 安装 ajax unobtrusive 然后我可以进入我的 cshtml 文件并输入 Ajax 例如 Ajax beginForm 如果我使用
  • Yii - 从 URL 中消除模块的默认控制器 ID

    我创建了一个模块 其中存在一个默认控制器 现在我可以访问默认控制器中的索引操作 默认操作 例如 mymodule 对于所有其他操作 我需要在 url 中指定控制器 id 例如 mymodule default register 我想知道是否
  • JavaScript 遍历数组并用下一个减去每个项目

    我有一个如下所示的数组 0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 21 19 22 20 23 我想
  • Git 在提交时指定用户和电子邮件?

    我们已经在测试服务器上创建了代码分支 多个用户现在正在通过 SSH 连接到新服务器并使用命令行进行所有提交来处理该代码 但是 Git 当然不知道是谁进行了更改并提交了这些更改 因此我们需要在提交期间指定作者 我认为我们可以通过以下方式实现这
  • 是否可以使用 Jigsaw 在 Java 9 中通过反射来访问包作用域的方法?

    我有以下代码来检索默认值URLStreamHandlers对于 http 和 https 它通过访问静态包作用域方法在 Java 8 中工作URL getURLStreamHandler private URLStreamHandler g
  • 编辑构建 R 包时生成的默认 PDF 手册

    我已成功执行以下步骤来创建我自己的 R 包 创建包的骨架并粘贴 Rd NAMESPACE and DESCRIPTION files 被处决R CMD check package name 没有错误 它还生成了 2 个 pdf 其中之一包含
  • 具有动态数组的 VBA 字典

    我正在尝试创建包含动态数组的动态字典 电子表格中的示例行 Facility Name Contact Name Contact Role 设施和联系人之间的关系是M2M 我想重新创建一个如下所示的工作表 Contact Name Facil
  • 持久化图形数据 (Java)

    我有一个利用图形 树状 自定义结构的应用程序 这些结构不是真正的树 但几乎所有东西都连接在一起 数据量也很大 可以存在数百万个节点 树节点的类型可以不同 以使其更有趣 继承 我不想改变数据结构来适应持久性存储 我想保留这些数据而不需要太多额
  • 在两个不同模式中使用两个同名表时避免 Hibernate Annotation Exception

    我有两个表 都在两个不同的模式中命名为 Language 我们将它们称为 schema1 和 schema2 当我注释每个表的模型时 我的代码如下所示 实体 Table 名称 语言 目录 模式1 公开课语言 Entity Table nam
  • 资源 FullCalendar 中的固定列宽

    我正在使用支持资源视图的 FullCalendar 特殊版本 http tux fi jarnok fullcalendar resourceviews http tux fi jarnok fullcalendar resourcevie
  • SQL删除表中不重复的条目

    我有一个有两列的表格CountryCode CountryName 中存在重复条目countrycode 但我想删除不重复的条目并保留重复的行countrycode柱子 所以我想写一个SQL语句来做到这一点 我想我必须使用having 但不
  • Ruby on Rails 生成视图

    有没有办法使用railsgenerate命令单独生成视图 我也愿意安装一个 gem 来完成现有的任务 基本上 脚手架命令给了我太多的东西 我宁愿手动编写我的控制器 但是 使用记录表编写索引视图的效率不是很高 您可以使用控制器生成器生成控制器
  • Firefox 扩展将 Javascript 数组作为对象发送

    我在将 JavaScript 数组传递给我正在编写的附加组件时遇到问题附加生成器 https builder addons mozilla org 为了进行通信 我使用事件并使用数组发送事件 但附加组件 内容脚本 获取一个对象 而不是数组