Javascript 如何在Firefox插件XUL树中添加和删除行
在我的Firefox扩展中,我有一个简单的树,它有两列。我试图通过编程:Javascript 如何在Firefox插件XUL树中添加和删除行,javascript,tree,firefox-addon,xul,Javascript,Tree,Firefox Addon,Xul,在我的Firefox扩展中,我有一个简单的树,它有两列。我试图通过编程: 添加一行 删除所有行 我的XUL树: <tree flex="1" id="mytree" hidecolumnpicker="true"> <treecols> <treecol id="sender" label="Sender" flex="1"/> <treecol id="subject" label="Subject" flex="2"/>
- 添加一行
- 删除所有行
<tree flex="1" id="mytree" hidecolumnpicker="true">
<treecols>
<treecol id="sender" label="Sender" flex="1"/>
<treecol id="subject" label="Subject" flex="2"/>
</treecols>
<treechildren>
</treechildren>
</tree>
这没有错误,树只是没有添加行。我知道代码在运行,因为如果我添加一个alert()
它就会触发
Javascript我已尝试删除所有行:
var tree = document.getElementById("mytree");
tree.view.data = {};
tree.view.treeBox.rowCountChanged(0, -1);
这会产生一个错误:
document.getElementById(“mytree”).view.treeBox未定义
编辑:
在Wladimir建议直接添加XUL元素之后,这将添加一行:
var treeChildren = document.getElementById("my_tree_children");
var treeitem = document.createElement('treeitem');
var treerow = document.createElement('treerow');
var treecell_1 = document.createElement('treecell');
var treecell_2 = document.createElement('treecell');
treecell_1.setAttribute('label', 'John');
treecell_2.setAttribute('label', 'something');
treerow.appendChild(treecell_1);
treerow.appendChild(treecell_2);
treeitem.appendChild(treerow);
treeChildren.appendChild(treeitem);
虽然在本例中是硬编码的,但单元格(标签属性)的值将来自用户输入。在将用户输入直接放入XUL元素的属性中时,我应该使用什么样的编码/转义方法来防止XSS?让我这样问:为什么它会工作?文档告诉我们这是一个实例。而
nsITreeView
没有名为data
的属性。尽管如此,您可以设置此属性并不意味着它将执行任何操作
现在,您实际如何将数据放入树
小部件中?说明有几种树类型,根据类型,数据可能来自不同的位置。您可能希望使用默认选项—内容树。这意味着您需要为数据中的每一行创建treeitem
元素,并将这些元素添加到treechildren
元素中,如中所示。可以使用常用的DOM方法动态生成这些元素
树
小部件还可以从RDF或XML数据源自动生成其内容。但是,如果您的数据位于JavaScript对象中,唯一的替代方法是创建一个自定义的nsITreeView
实现,并将其分配给树视图。但这并不是很简单,而且通常是一种过分的做法。我已经尝试了你的建议-请参见问题中的编辑,我仍然无法以这种方式添加行。我认为你添加的行是正确的,它没有任何文本。不,你应该使用而不是innerHTML
。但这不是这里的问题-要在treecell
中显示的文本应该放在label
属性中,请参见。@WladimirPalant您完全正确。它与setAttribute()
一起工作。最后一个问题-防止XUL属性上出现XSS的最佳做法是什么,因为内容将来自用户输入-请参阅我的编辑。不要使用innerHTML
:)其他DOM方法不会让您在无意中创建标记。@WladimirPalant感谢您的帮助。如果可能的话,我会投票给你(需要+2代表)@ServerBloke:对不起,我错了+谢谢你的努力。
var treeChildren = document.getElementById("my_tree_children");
var treeitem = document.createElement('treeitem');
var treerow = document.createElement('treerow');
var treecell_1 = document.createElement('treecell');
var treecell_2 = document.createElement('treecell');
treecell_1.setAttribute('label', 'John');
treecell_2.setAttribute('label', 'something');
treerow.appendChild(treecell_1);
treerow.appendChild(treecell_2);
treeitem.appendChild(treerow);
treeChildren.appendChild(treeitem);