我有一个脚本,可以从外部XML文件加载信息,并在点击时将其插入HTML页面。这是这个脚本的代码:
var xmlhttp;
function loadXMLDoc(url,target) {
xmlhttp = null;
if (window.XMLHttpRequest) { // code for all new browsers
xmlhttp = new XMLHttpRequest();
}
else if (window.ActiveXObject) { // code for IE5 and IE6
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
if (xmlhttp != null) {
xmlhttp.onreadystatechange = state_Change;
xmlhttp.open("GET", url, true);
xmlhttp.send(null);
}
else {
alert("Your browser does not support XMLHTTP.");
}
}
function state_Change() {
if (xmlhttp.readyState == 4) { // 4 = "loaded"
if (xmlhttp.status == 200) { // 200 = OK
var markers = xmlhttp.responseXML.documentElement.getElementsByTagName("marker");
for (var i = 0; i < markers.length; i++) {
var name = markers[i].getElementsByTagName("name")[0].firstChild.nodeValue;
//etc...
document.getElementById(target).innerHTML += '<li>' + name + '</li>\n';
}
}
else {
alert("Problem retrieving XML data");
}
}
}
这是HTML:
<ul id="list_puncts">
<li><a href="javascript:;" onclick="loadXMLDoc('./content/geo_points/slovenia.xml','list_sl')">Republika Slovenija (RS)</a>
<ul id="list_sl">
<!--here should be some info from XML file-->
</ul></li>
<li><a href="javascript:;" onclick="loadXMLDoc('./content/geo_points/horvatia.xml','list_hr')">Republika Hrvatska (RH)</a>
<ul id="list_hr">
<!--here should be some info from XML file-->
</ul></li>
</ul>
然而,它不起作用 - 在点击链接后,XML被加载(可以在Firebug中看到),但第二个变量 - target
- 无法进入state_Change
功能,所以没有真正的行动。如果target
在
document.getElementById(target).innerHTML
被一些静态id(如list_sl
)取代,它正在工作,但我在HTML中有很多这些链接,不仅斯洛文尼亚和Horvatia,所以强烈需要这个变量。
感谢您的帮助。
答案 0 :(得分:1)
将state_Change
逻辑放在loadXMLDoc
内的匿名函数中。
function loadXMLDoc(url,target) {
// ... code to instantiate XMLHttprequest goes here ...
if (xmlhttp != null) {
xmlhttp.onreadystatechange = function() {
// Your state_Change() logic goes here.
// This has access to the variable "target" because
// it's within the same enclosing function's scope.
};
xmlhttp.open("GET", url, true);
xmlhttp.send(null);
}
}
这样做的缺点是每次调用loadXMLDoc
时都会实例化一个新的函数实例。
答案 1 :(得分:1)
如果您使用全局变量(XMLHttpRequest
和target
),则无法支持并行请求(即用户在XMLHttpRequest
返回之前点击另一个链接)。实现它的一种方法是将xmlhttp
变量保留在loadXMLDoc
函数的范围内,并将target
作为属性添加到XMLHttpRequest
对象:
function loadXMLDoc(url, target) {
var xmlhttp;
// create XMLHttpRequest instance
if(xmlhttp != null) {
xmlhttp.onreadystatechange = state_Change;
xmlhttp.targetListId = target;
xmlhttp.open(); // etc.
}
};
在state_Change
函数中,您可以使用事件的XMLHttpRequest
属性访问target
实例:
function state_Change(e) {
var xmlhttp = e.target;
// check readystate & status
var targetList = document.getElementById(xmlhttp.targetListId);
targetList.innerHTML = ''; // fill with data, etc.
};