繁体   English   中英

使用JavaScript过滤DOM中的XML数据

[英]Filter XML Data in DOM with JavaScript

我有一个正在尝试学习JavaScript的简单项目。 我能够使用JavaScript将数据调用到html文档中。 接下来,我想使用搜索功能过滤该列表。 但是,我在JavaScript文件的第38行收到错误。

if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {

我不明白为什么类型是不确定的。 我确实发现这意味着它尚未分配值。 如果我误解了所读内容,请纠正我。 不确定接下来要去哪里。 任何帮助将不胜感激。 我不是一个只想学习的菜鸟的上师。

的HTML

<!html doctype>
<html>
<head>
<meta charset="utf-8"/>
</head>
<body>
<h2>XMLHttpRequest</h2>
<input type="text" id="myInput" onkeyup="myFunction()" placeholder="Search 
for names.."/>
<div id="output"></div>
</body>
<script type="text/javascript" src="script.js"></script>
</html>

的JavaScript

function init(){

    var xhttp = new XMLHttpRequest();
    xhttp.onreadystatechange = function (){
        if (this.readyState ==4 && this.status == 200){
            console.log(this.responseXML);
            var schools = this.responseXML.getElementsByTagName("school");
            var strOut = "<ul id='myUL'>";
            for(i=0; i<schools.length; i++){
                var name = schools[i].getElementsByTagName("name") 
[0].innerHTML;
                var web = schools[i].getElementsByTagName("web") 
[0].innerHTML;
                strOut += "<li><ahref='"+web;
                strOut += "' target='_blank'>" + name + "</a></li>";
        }
        strOut += "</ul>";
        document.getElementById("output").innerHTML = strOut;
    }

};

xhttp.open('get', 'myXML.xml', true);
xhttp.send();
}
window.onload = init;

//Filter List
function myFunction() {
// Declare variables
var input, filter, ul, li, a, i;
input = document.getElementById('myInput');
filter = input.value.toUpperCase();
ul = document.getElementById("myUL");
li = ul.getElementsByTagName('li');

// Loop through all list items, and hide those who don't match the search 
query
for (i = 0; i < li.length; i++) {
    a = li[i].getElementsByTagName("li")[0];
    if (a.innerHTML.toUpperCase().indexOf(filter) > -1) {
        li[i].style.display = "";
    } else {
        li[i].style.display = "none";
    }
}
}

XML格式

<?xml version="1.0" encoding="UTF-8"?>
<sites>
    <school>
        <name>Middle Georgia State University</name>
        <web>http://www.mga.edu</web>
    </school>
    <school>
        <name>Columbus State University</name>
        <web>http://www.columbusstate.edu</web>
    </school>
    <school>
        <name>University of Georgia</name>
        <web>http://www.uga.edu</web>
    </school>
</sites>

由于您已经在代码的下面一行中提取了一个li标签数组:

li = ul.getElementsByTagName('li');

因此,无需在for循环内再次使用“ getElementsByTagName”函数,而只需使用以下数组索引即可访问li元素:

a = li[i];

另外,如果条件使用innerText函数,则不要使用innerHTML函数,因为innerHTML将返回li元素内部的完整锚标记,而innerText仅返回li元素中的学校名称。

完成此操作后,您的for循环将如下所示:

// Loop through all list items, and hide those who don't match the search query
for (i = 0; i < li.length; i++) {
    a = li[i];
    if (a.innerText.toUpperCase().indexOf(filter) > -1) {
        li[i].style.display = "";
    } else {
        li[i].style.display = "none";
    }
}

您有两种错别字:
1. strOut += "<li><ahref='"+web; 应该是strOut += "<li><a href='"+web;
2. a = li[i].getElementsByTagName("li")[0]; 应该是a = li[i].getElementsByTagName("a")[0];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM