【问题标题】:Ajax , xhr.responseXML.getElementsByTagName() don't worked on chrome and IE but worked on firefoxAjax , xhr.responseXML.getElementsByTagName() 不适用于 chrome 和 IE,但适用于 firefox
【发布时间】:2016-01-29 18:18:00
【问题描述】:

我是 ajax 初学者。我正在尝试编写一个简单的搜索建议。当我使用 firefox 测试时它工作了,但是当我使用 chrome 时,我得到了:Uncaught TypeError: Cannot read property 'getElementsByTagName' of null

我在回调函数上写了这个

xhr.onreadystatechange = function () {
    if (xhr.readyState === 4 && xhr.status === 200) {
        var data = xhr.responseXML;
        var x = data.getElementsByTagName("suggestion");
        var div = document.getElementById("suggest")
        div.innerHTML = "";
        showSuggest();
        for (var i = 0; i < x.length; i++) {
            var result= x[i].firstChild.nodeValue;
            div.innerHTML += "<div id='sResult' onmouseover='over(this)' onmouseout='out(this)' onclick='replace(this)' >"
                + result+ "</div>";
        }
    }
}

这在 Servlet doGet 方法上:

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("test/xml;charset=UTF-8");
        response.setHeader("Cache-Control", "no-cache");
        response.setHeader("Pragma", "no-cache");
        String keyword = request.getParameter("keyword");

        //get suggestion from  db
        List<KeyWord> kw = SearchService.suggest(keyword);
        PrintWriter pw = response.getWriter();
        pw.println("<?xml version='1.0' encoding='UTF-8'?>");
        pw.write("<suggestions>");
        for(KeyWord k:kw){
            pw.write("<suggestion>");
            pw.write(k.getContent());
            pw.write("</suggestion>");
        }
        pw.write("</suggestions>");
        pw.flush();
        pw.close();
    }

【问题讨论】:

  • Java 具有创建格式良好的 XML 的 API,因此请考虑使用它们而不是进行字符串连接。如果k.getContent() 包含与符号&amp; 或小于号&lt;,则您的响应不是格式正确的XML。不知道是不是这个错误的原因,在 Chrome 或 IE 中按 F12 打开开发者工具并检查网络控制台的 HTTP 响应头和代码。

标签: ajax xml google-chrome servlets


【解决方案1】:

你有没有试过这种 P>

var x = data.documentElement.getElementsByTagName("suggestion");

,而不是 P>

var x = data.getElementsByTagName("suggestion");

?

【讨论】:

  • 虽然代码所理解的,它应该始终有一个伴随的解释。这并不一定要长,但它的预期。 SPAN>
  • 感谢您的评论 - 我会确保我从这个学习,并应用建议以后的文章 SPAN>。
  • 我的乐趣:-)在此之前,this可能还对你有用。 SPAN>
  • @彼得 - 非常感谢 - 我出生在英国。我很欣赏你只是想帮助;) SPAN>
【解决方案2】:

如果response.setContentType("test/xml;charset=UTF-8"); 不是您帖子中的拼写错误,请将其更正为response.setContentType("text/xml;charset=UTF-8");,并希望IE 和Chrome 填充responseXML

【讨论】: