1

我正在使用 JavaScript 和 XUL 编写一个 Firefox 扩展。我的部分代码需要能够采用一些 XUL 标记并将其动态附加到现有容器元素中。所以基本上我需要 appendChild() 但使用文本字符串而不是 Node 对象。为此,我尝试了问题中列出的方法。不幸的是,这似乎不起作用。似乎 div.childNodes 返回了一个空的 nodeList,我什至无法将其附加到容器中。错误是

Error: Could not convert JavaScript argument arg 0 [nsIDOMXULElement.appendChild]

我不太确定我做错了什么。有没有办法让这个工作,或者一些替代方法来动态设置容器的标记?

注意:容器元素的类型是richlistbox.

    function updateContainerData(containerName){
      try{
        var resultsArray = DB.queryAsync("SELECT nodeData FROM waffleapps_privateurl");

        container = document.getElementById(containerName);

        for (var i = 0; i < resultsArray.length; i++) {

            /*
            // This works - appending an actual Node ( duplicate from a template)
            template = document.getElementById("list-item-template");
            dupNode = template.cloneNode(true);
            dupNode.setAttribute("hidden", false);
            container.appendChild(dupNode);
            */

            // This doesn't work
            div = document.createElement("div");
            //var s = '<li>text</li>';
var s = "<richlistitem id ='list-item-template'><hbox><checkbox label='' checked='true'/>  <description>DESCRIPTION</description><textbox>test</textbox><textbox></textbox></hbox></richlistitem>";

            div.innerHTML = s;
            var elements = div.childNodes;

            container.appendChild(elements); // error

        }
        }
        catch(err){
          alert( "Error: " + err.message);
        }
    }

通过使用以下代码,我得到了更进一步的信息。现在我可以在容器中插入 HTML 元素,但似乎 XUL 元素没有正确解析 - 复选框和文本框没有出现。我不确定如何更改它以正确解析 HTML 和 XUL 标记。

    var s = "<richlistitem id ='list-item-template'><hbox><checkbox label='' checked='true'/>  <description>DESCRIPTION</description><textbox>test</textbox><textbox></textbox></hbox></richlistitem>";
    var dp = new DOMParser();
    container.appendChild(dp.parseFromString(s, "text/xml").documentElement);
4

2 回答 2

0

您需要为“元素”节点列表中的每个元素执行 appendChild(假设有多个)。

另请注意:列表元素应具有父 ol 或 ul 元素。

于 2012-05-14T01:46:33.493 回答
0

我终于想出了如何正确解析和附加 XUL 标记字符串。我能够parseFromString从新的DOMParser(). 我必须确保元素的标记指定了命名空间 ( xmlns),以便解析器知道它是 XUL 标记。

下面的代码显示了一个完整的示例。

测试.js:

test = function(){
    alert("testing");

    container = document.getElementById("testing");
    var dp = new DOMParser();

    // must specify namespace
    var s = "<textbox xmlns='http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul' value='test' size='20'></textbox>";

    element = dp.parseFromString(s, "text/xml").documentElement;

    container.appendChild(element);

    document.getElementById("testing");
}

测试.xul:

<?xml version="1.0"?>

<?xml-stylesheet type="text/css" href="chrome://global/skin/" ?>
<?xml-stylesheet type="text/css"
  href="chrome://testextensionname/skin/test.css" ?>

<!DOCTYPE window SYSTEM
  "chrome://testextensionname/locale/test.dtd">

<window xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul" 
        id="testWindow"
        orient="vertical" title="TEST" statictitle="TEST"
        width="50" height="50;" screenX="10" screenY="10"
       >
<script type="application/x-javascript" src="chrome://testextensionname/content/test.js" />

<hbox id="testing">
<button label="Go" oncommand="test()"/>
<textbox value='test' size='20'></textbox>
</hbox>

</window>
于 2012-05-14T04:55:04.310 回答