AJAX XML 应用程序
本章演示使用 XML、HTTP、DOM 以及 JavaScript 的 HTML 应用程序。
使用的 XML 文档
在本章中,我们将使用名为 "music_list.xml" 的 XML 文件。
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<CATALOG>
<TRACK>
<TITLE>再见</TITLE>
<ARTIST>邓紫棋</ARTIST>
<ALBUM>新的心跳</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>邓紫棋工作室</COMPANY>
<YEAR>2016</YEAR>
</TRACK>
<TRACK>
<TITLE>All I Ask</TITLE>
<ARTIST>Adele</ARTIST>
<ALBUM>25</ALBUM>
<COUNTRY>英国</COUNTRY>
<COMPANY>XL Recordings</COMPANY>
<YEAR>2015</YEAR>
</TRACK>
<TRACK>
<TITLE>之乎者也</TITLE>
<ARTIST>罗大佑</ARTIST>
<ALBUM>青春舞曲</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>滚石唱片</COMPANY>
<YEAR>1982</YEAR>
</TRACK>
<TRACK>
<TITLE>Never Be Alone</TITLE>
<ARTIST>Shawn Mendes</ARTIST>
<ALBUM>Handwritten</ALBUM>
<COUNTRY>加拿大</COUNTRY>
<COMPANY>环球唱片</COMPANY>
<YEAR>2015</YEAR>
</TRACK>
<TRACK>
<TITLE>慢慢</TITLE>
<ARTIST>张学友</ARTIST>
<ALBUM>忘记你我做不到</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>环球唱片</COMPANY>
<YEAR>1996</YEAR>
</TRACK>
<TRACK>
<TITLE>Complicated</TITLE>
<ARTIST>Avril Lavigne</ARTIST>
<ALBUM>Let Go</ALBUM>
<COUNTRY>加拿大</COUNTRY>
<COMPANY>索尼音乐</COMPANY>
<YEAR>2002</YEAR>
</TRACK>
<TRACK>
<TITLE>三生三世</TITLE>
<ARTIST>张杰</ARTIST>
<ALBUM>三生三世十里桃花</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>仁溪音乐</COMPANY>
<YEAR>2018</YEAR>
</TRACK>
<TRACK>
<TITLE>Five Hundred Miles</TITLE>
<ARTIST>Justin Timberlake</ARTIST>
<ALBUM>Inside Llewyn Davis</ALBUM>
<COUNTRY>美国</COUNTRY>
<COMPANY>华纳唱片</COMPANY>
<YEAR>2013</YEAR>
</TRACK>
<TRACK>
<TITLE>演员</TITLE>
<ARTIST>薛之谦</ARTIST>
<ALBUM>绅士</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>海蝶音乐</COMPANY>
<YEAR>2016</YEAR>
</TRACK>
<TRACK>
<TITLE>Numb</TITLE>
<ARTIST>Linkin Park</ARTIST>
<ALBUM>Meteora</ALBUM>
<COUNTRY>美国</COUNTRY>
<COMPANY>华纳唱片</COMPANY>
<YEAR>2003</YEAR>
</TRACK>
<TRACK>
<TITLE>给未来的自己</TITLE>
<ARTIST>梁静茹</ARTIST>
<ALBUM>崇拜</ALBUM>
<COUNTRY>马来西亚</COUNTRY>
<COMPANY>相信音乐</COMPANY>
<YEAR>2007</YEAR>
</TRACK>
<TRACK>
<TITLE>The Monster</TITLE>
<ARTIST>Rihanna</ARTIST>
<ALBUM>The Marshall Mathers LP2</ALBUM>
<COUNTRY>巴巴多斯</COUNTRY>
<COMPANY>环球唱片</COMPANY>
<YEAR>2013</YEAR>
</TRACK>
<TRACK>
<TITLE>我终于失去了你</TITLE>
<ARTIST>赵传</ARTIST>
<ALBUM>我终于失去了你</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>滚石唱片</COMPANY>
<YEAR>1989</YEAR>
</TRACK>
<TRACK>
<TITLE>Main Titles</TITLE>
<ARTIST>Ramin Djawadi</ARTIST>
<ALBUM>Game of Thrones</ALBUM>
<COUNTRY>德国</COUNTRY>
<COMPANY>索尼音乐</COMPANY>
<YEAR>2011</YEAR>
</TRACK>
<TRACK>
<TITLE>传奇</TITLE>
<ARTIST>李健</ARTIST>
<ALBUM>似水流年</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>北京完美坚持文化艺术工作室</COMPANY>
<YEAR>2003</YEAR>
</TRACK>
<TRACK>
<TITLE>完美生活</TITLE>
<ARTIST>许巍</ARTIST>
<ALBUM>时光漫步</ALBUM>
<COUNTRY>中国</COUNTRY>
<COMPANY>金牌大风</COMPANY>
<YEAR>2002</YEAR>
</TRACK>
</CATALOG>
在 HTML 表格中显示 XML 数据
本例遍历每个 <TRACK> 元素,然后在 HTML 表格中显示 <ARTIST> 和 <TITLE> 元素的值:
实例
- <html>
- <body>
- <table id="demo"></table>
- <script>
- function loadXMLDoc() {
- var xmlhttp = new XMLHttpRequest();
- xmlhttp.onreadystatechange = function() {
- if (this.readyState == 4 && this.status == 200) {
- myFunction(this);
- }
- };
- xmlhttp.open("GET", "music_list.xml", true);
- xmlhttp.send();
- }
- function myFunction(xml) {
- var i;
- var xmlDoc = xml.responseXML;
- var table="<tr><th>艺术家</th><th>曲目</th></tr>";
- var x = xmlDoc.getElementsByTagName("TRACK");
- for (i = 0; i <x.length; i++) {
- table += "<tr><td>" +
- x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue +
- "</td><td>" +
- x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue +
- "</td></tr>";
- }
- document.getElementById("demo").innerHTML = table;
- }
- </script>
- </body>
- </html>
如需更多有关使用 JavaScript 和 XML DOM 的信息,请访问 DOM 简介。
在 HTML div 元素中显示第一首曲子
本例使用一个函数在 id="displayMUSIC" 的 HTML 元素中显示第一首歌曲:
实例
- displayMUSIC(0);
- function displayMUSIC(i) {
- var xmlhttp = new XMLHttpRequest();
- xmlhttp.onreadystatechange = function() {
- if (this.readyState == 4 && this.status == 200) {
- myFunction(this, i);
- }
- };
- xmlhttp.open("GET", "music_list.xml", true);
- xmlhttp.send();
- }
- function myFunction(xml, i) {
- var xmlDoc = xml.responseXML;
- x = xmlDoc.getElementsByTagName("TRACK");
- document.getElementById("showMUSIC").innerHTML =
- "<ul>" +
- "<li>曲目:" +
- x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue + "</li>" +
- "<li>艺术家:" +
- x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue + "</li>" +
- "<li>专辑:" +
- x[i].getElementsByTagName("ALBUM")[0].childNodes[0].nodeValue + "</li>" +
- "<li>国家:" +
- x[i].getElementsByTagName("COUNTRY")[0].childNodes[0].nodeValue + "</li>" +
- "<li>公司:" +
- x[i].getElementsByTagName("COMPANY")[0].childNodes[0].nodeValue + "</li>" +
- "<li>年份:" +
- x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue + "</li>" +
- "</ul>";
- }
在曲目之间导航
如需在上例中的曲目间导航,请添加 next() 和 previous() 函数:
实例
- function next() {
- // 显示下一首歌曲,除非已到达最后一首
- if (i < x.length-1) {
- i++;
- displayMUSIC(i);
- }
- }
- function previous() {
- // 显示上一首歌曲,除非已到达第一首
- if (i > 0) {
- i--;
- displayMUSIC(i);
- }
- }
在点击歌曲时显示专辑信息
最后这个例子演示当用户点击某一首歌曲时如何显示专辑信息:
实例
- function displayMUSIC(i) {
- document.getElementById("showMUSIC").innerHTML =
- "<ul>" +
- "<li>曲目:" +
- x[i].getElementsByTagName("TITLE")[0].childNodes[0].nodeValue + "</li>" +
- "<li>艺术家:" +
- x[i].getElementsByTagName("ARTIST")[0].childNodes[0].nodeValue + "</li>" +
- "<li>专辑:" +
- x[i].getElementsByTagName("ALBUM")[0].childNodes[0].nodeValue + "</li>" +
- "<li>国家:" +
- x[i].getElementsByTagName("COUNTRY")[0].childNodes[0].nodeValue + "</li>" +
- "<li>公司:" +
- x[i].getElementsByTagName("COMPANY")[0].childNodes[0].nodeValue + "</li>" +
- "<li>年份:" +
- x[i].getElementsByTagName("YEAR")[0].childNodes[0].nodeValue + "</li>" +
- "</ul>";
- }