我正在尝试从XML文档“jQuery方式”中提取一个唯一文本条目列表,并且正在进行攻击。
从这个XML:
<items>
<item>
<categories>
<cat>Category 1</cat>
<cat>Category 2</cat>
</categories>
</item>
<item>
<categories>
<cat>Category 2</cat>
<cat>Category 3</cat>
</item>
</items>
我想生成一个选择列表,如:
<select>
<option>Category 1</option>
<option>Category 2</option>
<option>Category 3</option>
</select>
到目前为止,我的所有尝试都产生了重复的“类别2”选项节点。我试图使用$ .unique()方法,但结果让我认为它只是比较节点名称而不是文本内容。这是我最新的hackery不起作用:
var filters = $("cat",xmldoc);
filters = $.unique(filters);
$(filters).each(function()
{
$("select").append("<option>" + $(this).text() + "</option>");
});
我可以想到一些标准的javascript技巧来实现这一点,但我希望有一个漂亮,优雅的jQuery方法来实现这一目标。
非常感谢任何提示或技巧。
谢谢!
答案 0 :(得分:2)
cat
元素不是重复的,因为它们具有相同的文本内容。它们仍然是具有自己不同身份的元素,因此unique
不会删除它们。
您必须将文本内容读入数组,然后从Array-of-String中删除重复项。
不幸的是,之后你也无法在String-of-String上使用unique
,因为它只支持DOM元素项。
在构建列表时,我只是删除了欺骗行为:
var cats= [];
$('cat', xmldoc).each(function() {
var text= $(this).text();
if ($.inArray(text, cats)===-1)
cats.push(text);
});
然后将每个选项添加到选择:
$.each(cats, function() {
$('select').append($('<option>').attr('val', this).attr('text', this));
});
通过将整个元素作为HTML传递,需要使用attr
和而不是来设置选项文本。当你从文本中创建HTML时,你必须HTML注释你注入HTML的任何文本字符串,否则你将有潜在的跨站点脚本安全漏洞。