0

当用户输入文本(如自动完成)时,我想显示一个列表。

我用列表加载了一个 xml,当用户输入文本时,一个 javascript 函数循环到 xml 中以查找匹配项。

一切正常,除了在 Internet Explorer 上有时会显示此错误:“SCRIPT65535:无效的调用对象”。

  • 我第一次调用 js 函数循环进入 xml 总是有效,但如果我在再次调用之前等待 5 秒,它将显示错误。
  • 如果我等待不到 1 秒,它将不会显示错误。

这可能是因为在循环中我调用了 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');
    }
}
4

1 回答 1

1

这是仅在 Internet Explorer 中出现的缓存问题。您的callback(response)函数将节点元素分配给xml_nodes变量。这些节点是 的一部分response是 的一部分,XMLHttpRequest因为您没有指向它的指针,所以这些节点被处置。

buttonClick函数将遍历xml_nodes连接到已处理的 XMLHttpRequest 的那些。这些被释放是因为你没有指向它的指针,因此是无效的对象。

一个简单的解决方法是将您的请求缓存在一个数组中。但是,这将导致大量不需要的内存使用。您应该从 xml 响应创建对象并存储它们。这些新对象没有任何指向 responseXML 的指针,因此是有效对象。

希望这有帮助,有同样的问题:)

于 2014-03-14T10:22:09.287 回答