Firefox下同步XMLHttpRequest弃用引发XML解析异常及代码改造咨询
问题1:你的理解是否正确
- 核心判断方向是对的:主线程同步XMLHttpRequest确实已被主流浏览器弃用,目前Firefox仅抛出警告、尚未完全禁用,但后续版本会逐步限制使用,这确实是你代码的潜在风险点。
- 你直接将第三个参数改为
true后功能异常的原因是:异步模式下xmlhttp.send()不会阻塞后续代码执行,请求还在后台发送时,你就已经执行了读取responseXML、写入DOM的逻辑,此时返回结果还没拿到,自然功能异常。 - W3School的示例能正常运行是因为代码逻辑极简,Firefox当前版本仍兼容旧的同步XHR写法,仅抛出警告提示。
问题2:改造后的异步XML解析代码
方案1:基于XMLHttpRequest的异步改造(兼容旧浏览器)
<!DOCTYPE html> <html> <body> <h1>W3Schools Internal Note</h1> <div> <b>To:</b> <span id="to"></span><br> <b>From:</b> <span id="from"></span><br> <b>Message:</b> <span id="message"></span> </div> <script> var xmlhttp = new XMLHttpRequest(); xmlhttp.open("GET", "note.xml", true); // 监听请求状态变化 xmlhttp.onreadystatechange = function() { // 请求完成且响应成功时再处理XML数据 if (this.readyState == 4 && this.status == 200) { const xmlDoc = this.responseXML; document.getElementById("to").innerHTML = xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue; document.getElementById("from").innerHTML = xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue; document.getElementById("message").innerHTML = xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue; } }; xmlhttp.send(); </script> </body> </html>
方案2:用更现代的Fetch API实现(推荐)
<!DOCTYPE html> <html> <body> <h1>W3Schools Internal Note</h1> <div> <b>To:</b> <span id="to"></span><br> <b>From:</b> <span id="from"></span><br> <b>Message:</b> <span id="message"></span> </div> <script> fetch("note.xml") .then(response => response.text()) .then(xmlStr => { const parser = new DOMParser(); const xmlDoc = parser.parseFromString(xmlStr, "text/xml"); document.getElementById("to").innerHTML = xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue; document.getElementById("from").innerHTML = xmlDoc.getElementsByTagName("from")[0].childNodes[0].nodeValue; document.getElementById("message").innerHTML = xmlDoc.getElementsByTagName("body")[0].childNodes[0].nodeValue; }); </script> </body> </html>
内容的提问来源于stack exchange,提问作者user17148425
相关产品推荐
相关产品推荐

