一尘不染

jQuery .find()不会在IE中返回数据,但会在Firefox和Chrome中返回数据

javascript

我为一个朋友做了一些网络工作,帮助了他。他需要的一部分是在他的站点上更改几段文字的简单方法。与其让他编辑HTML,我决定提供一个带有消息的XML文件,然后我使用jQuery将它们从文件中拉出并插入到页面中。

它的效果非常好…在Firefox和Chrome中,在IE7中效果不佳。我希望你们中的一个能告诉我原因。我做了一个公平的但谷歌搜索,但是找不到我想要的东西。

这是XML:

<?xml version="1.0" encoding="utf-8" ?>
<messages>
  <message type="HeaderMessage">
    This message is put up in the header area.
  </message>
  <message type="FooterMessage">
    This message is put in the lower left cell.
  </message>
</messages>

这是我的jQuery调用:

<script type="text/javascript">
  $(document).ready(function() {
    $.get('messages.xml', function(d) {
      //I have confirmed that it gets to here in IE
      //and it has the xml loaded.
      //alert(d); gives me a message box with the xml text in it
      //alert($(d).find('message')); gives me "[object Object]"
      //alert($(d).find('message')[0]); gives me "undefined"
      //alert($(d).find('message').Length); gives me "undefined"
      $(d).find('message').each(function() {
        //But it never gets to here in IE
        var $msg = $(this);
        var type = $msg.attr("type");
        var message = $msg.text();
        switch (type) {
        case "HeaderMessage":
          $("#HeaderMessageDiv").html(message);
          break;
        case "FooterMessage":
          $("#footermessagecell").html(message);
          break;
          default:
        }
      });
    });
  });
</script>

我需要在IE中做些不同的事情吗?基于带有[object
Object]的消息框,我假定.find在IE中正常工作,但是由于我无法用[0]索引到数组中或无法检查它的长度,所以我猜想这意味着.find不是返回任何结果。有什么理由可以在Firefox和Chrome中完美运行,但在IE中失败?

我是jQuery的新手,所以我希望自己不要做一些愚蠢的事情。上面的代码已从论坛中删除,并进行了修改以满足我的需要。由于jQuery是跨平台的,因此我认为我不必处理这种混乱情况。

编辑:我发现,如果我在Visual Studio
2008中加载页面并运行它,那么它将在IE中工作。因此事实证明,在开发Web服务器中运行时,它始终有效。现在,我认为IE只是不喜欢从本地驱动器中加载XML格式的.find文件,所以也许当它在实际的Web服务器上运行时就可以了。

我已经确认从网络服务器浏览时可以正常工作。必须是IE的特殊功能。我猜这是因为Web服务器为xml数据文件传输设置了mime类型,而没有IE则无法正确解析xml。


阅读 332

收藏
2020-05-01

共1个答案

一尘不染

检查响应的内容类型。如果您将message.xml设置为错误的mime类型,则Internet Explorer不会将其解析为XML。

要检查内容类型,您需要访问XMLHttpRequest对象。正常的成功回调不会将其作为参数传递,因此您需要添加通用的ajaxComplete或ajaxSuccess事件处理程序。这些事件的第二个参数是XMLHttpRequest对象。您可以对其调用getResponseHeader方法以获取内容类型。

$(document).ajaxComplete(function(e, x) {
    alert(x.getResponseHeader("Content-Type"));
});

不幸的是,我在Internet Explorer中没有办法覆盖服务器发送的内容,因此,如果错误,则需要更改服务器以发送“ text /
xml”作为内容类型。

某些浏览器提供了overrideMimeType一种可以send强制使用“ text / xml”的方法,但是据我所知,Internet
Explorer不支持该方法。

2020-05-01