XMLHttpRequest (Ajax) 错误

IT技术 javascript ajax xml xmlhttprequest
2021-03-11 08:22:23

XMLHttpRequest在 JavaScript 中使用。但是,它给了我一个错误,我不知道我的问题是什么。
我必须解析一个 XML 文件并将其内容分配给网页 - 这是我的代码:

<script = "text/javascript">

    window.onload = onPageLoad();
    var questionNum = 0;

    function onPageLoad(questionNum) {
        var xmlhttp = new XMLHttpRequest();
        xmlhttp.open("GET","quiz.xml");
        try {
            xmlhttp.send(null); // Here a xmlhttprequestexception number 101 is thrown 
        } catch(err) {
            document.getElementById("body").innerHTML += "\nXMLHttprequest error: " + err.description; // This prints "XMLHttprequest error: undefined" in the body.
        }
        xmlDoc = xmlhttp.responseXML;
        parser = new DOMParser(); // This code is untested as it does not run this far.
    }
</script>

我的 XML 文件位于同一目录中。

<question>
    <query>what is 2+2?</query>
    <option>4</option>
    <option>5</option>
    <option>3</option>
    <answer>4</answer>
</question>

仅供参考,我通常使用 C# 或 Java 编程,并且我在 Google Chrome 上运行我的网站。

3个回答

所以这里可能有一些问题。

首先阅读如何使用,XMLHttpRequest.open()因为还有第三个可选参数用于指定是否发出异步请求,默认为 true这意味着您正在发出一个异步请求,并且需要在执行send(). 这是来自MDN的一个例子

var oXHR = new XMLHttpRequest();

oXHR.open("GET", "http://www.mozilla.org/", true);

oXHR.onreadystatechange = function (oEvent) {
    if (oXHR.readyState === 4) {
        if (oXHR.status === 200) {
          console.log(oXHR.responseText)
        } else {
           console.log("Error", oXHR.statusText);
        }
    }
};

oXHR.send(null);

其次,由于您收到 101 错误,您可能使用了错误的 URL。因此,请确保您发出请求的 URL 是正确的。此外,请确保您的服务器能够为您的quiz.xml文件提供服务

您可能必须通过简化/缩小问题所在来进行调试。所以我会先做一个简单的同步请求,这样你就不必担心回调函数了。所以这是来自 MDN 的另一个用于发出同步请求的示例:

var request = new XMLHttpRequest();
request.open('GET', 'file:///home/user/file.json', false); 
request.send(null);

if (request.status == 0)
    console.log(request.responseText);

此外,如果您刚开始使用 Javascript,您可以参考MDN以获取 Javascript API 文档/示例/教程。

我在代码中输入的“URL”是我机器上文件的路径,我只是为帖子更改了它。我没有使用网络服务器。我想知道这是否是问题所在。我只是想从我的驱动器中检索文件。我需要下载网络服务器软件吗?或者我应该将它嵌入到 Django 或 Rails 服务器中进行测试?
2021-04-23 08:22:23
是的,您需要一个 Web 服务器,XMLHttpRequest 不太适合获取本地文件……某些浏览器可能允许……无论如何,您似乎对此非常了解,因此您应该从设置基本网站开始在你进入这个东西之前
2021-04-29 08:22:23
我仍然有这个问题。当我尝试 Nadir 的第二块代码时,出现以下错误。我怀疑这是我的问题“XMLHttpRequest 无法加载 file:///Users/me/My%20Directory%20quiz/quiz.xml。仅 HTTP 支持跨源请求。”
2021-05-01 08:22:23
您输入的 url 应该和之前一样...示例中的 url 只是一个示例 url...
2021-05-09 08:22:23
你用的是什么网络服务器??
2021-05-13 08:22:23

我看到两个可能的问题:

问题一

  • XMLHTTPRequest 对象在您尝试使用它时尚未完成加载数据

解决方案:为对象“onreadystatechange”-事件分配一个回调函数并处理该函数中的数据

xmlhttp.onreadystatechange = callbackFunctionName;

一旦状态达到 DONE (4),就准备好读取响应内容。

问题二

  • XMLHTTPRequest 对象并非在所有浏览器中都存在(以该名称命名)

解决方案:使用 try-catch 为正确的浏览器创建正确的对象(IE 中的 ActiveXObject)或使用框架,例如jQuery ajax-method

注意:如果你决定使用 jQuery ajax 方法,你可以使用 jqXHR.done() 分配回调函数

问题很可能出在这一行上:

window.onload = onPageLoad();

通过包含您所说的括号onload应该等于onPageLoad(). 例如:

/*Example function*/
function onPageLoad()
{
    return "science";
}
/*Set on load*/
window.onload = onPageLoad()

如果您将 的值打印window.onload到控制台,它将是:

科学

解决办法是去掉括号:

window.onload = onPageLoad;

因此,您使用onPageLoad作为对所谓函数的引用。

最后,为了获得响应值readystatechange,您的XMLHttpRequest对象需要一个侦听器,因为它是异步的:

xmlDoc = xmlhttp.responseXML;
parser = new DOMParser(); // This code is untested as it doesn't run this far.

在这里添加侦听器:

xmlHttp.onreadystatechange = function() {
    if(this.readyState == 4) {
        // Do something
    }
}
我完全同意你关于声明的声明并编辑了我的答案;似乎我被错误的括号蒙蔽了双眼。
2021-04-22 08:22:23
您所说的大部分内容都是正确的,但是将函数的返回值分配给window.onload意味着该函数必须被执行,因此应该可以工作。另请注意,声明函数的位置没有区别,因为 JavaScript 中的函数声明被提升到声明它们的作用域的顶部。
2021-05-05 08:22:23