jQuery .find()不会在IE中返回数据,而是在Firefox和Chrome中
我帮他的朋友做了一些networking工作。 部分他需要的是一个简单的方法来改变他的网站上的几段文字。 而不是让他编辑HTML我决定提供一个XML文件的消息,我用jQuery把他们拉出文件,并将其插入到页面中。
它工作得很好…在Firefox和Chrome中,在IE7中并不是那么棒。 我希望你们中的一个能告诉我为什么。 我做了一个公平的,但使用谷歌search,但无法find我在找什么。
这里是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? 基于消息框与[对象对象]我假定.find工作在IE中,但因为我不能索引到数组[0]或检查它的长度我猜这意味着.find不是返回任何结果。 任何理由为什么这将在Firefox和Chrome完美的工作,但在IE浏览器失败?
我是一个jQuery总新手,所以我希望我不只是做了一些愚蠢的事情。 上面的代码被从论坛中删除,并修改,以适应我的需求。 由于jQuery是跨平台的,我想我不必处理这个混乱。
编辑:我发现,如果我在Visual Studio 2008中加载页面并运行它,那么它将在IE中工作。 所以事实certificate,它通过开发Web服务器运行时总是工作。 现在,我想IE浏览器只是不喜欢做在我的本地驱动器加载的XML查找,所以也许当这是在一个实际的Web服务器上,它会工作正常。
我已经确认,从Web服务器浏览时,它工作正常。 必须是一个与IE的特性。 我猜这是因为Web服务器设置MIMEtypes的XML数据文件传输,没有这个IE不能正确parsingXML。
检查响应的内容types。 如果您将messages.xml作为错误的MIMEtypes,则Internet Explorer将不会将其parsing为XML。
要检查内容types,您需要访问XMLHttpRequest对象。 正常的成功callback不会将其作为parameter passing,因此您需要添加通用的ajaxComplete或ajaxSuccess事件处理程序。 这些事件的第二个参数是XMLHttpRequest对象。 你可以调用getResponseHeader方法来获取内容types。
$(document).ajaxComplete(function(e, x) { alert(x.getResponseHeader("Content-Type")); });
不幸的是,我不知道在Internet Explorer中重写什么服务器发送,所以如果它是错误的,你需要改变服务器发送“文本/ XML”的内容types。
一些浏览器有一个overrideMimeType
方法,您可以在send
之前调用它来强制使用“text / xml”,但据我所知,Internet Explorer不支持这种方法。
由于IE的问题是xmlparsing器在xml文件上窒息,这些xml文件没有使用正确的“text / xml”头传递,所以可以在Ajax complete事件中包含一些代码:
完成:function(xhr,status) { alert(“COMPLETE。You got:\ n \ n”+ xhr.responseText); if(status =='parsererror') { 警报(“有一个PARSERERROR。幸运的是,我们知道如何解决这个问题。\ n \ n”+ “完整的服务器响应文本是”+ xhr.responseText“; xmlDoc = null; //从responseTextstring中创buildxml文档。 //这使用w3schools方法。 // 另见 如果(window.DOMParser) { parser = new DOMParser(); xmlDoc = parser.parseFromString(xhr.responseText,“text / xml”); } 其他// Internet Explorer { xmlDoc = new ActiveXObject(“Microsoft.XMLDOM”); xmlDoc.async =“false”; xmlDoc.loadXML(xhr.responseText); } $('#response').append('<p> complete event / xmlDoc:'+ xmlDoc +'</ p>'); $('#response').append('<p> complete event / status:'+ status +'</ p>'); processXMLDoc(xmlDoc); } },
这里有一个更完整的例子
<!DOCTYPE html> <HTML> <HEAD> 用jQuery读取XML </ title> <风格> #响应 { 边框:实心1px黑色; 填充:5px; } </样式> <script src =“jquery-1.3.2.min.js”> </ script> <SCRIPT> 函数processXMLDoc(xmlDoc) { var heading = $(xmlDoc).find('heading').text(); $('#response').append('<h1>'+ heading +'</ h1>'); var bodyText = $(xmlDoc).find('body')。text(); $('#response').append('<p>'+ bodyText +'</ p>'); } $(文件)。就绪(函数() { jQuery.ajax({ 键入:“GET”, url:“a.xml”,//! 小心相同 // 原点types问题 dataType:“xml”,//“xml”将它传递给浏览器的xmlparsing器 成功:函数(xmlDoc,状态) { //成功事件意味着xml文档 //从服务器下来并成功parsing //使用浏览器自己的xmlparsing上限。 processXMLDoc(xmlDoc); / / IE获取非常不高兴的时候 //文档的MIMEtypes //传入的不是text / xml。 //如果缺lesstext / xml标题 //显然xmlparsing失败, / /在IE中,你不能执行这个function。 }, 完成:function(xhr,status) { alert(“COMPLETE。You got:\ n \ n”+ xhr.responseText); if(status =='parsererror') { 警报(“有一个PARSERERROR。幸运的是,我们知道如何解决这个问题。\ n \ n”+ “完整的服务器响应文本是”+ xhr.responseText“; xmlDoc = null; //从responseTextstring中创buildxml文档。 //这使用w3schools方法。 // 另见 如果(window.DOMParser) { parser = new DOMParser(); xmlDoc = parser.parseFromString(xhr.responseText,“text / xml”); } 其他// Internet Explorer { xmlDoc = new ActiveXObject(“Microsoft.XMLDOM”); xmlDoc.async =“false”; xmlDoc.loadXML(xhr.responseText); } $('#response').append('<p> complete event / xmlDoc:'+ xmlDoc +'</ p>'); $('#response').append('<p> complete event / status:'+ status +'</ p>'); processXMLDoc(xmlDoc); } }, 错误:函数(xhr,状态,错误) { 警报('ERROR:'+状态); alert(xhr.responseText); } }); }); </ SCRIPT> </ HEAD> <BODY> <DIV> <h1> <a href="http://think2loud.com/reading-xml-with-jquery/">用jQuery读取XML </a> </ h1> <P> <a href="http://docs.jquery.com/Ajax/jQuery.ajax#options">#1 jQuery.ajax参考</a> </ p> </ DIV> 服务器说:</ p> <pre id =“response”> </ PRE> </ BODY> </ HTML>
a.xml的内容
<?xml version =“1.0”?> <注意> <至>托弗</至> <从>亚尼</从> <标题>提醒</标题> <body>这周末别忘了我!</ body> </注释>
它扩展了这个例子 。
dataType:“xml”不能解决IE8中的这个问题,而是通过“TypeError”期望。
快速和肮脏的修复,就是将xml响应包装在一个html元素中,比如div:
$("<div>" + xml + "</div>").find("something");
(适用于所有浏览器)
您可能会发现,如果您将数据types传递给get调用,则可能会将其parsing为XML。 IE的怪癖可能会阻止jQuery将其自动检测为XML,导致将错误的数据types传递给callback函数。
<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: } }); }, "xml"); }); </script>
编辑:
实际上我只是经历过.find()不能在任何浏览器中工作,但是我可以使用.filter()来代替。 这是令人讨厌的,我不得不诉诸这个,但如果它的工作….
$(d).filter('message').each(......);
我也有同样的问题,但我已经解决了IE浏览器的jQuery XML .find()问题使用下面的代码。
注意:使用.text()而不是.html()。
jQuery.ajax({ type: "GET", url: "textxml.php", success: function(msg){ data = parseXml(msg); //alert(data); var final_price = jQuery(data).find("price1").text(); alert(final_price); } }); function parseXml(xml) { if (jQuery.browser.msie) { var xmlDoc = new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.loadXML(xml); xml = xmlDoc; } return xml; }
你可以做
<a> <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> </a>
并使用find()。 它适用于IE8和Firefox的V.3.6.3
有时IE读取换行符作为额外的节点。 尝试删除多余的空格,直到标签,或尝试将其封装为CDATA。
当我从XML文档中检索数据时遇到了同样的问题。 在互联网上search了很多东西后,我find了这个网站,但没有正确回答这个问题。 但是有一个答案帮助我解决了这个问题,
“由于IE的问题是xmlparsing器在xml文件上窒息,而这些xml文件并没有通过正确的”text / xml“头传递,所以你可以在Ajax complete事件中包含一些代码:”
我在使用$ .ajax(…)和$ .get(…)调用时发现了两个IE问题:
-
这两个调用的xml参数值必须是大写('XML'而不是'xml')。$ .ajax(…,dataType:“XML”)和$ .get(xmlDataFilePath,function(d){.. 。},“xml”)
-
当ajax调用成功时, callback函数的xml参数实际上是一个不是XML DOM对象的string
第二个问题是这样解决的:
$(document).ready(function() { $.ajax( { type: "GET", url: "messages.xml", dataType: "XML", /* this parameter MUST BE UPPER CASE for it to work in IE */ success: function(xml) { processXmlDoc( createXmlDOMObject ( xml ) ); }, /* success: */ error: function(xhr, textStatus, errorThrown) { alert(textStatus + ' ' + errorThrown); } /* error: */ });/* $.ajax */ function createXmlDOMObject(xmlString) { var xmlDoc = null; if( ! window.DOMParser ) { // the xml string cannot be directly manipulated by browsers // such as Internet Explorer because they rely on an external // DOM parsing framework... // create and load an XML document object through the DOM // ActiveXObject that it can deal with xmlDoc = new ActiveXObject( "Microsoft.XMLDOM" ); xmlDoc.async = false; xmlDoc.loadXML( xmlString ); } else { // the current browser is capable of creating its own DOM parser parser = new DOMParser(); xmlDoc = parser.parseFromString( xmlString, "text/xml" ) ; } return xmlDoc; } function processXmlDoc(xmlDoc) { // write here your XML processing logic for the document object... } }); // $(document).ready
$.ajax({ url: 'messages.xml', success: function(data){ $(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; } }); }, dataType: 'xml' });
试着告诉jQuery dataType是什么,以便它使用正确的方法来处理你的请求。
更改以下内容。
dataType :"text/xml",
至
dataType :"xml",
不需要改变find()。
导入电子邮件联系人时也遇到同样的问题。 我能够导入联系人并显示在所有的浏览器,除了在IE浏览器,因为.find()
不工作。
所以,我把"text/xml"
赋给了response.contentType
。
即response.contentType = "text/xml"
,它的工作。
早些时候是"text/html"
我有同样的问题,我正在开发一个基于Web的应用程序,但我需要它在CD内离线部署它。 我发现解决scheme在这个页面是相同的解决scheme,你可以在上面http://docs.jquery.com/Specifying_the_Data_Type_for_AJAX_Requests和代码是非常简单的:;
$.ajax({ url: "data.xml", dataType: ($.browser.msie) ? "text" : "xml", success: function(data){ var xml; if (typeof data == "string") { xml = new ActiveXObject("Microsoft.XMLDOM"); xml.async = false; xml.loadXML(data); } else { xml = data; } // write here your XML processing logic for the document object... } });
我有同样的问题…
解决这个问题:
http://www.w3schools.com/dom/dom_parser.asp
if (window.DOMParser) { parser=new DOMParser(); xmlDoc=parser.parseFromString(text,"text/xml"); } else // Internet Explorer { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.loadXML(text); }
用它来将你的var转换为xml对象…
它工作正常! 尝试这个,
镀铬/火狐:
xml.children[0].childNodes[1].innerHTML;
IE8 + / Safari浏览器:
xml.childNodes[0].childNodes[1].textContent;
IE8:
xml.documentElement.childNodes[1].text;
示例代码在这里,
var xml = $.parseXML(XMLDOC); Var xmlNodeValue = ""; if(userAgent.match("msie 8.0")){ xmlNodeValue = xml.children[0].childNodes[1].innerHTML; }else{ // IE8+ xmlNodeValue = xml.childNodes[0].childNodes[1].textContent; }
如果XML是由PHP脚本生成的,你可以这样做
<?php header("Content-type: text/xml"); echo '<myxml></myxml>'; ?>
然后find方法适用于每个浏览器