2013-11-18 3 views
0

Я хотел бы отобразить список, когда пользователь печатает текст (например, автозаполнение).Ошибка Javascript с ошибкой с ошибкой xml

Я загружаю xml со списком, и когда пользователь печатает текст, функция javascript выполняет цикл в xml для поиска совпадений.

Все в порядке, за исключением Internet Explorer, где оно ИНОГДА отображает эту ошибку: «SCRIPT65535: Неверный вызывающий объект».

  • В первый раз, когда я вызываю функцию js в цикл в xml, всегда работает, но если я дождался 5 секунд, прежде чем вызывать его снова, он будет отправлять ошибку.
  • Если я подождал менее 1 секунды, он не отображает ошибку.

Возможно, потому что в цикле я вызываю метод getAttribute() ... когда я удаляю его, нет ошибки.

Thx за помощь!

Вот код:

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); 

Callback функция:

var xml_nodes = ''; 

function callback(response){ 
    xml_nodes = response.getElementsByTagName('node'); 
} 

Тогда MouseClick или что-то вызывает эту функцию:

function buttonClick(){ 
    for(var i=0; i<xml_nodes.length; i++){ 
     var attr = xml_nodes[i].getAttribute('attr'); 
    } 
} 
+0

Поиск похожих ошибок: всегда есть информация об исходном файле и строке. У вас есть что-то подобное в сообщении об ошибке? У вас есть ошибка в файле file.xml? Некоторая плохая формация, дополнительная запятая или подобное? –

ответ

1

T его проблема кэширования возникает только в Internet Explorer. Ваша функция callback(response) назначает элементы узла переменной xml_nodes. Эти узлы являются частью response, которая является частью XMLHttpRequest, которая становится доступной, потому что у вас нет указателей на нее.

Функция buttonClick выполняет итерацию по xml_nodes, которые подключены к расположенным XMLHttpRequest's. И они расположены, потому что у вас нет указателей на него и, следовательно, являются недопустимыми объектами.

Простым обходным путем будет кеширование ваших запросов в массиве. Однако это приведет к большому количеству нежелательной памяти. Вы должны создавать объекты из ответа xml и хранить их. Эти новые объекты не будут иметь указателей на responseXML и поэтому являются действительными объектами.

Надеюсь, что это помогло, была та же проблема:

Смежные вопросы