Недопустимый вызывающий объект в IE в начале цикла for - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть функция поиска, которая извлекает около 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();


  };

1 Ответ

0 голосов
/ 10 сентября 2018

Из того, что я мог сказать по некоторым причинам, IE не понравилось, когда переменная loadedList объявлена ​​вне функции loadList(). Я не знаю почему, но после того, как товары были изначально загружены, всегда будут проблемы с loadedList всякий раз, когда sortList() вызывается снова.

Я закончил тем, что удалил функцию 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 была с этим, но теперь он работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...