我正在维护Firefox的叠加插件。要通过Mozilla的附加组件验证过程,我必须替换操作DOM元素内容的innerHTML()
调用。
我创建了一个表的新单元格,并希望使用这种方法设置内容:
var newCell = tbl.rows[row].insertCell(col);
var div = document.createElement('div');
div.appendChild(document.createTextNode(content));
newCell.appendChild(div);
错误信息是:
TypeError: Argument 1 of Node.appendChild does not implement interface Node.
EventTargetChild.prototype.handleEvent@resource://gre/modules/RemoteAddonsChild.jsm:461:5
EventTargetChild/this.capturingHandler@resource://gre/modules/RemoteAddonsChild.jsm:431:38
在行之间添加日志消息表明新cell
和div
元素的类型不同:
var newCell = tbl.rows[row].insertCell(col);
console.log("cell-0: " + newCell);
var div = document.createElement('div');
console.log("div-0: " + div);
div.appendChild(document.createTextNode(content));
console.log("div-1: " + div);
console.log("cell-1: " + newCell);
newCell.appendChild(div);
console.log("cell-2: " + newCell);
日志消息是:
cell-0: [object CPOW [object HTMLTableCellElement]]
div-0: [object XULElement]
div-1: [object XULElement]
cell-1: [object CPOW [object HTMLTableCellElement]]
我在这里做错了什么想法?
提前致谢。
答案 0 :(得分:1)
cell-0:[object CPOW [object HTMLTableCellElement]]
CPOW是cross process object wrapper,这意味着它来自子进程,或者至少来自传递API的消息。您未以e10s-safe方式访问DOM。
div-0:[对象XULElement]
Morecover您正在创建一个XUL元素(特定于Mozilla的XML命名空间)并尝试将其插入HTML文档中。这意味着您可以跨文档边界进行操作(CPOW已经暗示了这一点)。本地范围中的document
对象不是tbl
的{{3}}。
因此,即使跨进程问题不存在,您仍然会错误地使用DOM。
如果您想与内容文档的DOM进行交互,则应使用ownerDocument。它们是支持Addon SDK和webextension内容脚本的低级原语。
此外,您可以设置<em:multiprocessCompatible>true</em:multiprocessCompatible>
message manager and frame scripts,这将禁用兼容性填充程序或在about:config中启用dom.ipc.shims.enabledWarnings
,这会导致警告/错误被提起,如果你&#39;重新尝试访问任何不安全的API。