我是TryAgain的开发人员之一,这是一个Firefox附加组件,当网站无法加载时会显示自定义错误页面。它基本上用自定义版本替换Firefox的netError.xhtml
。
但是,我遇到了3.0。* - 3.6。*和Fx4b5之间的一些相当终端的兼容性问题。 (netError.dtd中的条目已重命名,导致一个版本或另一个版本中的XML解析错误。)
要解决这个问题,我决定让扩展动态修改页面,而不是完全替换它。我需要在Fx3中添加到netError.xhtml
的元素之一是<xul:button>
。但是,通过使用以下代码添加它,屏幕上不会显示任何内容:
var div = document.getElementById("errorContent");
var btn = document.createElement("xul:button");
btn.setAttribute("label", "Hello world");
btn.setAttribute("oncommand", "alert('Hello world!');");
div.appendChild(btn);
我在Mozilla开发人员中心看到there is this note:
createElement的Gecko实现不符合XUL和XHTML文档的DOM规范:在创建的元素上,localName和namespaceURI未设置为null。有关详细信息,请参阅bug 280692。
这需要什么,我该如何解决?
此外,如何通过JavaScript执行oncommand
事件?
答案 0 :(得分:1)
document.createElement()不接受限定名称。你传递的“xul:button”字符串使它创建一个名为“xul:button”的元素(==它的localName
),而不是一个XUL“button”元素。
另一方面,在解析XML时,&lt; xul:button&gt;被解析为限定名称:解析器搜索对应于xul前缀的命名空间(来自其中一个父元素中的xmlns:xul=""
定义)并在其找到的命名空间中创建“button”元素。
关于不符合XUL和(X)HTML的DOM规范的说明意味着您可以使用常规document.createElement("buttton")
相应地在XUL或HTML文档中的XUL或HTML命名空间中创建元素。
或者你可以努力工作并使用:
var XUL_NS = "http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul";
document.createElementNS(XUL_NS, "button")
或者甚至使用合格的名称,而不是有任何理由这样做:
document.createElementNS(XUL_NS, "xul:button")