通过解析XML通过多个过滤器过滤UL
Filtering an UL by multiple filters by parsing XML
现在,我正在做我的第一个真正的编程项目,但是现在,我遇到了一个问题。我有一个无序列表,每个过滤条件有一个列表项。看起来像这样:
<li data-xml-code="gefäße-vorhanden" class="FilterListElement">Gefäße Vorhanden</li>
<li data-xml-code="splintholz-farblich-abgesetzt" class="FilterListElement">Splintholz farblich vom Kernholz abgesetzt</li>
它们中的每一个都包含一个名为"data-xml-code"的数据属性,使以后的引用成为可能。另一个脚本是添加一个名为"selected"的额外类到列表元素,通过CSS突出显示它们。大约有60个不同的条件需要过滤,因此请将此代码作为示例。
我的xml结构看起来像这样:
<wood_data>
<wood id="fagus_sylvatica">
<name lang="de">Rotbuche</name>
<name lang="en">European beech</name>
<scientific_name>Fagus sylvatica</scientific_name>
<attributes>
<attribute>gefäße-vorhanden</attribute>
<attribute>splintholz-farblich-abgesetzt</attribute>
</attributes>
</wood>
<wood id="some_tree">
...
</wood>
</wood_data>
还有第二个列表,它直接由xml文件中的名称标记构建而成。正如您所期望的那样,它基于xml中树木的id标记创建列表条目。最后看起来像这样:
<li id="fagus_sylvatica" class="WoodListElement">European beech</li>
我问你的是如何在jQuery中构建一个函数,它做以下事情:
- 检查所有的filterlistelement,也有class="selected",并从他们获得"data-xml-code"属性
- 解析xml,并隐藏WoodList中缺少至少一个选定过滤器标签的每个元素。
我的问题是,我找不到一种方法来比较这两组不同的值。你能告诉我怎么做吗?
最终解决方案:非常感谢Shilly,我拿了你的代码并从中学到了很多。在将它与其他线程的一些输入结合起来之后,我想在这里展示工作的最终代码:
function advancedFilter (){
$(this).toggleClass("selected");
activeFilters = [];
$('li.selected[data-xml-code]').map(function() {
activeFilters.push($(this).attr('data-xml-code'));
});
$.ajax({
url: 'xml/wooddata.xml',
type: 'get',
dataType: 'xml',
success: function(data) {
$(data).find('wood').each(function (){
var currentID = $(this).attr("id");
var attr = $(this).find('attributes');
//count = 0;
found = [];
attr.children().map(function(){
found.push($(this).text());
});
var diff = $(activeFilters).not(found).get();
if(diff!=0){
$('.WoodListElement[id="' + currentID + '"]').slideUp();
}else{
$('.WoodListElement[id="' + currentID + '"]').slideDown();
};
});
}
});
};
1)获取data-xml-code
选中的元素。类似于(我的jquery不是100%,所以如果你复制/粘贴,请仔细检查):
var codes = $('li .FilterListElement .selected').map(function (el) {
return el.getAttribute('data-xml-code');
});
2)从xml中获取值。使用标签名和nodevalue
var xmlAttributes = function xmlAttributes( xml ) {
var attr = xml.getElementsByTagName('attributes')[0],
count,
found = [];
for (count = 0; count < attr.childNodes.length; count += 1) {
found.push(attr.childNodes[count].nodeValue);
}
return found;
};
3)您可以用函数解析每个xml片段以获得xml具有的属性列表,并将其与我们从列表元素中提取的代码列表进行比较,这是微不足道的。我建议将解析过的属性保存在某个地方,这样您只需要解析xml一次。就我个人而言,我通常在保存传入的xml之前将其转换为json,这样我可以更容易地访问值,并且只需为每个记录解析xml一次。
相关文章:
- 在单独的ul's
- 为什么我的d3.jsselectAll+过滤器没有过滤
- Angularjs-utils高亮过滤器在搜索时破坏应用程序
- Angular-表的多列过滤器
- 如何“;过滤器”;或者以其他方式重构该数据
- 将所选类别循环到ul>李用加载更多按钮
- 使用jquery动态创建ul-li
- 使用下拉列表筛选列表(ul>li)
- Angularjs通过过滤器获取indexOf
- 如何附加<ul><李>元素位于某个特定条件的父元素列表之间
- ui网格日期单元格过滤器,过滤日期格式导致显示错误的日期
- 使用按钮的Angular UI网格过滤器
- :not选择器不适用于ul类-备选方案
- KendoUI网格行过滤器,带有布尔值下拉列表
- 如何在angular.js中动态应用自定义过滤器
- 在验证器中添加自定义规则以检查<ul>具有元素
- 在JQuery中隐藏和显示ul中的特定元素
- 使用 jquery 获取外部父 UL
- 通过解析XML通过多个过滤器过滤UL
- 当组的所有 ul>li 不包含过滤器词时隐藏