在 for 循环开始时 IE 中的无效调用对象
Invalid calling object in IE at the start of a for loop
我有一个搜索功能,可以从 XML 列表中抓取大约 1700 个项目,并根据用户的查询来搜索它们。除此之外,用户可以通过选择各种过滤器进一步过滤他们的结果。
它在 Chrome 中完美运行,但在 IE 中测试时,每当我单击过滤器时,我都会收到错误 "invalid calling object",它引用了函数 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
(因此我们可以 link 搜索已选择的特定过滤器),然后再次运行 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();
};
据我所知,出于某种原因,IE 不喜欢在 loadList()
函数之外声明变量 loadedList
。我不知道为什么,但是在最初加载项目后,每当再次调用 sortList()
时,loadedList
总是会出现问题。
我最终删除了函数 loadList()
,只在正文中添加了 xml(不在函数中)。
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() {
仍然不确定 IE 的问题是什么,但现在可以了。
我有一个搜索功能,可以从 XML 列表中抓取大约 1700 个项目,并根据用户的查询来搜索它们。除此之外,用户可以通过选择各种过滤器进一步过滤他们的结果。
它在 Chrome 中完美运行,但在 IE 中测试时,每当我单击过滤器时,我都会收到错误 "invalid calling object",它引用了函数 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
(因此我们可以 link 搜索已选择的特定过滤器),然后再次运行 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();
};
据我所知,出于某种原因,IE 不喜欢在 loadList()
函数之外声明变量 loadedList
。我不知道为什么,但是在最初加载项目后,每当再次调用 sortList()
时,loadedList
总是会出现问题。
我最终删除了函数 loadList()
,只在正文中添加了 xml(不在函数中)。
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() {
仍然不确定 IE 的问题是什么,但现在可以了。