xmlhttprequests работает в консоли, но не в скрипте - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть проблема, из-за которой мне нужно извлечь содержимое файла XML, а затем заполнить его в раскрывающемся списке.Это должно быть легко, однако ссылка на этот файл XML меняется в обычном режиме.

Мой обходной путь для этого - получить страницу, на которой вы загружаете файл XML, найти ссылку, а затем использовать эту ссылку для получения файла XML.AKA Это займет 2 Http-запроса.

Мой код:

var data = null;
var Doc = new Document();
var element;
var link = "";
var xmlDoc;
var xhr = new XMLHttpRequest();

xhr.addEventListener("readystatechange", function() {
    if(this.readyState === 4 && link === "") {  //if we havent gotten the link yet, get it
        Doc = this.response; //get the HTML document where the link is
        element = Doc.getElementsByClassName("failoverLink")[0];  //get the element with the link
        link = element.href; //get the link
        console.log(link); // IMPORTANT: when running the script, this actually returns the link in this context
    }
    else
    {
        if(this.readyState === 4) //now get the actual XML Document
        {
            xmlDoc = this.responseXML; //get the document
            var txt = "<option></option>"; //construct the dropdown box
            var i;
            var x = xmlDoc.getElementsByTagName("Region"); //get all elements that we need for the dropdown
            for(i=0; i<x.length; i++) {
                txt += "<option>" + x[i].attributes.Name.value + "</option>";
            }
            document.getElementById("dropdown").innerHTML = txt; //insert it into the page
        }
    }
});

xhr.open("GET", "https://cors-anywhere.herokuapp.com/<link 1 of the parent document> replaced for privacy purposes");
xhr.responseType = "document";
xhr.send(data);
xhr.abort();

var newlink = "https://cors-anywhere.herokuapp.com/" + link;
xhr.open("GET", newlink);
xhr.responseType = "document";
xhr.overrideMimeType('text/xml');
xhr.send(data);
xhr.abort();

Ожидаемый результат - получить документ XML.Это прекрасно работает в консоли разработчика!

При попытке запустить реальный сценарий, однако, он показывает ссылку в консоли просто отлично, но вне контекста функции прослушивателя событий она по-прежнему равна нулю.

У кого-нибудь есть идеи?

ИСПРАВЛЕНИЕ: Каждый раз, когда я запускаю каждую команду в консоли.Оно работает.Всякий раз, когда я запускаю их все вместе, он говорит, что это ноль.Я предполагаю, что я должен как-то ждать, пока это не закончится?Если так, то как?

1 Ответ

0 голосов
/ 27 сентября 2019

Итак, я решил свою собственную проблему.Проблема состояла в том, что слушатель события не заканчивал первый раз перед вторым вызовом.Вот что я сделал, чтобы это исправить.

xhr1.addEventListener("readystatechange", function() {
    if(xhr1.readyState === 4) {
        Doc = xhr1.response;
        element = Doc.getElementsByClassName("failoverLink")[0];
        link = element.href;
        console.log(link);

        xhr2.addEventListener("readystatechange", function() {
            if(this.readyState === 4)
            {
                xmlDoc = this.responseXML;
                var txt = "<option></option>";
                var i;
                var x = xmlDoc.getElementsByTagName("Region");
                for(i=0; i<x.length; i++) {
                    txt += "<option>" + x[i].attributes.Name.value + "</option>";
                }
                document.getElementById("dropdown").innerHTML = txt;
            }
        });

        var newlink = "https://cors-anywhere.herokuapp.com/" + link;
        xhr2.open("GET", newlink);
        xhr2.responseType = "document";
        xhr2.overrideMimeType('text/xml');
        xhr2.send(data);
    }
});

Да, мне пришлось создать два разных объекта XHR ... но я думаю, что это подойдет.

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