【问题标题】:Invalid calling object in IE at the start of a for loop在 for 循环开始时,IE 中的调用对象无效
【发布时间】:2018-09-11 04:27:53
【问题描述】:

我有一个搜索功能,它从一个 XML 列表中抓取大约 1700 个项目,并通过用户的查询来搜索它们。除此之外,用户可以通过选择各种过滤器来进一步过滤他们的结果。

它在 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();


  };

【问题讨论】:

  • 您的window.onload 分配错误。如果你真的想等待页面加载,应该是window.onload = loadList;;否则请致电loadList()
  • 在寻求帮助时,请花时间以一致、易读的方式格式化和缩进您的代码。 (不寻求帮助时也是一个好主意。)我已经尝试为你这样做,但最后还有一个额外的};...
  • 抱歉@T.J.Crowder 我正要编辑,但我看到你已经这样做了。
  • 什么是boxed?它似乎在代码中无处不在。另外:尽管 IE 似乎在告诉你什么,但我非常怀疑错误是在你查看 length 时出现的。但幸运的是,IE11 确实有一个内置的 JavaScript 调试器,所以最好的办法可能是使用该调试器并逐语句逐句执行代码。
  • boxed 只是跟踪检查了哪些过滤器。

标签: javascript internet-explorer-11 microsoft-edge


【解决方案1】:

据我所知,出于某种原因,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 的问题是什么,但现在可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    相关资源
    最近更新 更多