这几天制作一个系统的邮编区号查询功能,突发奇想制作了这个js+xml版的。在javascript中使用xml的xpath老是提示错误(郁闷ing),后来终于找到了症结所在(^o^),原来使用 Microsoft.XMLDOM 必须显式声明其SelectionLanguage属性为XPath:
var myXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
myXmlDoc.setProperty("SelectionLanguage","XPath");
利用xpath也就实现了javascript对xml的模糊查询(我这里用到了“等于...”、“包含...”、“以...开头”、“以...结尾”),我也可以放下邮编区号查询js+xml版去忙别的了 :>
显示效果图示
下面是邮编区号查询js+xml版的核心代码:
1、data.xml文件代码(这里只列了5条,明白他的结构就可以):
<?xml version="1.0" encoding="gb2312"?>
<!-- 邮编区号数据 -->
<MyData>
<Item Province="北京" County="北京" Zipcode="100000" Areacode="010" />
<Item Province="北京" County="通县" Zipcode="101100" Areacode="010" />
<Item Province="北京" County="昌平" Zipcode="102200" Areacode="010" />
<Item Province="北京" County="大兴" Zipcode="102600" Areacode="010" />
<Item Province="北京" County="密云" Zipcode="101500" Areacode="010" />
</MyData>
2、index.htm文件代码(这个就是主界面拉)
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<title>js+xml的邮编区号查询</title>
<style type="text/css">
<!--
body,td,th {
font-size: 12px;
}
body {
text-align:center;
background-color:#fefefe;
margin: 0px;
}
.mainTable{
background-color:#FFFFFF;border:1px solid #dddddd;
}
.foot{
line-height:20px;text-align:left;
}
.foot a:link,.foot a:visited,.foot a:active{
background-color: #f0f0f0;width:45px; height:20px;
margin:5px 0px 0px 0px;padding:3px 3px 2px 3px;
border-right:1px solid #cccccc;border-bottom:1px solid #cccccc;
border-top:1px solid #f5f5f5;border-left:1px solid #f5f5f5;
color:#000000;text-align:center;
line-height:14px;font-size:12px;
}
.head td{
font-size:14px; letter-spacing:2px;
border-bottom:1px solid #dddddd;
text-align:center;height:24px;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#fafafa', endColorStr='#f0f0f0', gradientType='0');
}
.Item{
font-size:12px;height:20px;
text-indent:5px;
border-bottom:1px solid #dddddd;
background-color:#fafafa;
}
.Over{
font-size:12px;height:20px;
text-indent:5px;
border-bottom:1px solid #dddddd;
background-color:#f5f5f5;
}
.SearchBar {
font-size:12px; letter-spacing:2px;
border-bottom:1px solid #dddddd;
padding:5px 0px 3px 0px;
margin:4px 0px 4px 0px;
text-align:center;height:24px;
FILTER: progid:DXImageTransform.Microsoft.Gradient(startColorStr='#f5f5f5', endColorStr='#eeeeee', gradientType='0');
}
.SearchBar input.textfield{
border-top:1px solid #dddddd;border-left:1px solid #dddddd;
border-right:1px solid #ffffff;border-bottom:1px solid #ffffff;
BACKGROUND-COLOR: #f5f5f5;line-height:18px;
width:240px;HEIGHT: 22px;
}
.SearchBar span.button{
BORDER: 1px outset #f0f0f0;
BACKGROUND-COLOR: #fafafa;
width:50px;HEIGHT: 20px;
padding:3px 3px 2px 3px;
cursor:hand;
}
.Waiting{
background-color:#FFFFFF;
border:1px solid #dddddd;
margin-top:20px;
}
.Waiting span{
width:6px; height:20px; background-color:#999999; margin:-5px 2px -5px 2px;
}
-->
</style>
<script language="JavaScript">
<!--
var pubXmlDoc,pubXmlPath,pubDivWaiting,pubDivSearchBar,pubHolder,pubFoot;
window.attachEvent("onload", CacheXml);
//功能:预先加载xml数据
function CacheXml() {
self.defaultStatus = "Downloading Xml Data...";
pubXmlPath="data.xml"; //设置xml文件路径
pubDivWaiting=document.getElementById("Waiting"); //等待效果div
pubDivSearchBar=document.getElementById("SearchBar"); //搜索工具条div
pubHolder=document.getElementById("insertdiv"); //数据显示div
pubFoot=document.getElementById("footdiv"); //数据统计及分页div
pubDivWaiting.style.display="";
pubDivSearchBar.style.display="none";
pubXmlDoc = new ActiveXObject("Microsoft.XMLDOM");
pubXmlDoc.async=true; //设置异步传输
pubXmlDoc.load(pubXmlPath);
pubXmlDoc.onreadystatechange=function(){
if(pubXmlDoc.readyState==4){
if( pubXmlDoc == null || pubXmlDoc.documentElement == null) {
return ;
}
self.defaultStatus = 'ok';
pubDivWaiting.style.display="none";
pubDivSearchBar.style.display="";
}
}
window.setTimeout(function(){pubXmlDoc.load(pubXmlPath);},10);
}
//功能:按条件检索数据
function Data_Search(KeyWords,KeyField,regExpType){
KeyWords=KeyWords.replace(/(^/s*)|(/s*$)/g, "");
KeyField=KeyField.replace(/(^/s*)|(/s*$)/g, "");
regExpType=parseInt(regExpType,10);
if(KeyWords==""||KeyWords==null){
alert("请输入查询关键词!/n");
}else{
pubDivWaiting.style.display="";
pubHolder.innerHTML="";
pubFoot.innerHTML="";
self.defaultStatus = "Loading...";
setTimeout("Data_Load('"+KeyWords+"','"+KeyField+"',"+regExpType+")",1000);
}
}
//功能:按条件加载xml数据
function Data_Load(KeyWords,KeyField,regExpType){
var myTableID="Table_";
var myPageSize=20;
var myPageIndex=1;
pubXmlDoc.setProperty("SelectionLanguage","XPath");
var myXPathExpr;
switch(regExpType){
case 0: //等于
myXPathExpr="//Item[@"+KeyField+"='"+KeyWords+"']";
break;
case 1: //包含
myXPathExpr="//Item[contains(@"+KeyField+",'"+KeyWords+"')]";
break;
case 2: //以...开头
myXPathExpr="//Item[starts-with(@"+KeyField+",'"+KeyWords+"')]";
break;
case 3: //以...结尾
myXPathExpr="//Item[contains(@"+KeyField+",'"+KeyWords+"') and string-length(substring-after(@"+KeyField+",'"+KeyWords+"'))=0]";
break;
default: //等于
myXPathExpr="//Item[@"+KeyField+"='"+KeyWords+"']";
break;
}
var myNodes = pubXmlDoc.documentElement.selectNodes(myXPathExpr);
var myTable,myTr,myTd;
for (var i=0;i<myNodes.length;i++){
if(i==(myPageIndex-1)*myPageSize){
myTable=document.createElement("<table id='"+ myTableID + myPageIndex +"' style='display:none; width:100%;' border=0>");
myTable.className="mainTable";
myTr=myTable.insertRow();
myTr.className="Head"; //设置表头css
myTd=myTr.insertCell(); myTd.innerText="省份";
myTd=myTr.insertCell(); myTd.innerText="地区";
myTd=myTr.insertCell(); myTd.innerText="邮编";
myTd=myTr.insertCell(); myTd.innerText="区号";
}
myTr=myTable.insertRow();
myTr.className="Item"; //设置内容css
myTd=myTr.insertCell(); myTd.innerText=myNodes(i).getAttribute("Province");
myTd=myTr.insertCell(); myTd.innerText=myNodes(i).getAttribute("County");
myTd=myTr.insertCell(); myTd.innerText=myNodes(i).getAttribute("Zipcode");
myTd=myTr.insertCell(); myTd.innerText=myNodes(i).getAttribute("Areacode");
myTr.attachEvent("onmouseover",ItemOver); //添加鼠标悬浮事件
myTr.attachEvent("onmouseout",ItemOut); //添加鼠标离开事件
if((i+1)==myPageIndex*myPageSize||(i+1)==myNodes.length){
pubHolder.appendChild(myTable); //增加表格
var mySpan=document.createElement("<span>");
mySpan.innerHTML=" <a href='#' onClick='javacript:PageChange(/""+ myTableID + myPageIndex +"/")'>第"+myPageIndex+"页</a> ";
pubFoot.appendChild(mySpan);
myPageIndex++;
}
}
if(myNodes.length>0){
var myInfo=document.createElement("<span>");
var myPageNum=(myPageIndex*myPageSize>myNodes.length)?(myPageIndex-1):myPageIndex;
myInfo.innerHTML="共计【"+myNodes.length+"】条信息,每页"+ myPageSize+"条,分"+myPageNum+"页显示。";
pubFoot.appendChild(myInfo);
PageChange(myTableID +"1");
}else{
var myInfo=document.createElement("<span>");
myInfo.innerHTML=" 对不起,没找到任何相关数据...";
pubFoot.appendChild(myInfo);
}
pubDivWaiting.style.display="none";
self.defaultStatus = 'ok';
}
//功能:换页显示
function PageChange(showID){
var pubHolder=document.getElementById("insertdiv");
for(var i=0;i<pubHolder.childNodes.length; i++){
var myNode = pubHolder.childNodes[i];
if (myNode.nodeName.toLowerCase()=="table") {myNode.style.display="none";}
}
document.getElementById(showID).style.display="";
}
//功能:鼠标悬浮效果
function ItemOver(){
var t=event.srcElement.parentElement;
t.origClassName=t.className;
t.className="Over";
}
//功能:鼠标离开还原设置
function ItemOut(){
var t=event.srcElement.parentElement;
t.className=t.origClassName;
}
//-->
</script>
</head>
<body>
<div id="control" style="width:560px;">
<div id="SearchBar" class="SearchBar" style="width:100%;">
<select name="Select_Field" id="Select_Field">
<option value="Province" selected>省份</option>
<option value="County">地区</option>
<option value="Zipcode">邮编</option>
<option value="Areacode">区号</option>
</select>
<select name="Select_Reg" id="Select_Reg">
<option value="0" selected>等于</option>
<option value="1">包含</option>
<option value="2">以...开头</option>
<option value="3">以...结尾</option>
</select>
<input name="Text_Words" type="text" id="Text_Words" value="山东" class="textfield">
<span onClick="javascript:Data_Search(document.getElementById('Text_Words').value,document.getElementById('Select_Field').value,document.getElementById('Select_Reg').value)" class="button">搜索</span>
</div>
<div id="insertdiv" style="width:100%;"></div>
<div id="footdiv" class="foot" style="width:100%;"></div>
<div id="Waiting" class="Waiting" style="display:none;width:200px;">
<MARQUEE direction="right" height="100%" width="100%" scrollamount="9" scrolldelay="0">
<span ></span><span></span><span></span>
</marquee>
</div>
</div>
</body>
</html>