javascript - 在html中异步加载xml并分页显示
问题描述
我(非常)需要一些(跨浏览器)异步 xml 加载、转换和分页显示它通过一些 .xsl 样式表通过 .html 页面。
更准确地说,我需要的是 prev next last first html 链接功能正常工作!我设法创建了以下内容:
人.xml
<persons> <person> <surname>Smith</surname> <name>John</name> <age>44</age> <address>1 Fiction Street</address> <city>SouthLand</city> </person> <person> <surname>Hardcastle</surname> <name>Belinda</name> <age>37</age> <address>3rd. Rose Road</address> <city>DownTown</city> </person> <person> <surname>Elliot</surname> <name>George</name> <age>40</age> <address>21 Know Avenue</address> <city>Brownville</city> </person> <person> <surname>Jahore</surname> <name>Janice</name> <age>29</age> <address>14 Dragon Terrace</address> <city>Imagnry Town</city> </person> <person> <surname>Johnson</surname> <name>Tracey</name> <age>32</age> <address>11 Home Street</address> <city>Flowerville</city> </person> <person> <surname>Jalopy</surname> <name>Janus</name> <age>39</age> <address>63 Long Road</address> <city>Bigtown</city> </person> <person> <surname>Arthur</surname> <name>Bertrand</name> <age>45</age> <address>23 Sunrise Blvrd.</address> <city>MoonTown</city> </person> <person> <surname>Robert</surname> <name>Adolphe</name> <age>28</age> <address>32 East Lane</address> <city>Uptown</city> </person> <person> <surname>Eileen</surname> <name>Steward</name> <age>52</age> <address>12 Downsouth Blvrd.</address> <city>Albertville</city> </person> <person> <surname>Elizabeth</surname> <name>Parker</name> <age>62</age> <address>21 Jump Street</address> <city>San Thomas</city> </person> <person> <surname>Don</surname> <name>Stevens</name> <age>54</age> <address>10th Evergreen Terrace</address> <city>EastBourne City</city> </person> </persons>
分页显示样式表
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:variable name="groupSize" select="3"/>
<xsl:variable name="totRcrdNr" select="count(/persons/person)"/>
<xsl:param name="crrntPag" /> <!-- select="1" -->
<xsl:template match="/persons">
<html>
<body>
<h2 style="margin-left:67px">some persons listing</h2>
<table id="tbl" border="1" style="border-collapse:collapse;width:42%">
<tr bgcolor="#b0d2b8">
<th>Surname</th> <th>Name</th> <th>Age</th> <th>Address</th>
<th>City</th>
</tr>
<!-- select every first item in a group -->
<xsl:apply-templates select="person[position() mod $groupSize = 1]"/>
<tr class="tln">
<td colspan="3">
<xsl:if test="$groupSize * ($crrntPag - 1)>$crrntPag">
<span class="bpgn" style="margin-left:95px"> <!-- PREVIOUS and FIRST-->
<a href="#" onclick=" ">« </a> <!-- << -->
<a href="#" onclick=" ">‹ </a> <!-- < -->
</span>
</xsl:if>
</td>
<td colspan="1">
<xsl:if test="$crrntPag * $groupSize <=$totRcrdNr">
<span class="bpgn" style="margin-left:16px"> <!-- NEXT and LAST-->
<a href=" " onclick="init({$crrntPag + 1})">› </a> <!-- > -->
<a href="#" onclick=" ">» </a> <!-- >> -->
</span>
</xsl:if>
</td>
<td>pag: <xsl:value-of select="$crrntPag"/>/<xsl:value-of select="$totRcrdNr"/> </td>
</tr>
</table>
</body>
</html>
</xsl:template>
<xsl:template match="person">
<xsl:if test="position()=$crrntPag">
<!-- list self and following siblings within this group -->
<xsl:for-each select=". | following-sibling::person[position() < $groupSize]">
<tr>
<xsl:for-each select="child::*/child::text()">
<td> <xsl:value-of select="."/> </td>
</xsl:for-each>
</tr>
</xsl:for-each>
</xsl:if>
</xsl:template>
</xsl:stylesheet>
- file.js - 我通过它异步加载和显示该 xml 文件以及那些下一个 prev 链接 .html 表格边框的 js 脚本
var xmlhttp = null, xslhttp = null, xmlRspn = null, xslRspn = null,
xmlDetails = "xml/persn-en.xml",pass=0, pg,
xslDetails = "xml/pgd_tbl_style-en.xsl", div_id = "tbl_show";
init(pg);
function init(pg)
{
pass++;
if(pass == 1) // that's somethng. temporary
pg = 1
sendRequest(xmlDetails, xslDetails,pg)
}
function sendRequest(xmlURL, xslURL,pg)
{
xmlhttp = new XMLHttpRequest(); // first xmlHttpRequest for xml
if(xmlhttp)
{
xmlhttp.onreadystatechange = function()
{
if(xmlhttp.readyState == 4 && xmlhttp.status == 200)
{
xmlRspn = xmlhttp.responseXML;
doTrnsfrmGcko(div_id, xmlRspn, xslRspn,pg);
}
}
xmlhttp.open("get", xmlURL, true);
xmlhttp.send("");
}
xslhttp = new XMLHttpRequest(); // second xmlHttpRequest for xsl
if(xslhttp)
{
xslhttp.onreadystatechange = function()
{
if(xslhttp.readyState == 4 && xslhttp.status == 200)
{
xslRspn = xslhttp.responseXML;
doTrnsfrmGcko(div_id, xmlRspn, xslRspn,pg);
}
}
xslhttp.open("get", xslURL, true);
xslhttp.send("");
}
}
function doTrnsfrmGcko(docElement, xmlDoc, xslDoc,pg)
{
if(xmlDoc == null || xslDoc == null)
return;
else
{
var xsltProcessor = new XSLTProcessor();
xsltProcessor.importStylesheet(xslDoc);
xsltProcessor.setParameter(null,"crrntPag", pg); // stylesheet parameter passing over
var fragment = xsltProcessor.transformToFragment(xmlDoc,document);
document.getElementById(docElement).innerHTML = "";
document.getElementById(docElement).appendChild(fragment);
}
}
- index.html- 非常简单的 .html 页面,一切都在其中发生。
<html>
<head>
<script type="text/javascript" src="js/file.js"></script>
</head>
<body>
<!--<h3> List some people </h3> -->
<div id="tbl_show"></div>
</body>
</html>
好的,现在,如果有人从这里获取所有文件并将其放到他/她自己的计算机上,您会很快注意到任何一个链接都没有任何功能!因此,我需要您的支持才能使这些链接正常工作!第一个 上一个 下一个 最后一个 有一些类似小提琴的例子可以检查我对下一个前一个功能的意思:
https://jsfiddle.net/MrcaS48/2e9kq3v0
看,通过那里的链接正在工作!我只需要在这里完成同样的事情。
我的代码中有一些小的尝试,但都是错误的。我认为,主要是因为应该有 ajax 调用来使这些链接正常工作。再一次,你们帮我解决这个问题,因为我不知道该怎么做
非常感谢您提前
解决方案
您在一个 onclick 处理程序(例如init({$crrntPag + 1})
)中进行了正确的调用,但是如果您使用带有a href="#"
“按钮”的 HTML 链接来仅调用一些 Javascript 代码,则需要确保链接没有被return false
用作最后一条语句onclick 处理程序:
<a href="#" onclick="init({$crrntPag + 1}); return false;">...</a>
使用带有input type="button"
orbutton
元素而不是a
元素的简单按钮会更容易。
推荐阅读
- couchbase - 从 Couchbase 5.5 到 Couchbase 6.5 的 cbrestore/cbbackup
- mongodb - 分片集合时的 MongoDB 错误:未找到 ns
- vim - gVim 启动时出错:E121:未定义变量:paste#paste_cmd
- java - Jooq 全球文物重命名
- java - Scala 中的泛型类型
- go - gocqlx Updatebuilder 并得到错误的结果
- android - 我使用颤振制作了一个 android 应用程序,有没有办法从相同的代码构建一个 IPA?
- javascript - 使用 ReactJS Rails 6 从 Axios 将数据传回 prop
- javascript - 为什么Javascript绑定返回任何?
- python - 高错误 ARIMA 模型 - 计数和继续值 - Python