7

我有一个 Firefox 扩展,可以修改用户正在查看的页面内容。作为该过程的一部分,扩展需要触发扩展本身添加到页面源的自定义事件。我在将参数传递给该自定义事件时遇到了困难。我究竟做错了什么?

插入head页面的脚本块:

document.addEventListener("show-my-overlay", EX_ShowOverlay, false, false, true);

function EX_ShowOverlay(e) {
    alert('Parameter: ' + e.index);
    // ...
}

扩展中的代码:

var event = content.document.createEvent("Events");
event.initEvent("show-my-overlay", true, true);
event['index'] = 123;
content.document.dispatchEvent(event);

事件成功触发,但e.index未定义。

我设法通过在页面上创建一个元素然后让事件处理程序找到该元素并读取其属性来使其工作,但它并不优雅。我想在没有元素的情况下做到这一点。

编辑:

我也尝试用 触发事件CustomEvent,但它在处理程序中引发异常:

var event = new CustomEvent('show-my-overlay', { detail: { index: 123 } });
content.document.dispatchEvent(event);

function EX_ShowOverlay(e) {
    alert('Parameter: ' + e.detail.index);
    // ...
}

访问属性“详细信息”的权限被拒绝

4

2 回答 2

6

OP 已使用postMessage. 对于我们这些确实必须使用CustomEvent(能够指定消息类型很有用)来解决它的人,答案如下:

Firefox 不允许页面脚本访问内容脚本通过发送的详细信息对象中的任何内容,除非您首先使用 Firefox 特定的功能CustomEvent将事件详细信息克隆到文档中。cloneInto()

以下确实可以在这里将对象从扩展发送到页面:

var clonedDetail = cloneInto({ index: 123 }, document.defaultView);
var event = new CustomEvent('show-my-overlay', { detail: clonedDetail });
document.dispatchEvent(event);

Mozilla 文档有更多关于cloneInto.

于 2017-09-06T17:35:34.620 回答
2

您不能跨安全边界访问“expandos”(在本机原型对象上定义的附加属性)。在这种情况下,安全边界位于完全特权的 chrome(附加组件)代码和非特权网站代码之间。

所以你需要使用“标准”来传递数据。这些CustomEvent东西会做,但是你的代码是错误的。您必须调用构造函数或initCustomEvent()正确:

var event = new CustomEvent('show-my-overlay', { detail: { index: 123 } });
content.document.dispatchEvent(event);

另一种选择postMessageAPI

于 2013-09-11T16:10:55.533 回答