У меня есть функция поиска, которая извлекает около 1700 элементов из списка XML и просматривает их по запросу пользователя. Помимо этого пользователь может дополнительно фильтровать свои результаты, выбирая различные фильтры.
Это работает безупречно в Chrome, но при тестировании в IE, каждый раз, когда я нажимаю на фильтр, я получаю ошибку «недопустимый вызывающий объект», которая ссылается на функцию sortList()
, в частности, на строку for(var i=0; i < loadedList.length; i++)
, как более подробно показано ниже.
Опять же, Chrome не имеет проблем с этим, это полная вещь IE. Установка часов в Chrome, loadedList
является HTMLCollection и может иметь метод .length
, но по какой-то причине в IE это не работает.
Этот скрипт довольно длинный, но я попытался включить соответствующие функции ниже.
Итак, это концептуально:
var results = [];
var loadedList;
window.onLoad = loadList();
// actual function
function loadList() {
var items = new XMLHttpRequest();
items.onreadystatechange = function() {
//puts all the xml into the loadedList variable
if (this.readyState == 4 && this.status == 200) {
var xmlDoc = this.responseXML;
loadedList = xmlDoc.getElementsByTagName("itm");
sortList();
}
};
items.open("GET", "item-list-file.xml", true);
items.send();
};
function sortList() {
for (var i = 0; i < loadedList.length; i++) {
for (var j = 0; j < loadedList.length; j++) {
if (boxed[j].checked && boxed[j].id.substr(0, 3) == getElement("category", i).toLowerCase().substring(0, 3)) {
// getElement is just a function with a catch statement to handle any missing info on the xml list
//pushes any relevant results into results array
results.push("<li>" + getElement("title", i) + "</li>");
}
}
}
}
};
Вот суть того, что происходит при загрузке страницы. Существует функция search()
, которая просто захватывает запрос пользователя и передает его в функцию returnSearch()
. Нет проблем с этим.
Проблема возникает после того, как пользователь один раз выполнил поиск и хочет сузить поиск, выбрав один или несколько фильтров.
Есть функция updateURL()
, которая обновляет window.location.href
(чтобы мы могли связать поиск с уже выбранными конкретными фильтрами), а затем снова запускает sortList()
.
function updateURL(searchType) {
//this resents the results array so that
results = [];
//resorts results based on new criteria
sortList();
//runs search again so that the filters are applied asynchronously
search();
};