2010-02-09 55 views
2

我试图从一个XML文档“jQuery方式”拉出一个独特的文本条目列表,并打到了墙上。如何使用jQuery选择具有独特文本内容的XML节点?

从这个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()方法,但结果让我觉得它只是比较节点名称,而不是文本内容。这是我不工作的最新两轮牛车:

var filters = $("cat",xmldoc); 
filters = $.unique(filters); 
$(filters).each(function() 
{ 
    $("select").append("<option>" + $(this).text() + "</option>"); 
}); 

我能想到的一些标准的JavaScript技巧来做到这一点,但我希望有一个漂亮的,优雅的jQuery的方式来退出这个功能。

任何提示或技巧将不胜感激。

谢谢!

回答

2

cat元素不会因为它们具有相同的文本内容而重复。他们仍然是拥有自己不同身份的元素,因此unique不会将其删除。

您必须将文本内容读取到数组中,然后从字符串数组中删除重复项。

不幸的是,之后你也不能在字符串数组上使用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)); 
}); 

选项文本需要使用attr设置

构建列表时,我只是做了去除重复数据删除而不是作为HTML传入整个元素。当你从文本制作HTML时,你必须HTML转义你注入到HTML中的任何文本字符串,否则你会有潜在的跨站点脚本安全漏洞。

+0

与我曾经想过的事情交织在一起。感谢您的确认.... inArray()它会。 :) – Brian 2010-02-10 22:00:27

相关问题