【问题标题】:IE not loading XML content until I open Developer tools?在我打开开发人员工具之前,IE 不加载 XML 内容?
【发布时间】:2011-12-11 19:25:32
【问题描述】:

我有一个使用 jQuery AJAX 获取请求从 XML 文件加载产品信息的页面。这在 FF 和 Chrome 中运行良好,但内容无法在 IE 中加载。但是,它会在打开开发者窗口并刷新页面后加载数据!有谁知道为什么?

这是我的 jQuery AJAX 请求:

//Load the xml file
$.ajax({
    type: "GET",
    url: "xml/" + cat + ".xml",
    dataType: ($.browser.msie) ? "text" : "xml",
    success: function(data) {
      alert('xml successfully loaded');
      var xml;
      if (typeof data == "string") {
        xml = new ActiveXObject("Microsoft.XMLDOM");
        xml.async = false;
        xml.loadXML(data);
      } else {
        xml = data;
      }
        //Get total number of products in the category
        $(xml).find('dataroot').each(function() {
            var pTemp = $(this).attr('count');
            catName = $(this).attr('catTitle');
            console.log(catName);
            pTotal = Number(pTemp);
        });

         //Fill the correct entries onto the page
         while (count<=pTotal) {
              $(xml).find('product').each(function() {
                  if (count>lCounter && count<hCounter) {
                      var pName = $(this).find('ProductName').text();
                      var pImage = $(this).find('Photo').text();
                      var pCode = $(this).find('ProductCode').text();
                      var pDesc = $(this).find('WebDescription').text();
                      if (cat.substring(0,2)=='cs') {
                          var pPrice = $(this).find('PartyShackPrice').text();
                      } else { var pPrice = $(this).find('RRP').text(); }
                      var pSize = $(this).find('size').text();
                      var pLink = '<a href="item.html?'+cat+'-'+pCode+'">';

                      var pHTML = '<div id="'+pCode+'" class="box">';
                      pHTML += pLink + '<img src="images/SMALL_IMAGE/' + pImage + '" width="70" height"100" /></a>';
                      pHTML += '<div class="boxText">';
                      pHTML += pLink + '<div class="boxTitle">'+pName+'</div></a>';
                      pHTML += '<div class="boxDesc">'+pDesc+'</div>';
                      if (pSize !== 'Not Applicable') { pHTML += '<div class="boxSize">'+pSize+'</div>'; }
                      pHTML += '<div class="boxPrice">£'+pPrice+'</div>';
                      pHTML += pLink + '<div class="boxBuy"></div></a>';
                      pHTML += '</div></div>';

                      $("#products").append(pHTML);
                  }
                  count +=1;
              });
         }

        //Work out the total number of pages the product list is split up into
        if (pTotal%50==0) { pageTotal = pTotal/50; } 
        else { pageTotal = Math.floor(pTotal/50) + 1; }
        console.log('pageTotal - ' + pageTotal);


        //Show path of the current page
        getPath(cat, catName, 0);

        //Depending on page number show previous and next buttons and display product counter
        if (pageTotal==1) { //page 1 and only one page
            $("#prev").css("visibility", "hidden");
            $("#next").css("visibility", "hidden");
            $("#counter").append('1 - ' + pTotal + ' of ' + pTotal);
        } else if ((pageNum==1) && (pageTotal!=1)) { //page 1 and multiple pages
            $("#prev").css("visibility", "hidden");
            $("#next").append('<a href="products.html?'+cat+'-'+(pageNum+1)+'">Next &gt;&gt;</a>');
            $("#counter").append('1 - 50 of ' + pTotal);
        } else if ((pageNum==pageTotal) && (pageTotal!=1)) { //last page when theres more than 1 page 
            $("#next").css("visibility", "hidden");
            $("#prev").append('<a href="products.html?'+cat+'-'+(pageNum-1)+'">&lt;&lt; Previous</a>');
            $("#counter").append((((pageNum-1)*50)+1) + ' - ' + pTotal + ' of ' + pTotal);
        } else { // a middle page
            $("#next").append('<a href="products.html?'+cat+'-'+(pageNum+1)+'">Next &gt;&gt;</a>');
            $("#prev").append('<a href="products.html?'+cat+'-'+(pageNum-1)+'">&lt;&lt; Previous</a>');
            $("#counter").append((((pageNum-1)*50)+1) + ' - ' + (pageNum * 50) + ' of ' + pTotal);
        }

        //Display page number
        $("#currentPage").append(' ' + pageNum + ' of ' + pageTotal);
    },
    error: function() { alert('failure'); }
});
});

IE 也应该调用成功警报或错误警报,但在打开开发人员窗口并刷新页面之前它都不会。

谢谢

【问题讨论】:

    标签: javascript jquery xml ajax get


    【解决方案1】:

    通过阅读 SO 主页上的问题标题,我知道问题出在哪里。阅读问题中的代码即可确认。你遇到的问题是console.log(catName);

    在开发者窗口打开之前,IE(和其他一些浏览器)不会初始化 console 对象。

    在此之前,尝试使用console 将返回undefined,并导致您的脚本停止运行。

    这里的第一课是不要在完成后将调试代码留在程序中。只有在您测试程序时才能调用console;完成后,将它们取出。

    第二个教训是,如果您确实需要在您的代码中调用console,您应该将它们包装在代码中,在它尝试使用它之前检查console 是否存在。有很多方法可以做到这一点,从简单的if(console) {console.log(...);} 一直到编写自己的调试类。如何做到这一点取决于您,但通常以这种方式编写所有console 代码是一个好主意,即使您只是进行一些调试,以避免您在这里遇到的那种问题。

    希望对您有所帮助。

    【讨论】:

    • 使用 if(window.console) {console.log(...);}。 if(console) {console.log(...);} 将不起作用,因为无法直接引用未定义的变量。
    【解决方案2】:

    让 jQuery 做它最擅长的事情。全部替换:

    dataType: ($.browser.msie) ? "text" : "xml",
    success: function(data) {
      alert('xml successfully loaded');
      var xml;
      if (typeof data == "string") {
        xml = new ActiveXObject("Microsoft.XMLDOM");
        xml.async = false;
        xml.loadXML(data);
      } else {
        xml = data;
      }
       ...
    

    有了这个:

    dataType: "xml",
    success: function(xml) {
      alert('xml successfully loaded');
      ...
    

    【讨论】:

    • 那是我最初拥有的,但我在上面的代码中添加了尝试实现对 IE 的支持。不幸的是,这仍然不起作用。您可以在此处查看实际页面link
    • @user1001898 IE8 抛出 JS 错误,因为它无法识别 console.log。这就是你的情况吗?
    • 我已经删除了我所有的 console.log,它似乎可以正常工作,现在对你有用吗?
    • @mjohnston 是的,但是我在 IE8 中从代码中的其他地方得到了一个不同的 JS 错误。不过,我很高兴你发现了真正的问题。
    猜你喜欢
    • 2022-06-30
    • 1970-01-01
    • 2013-03-06
    • 1970-01-01
    • 2014-02-08
    • 1970-01-01
    • 2016-07-15
    • 2015-02-27
    • 2018-10-02
    相关资源
    最近更新 更多