我想在用户插入文本时显示列表(如自动完成)。
我使用列表加载xml,当用户使用文本时,javascript函数循环到xml中以查找匹配项。
一切正常,除非在Internet Explorer上,SOMETIMES显示此错误:“SCRIPT65535:无效的调用对象”。
可能是因为在循环中我调用了getAttribute()方法...当我删除它时没有错误。
感谢您的帮助!
以下是代码:
Ajax加载:
var ajax = {};
ajax.getXMLHttpRequest = function(){
var xhr = null;
if(window.XMLHttpRequest || window.ActiveXObject){
if(window.ActiveXObject){
try{
xhr = new ActiveXObject("Msxml2.XMLHTTP");
}
catch(e){
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
}
else xhr = new XMLHttpRequest();
}
else return null;
return xhr;
};
ajax.loadFile = function(callback){
var xhr = ajax.getXMLHttpRequest();
xhr.onreadystatechange = function(){
if(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 0)){
callback(xhr.responseXML);
xhr = null;
}
};
xhr.open("GET", 'file.xml', true);
xhr.setRequestHeader("Content-Type", "text/xml");
xhr.send(null);
};
ajax.loadFile(callback);
回调功能:
var xml_nodes = '';
function callback(response){
xml_nodes = response.getElementsByTagName('node');
}
然后鼠标点击或其他任何触发此功能:
function buttonClick(){
for(var i=0; i<xml_nodes.length; i++){
var attr = xml_nodes[i].getAttribute('attr');
}
}
答案 0 :(得分:1)
这是一个仅在Internet Explorer中出现的缓存问题。您的callback(response)
函数会将节点元素分配给xml_nodes
变量。这些节点是response
的一部分,XMLHttpRequest
是buttonClick
的一部分,因为你没有指向它而被处置掉。
xml_nodes
函数将迭代连接到已处理的XMLHttpRequest的{{1}}。这些因为没有指针而被处理掉,因此是无效的对象。
一个简单的解决方法是在数组中缓存您的请求。但是,这将导致大量不必要的内存使用。您应该从xml响应创建对象并存储它们。这些新对象没有指向responseXML的任何指针,因此是有效的对象。
希望这有所帮助,遇到同样的问题:)