我通过为他做一些网络工作帮助了一个朋友.他需要的部分内容是在他的网站上更改几段文字的简单方法.我没有让他编辑HTML,而是决定在其中提供带有消息的XML文件,并使用jQuery将它们从文件中拉出并将它们插入到页面中.
它很棒......在Firefox和Chrome中,在IE7中并不是那么好用.我希望你们中的一个能告诉我原因.我做了一个公平但谷歌搜索但找不到我正在寻找的东西.
这是XML:
This message is put up in the header area. This message is put in the lower left cell.
这是我的jQuery调用:
我在IE中需要做些什么?基于带有[object Object]的消息框,我假设.find正在IE中工作但由于我无法使用[0]索引到数组或检查它的长度我猜这意味着.find不是返回任何结果.有什么理由可以在Firefox和Chrome中完美运行但在IE中失败?
我是jQuery的新手,所以我希望我不仅仅做了一些愚蠢的事情.上面的代码被从论坛中删除,并根据我的需要进行了修改.由于jQuery是跨平台的,我认为我不必处理这个混乱.
编辑:我发现,如果我在Visual Studio 2008中加载页面并运行它,那么它将在IE中工作.事实证明,它在运行开发Web服务器时始终有效.现在我认为IE不喜欢在我的本地驱动器上加载的XML中执行.find所以也许当它在实际的Web服务器上时它可以正常工作.
我已经确认从Web服务器浏览时它工作正常.必须是IE的特色.我猜这是因为Web服务器为xml数据文件传输设置了mime类型,而没有IE不能正确解析xml.
由于IE的问题是它的xml解析器在xml文件上使用正确的"text/xml"标头传递下来,所以你可以在Ajax完成事件中包含一些代码:
complete: function( xhr, status ) { alert( "COMPLETE. You got:\n\n" + xhr.responseText ) ; if( status == 'parsererror' ) { alert( "There was a PARSERERROR. Luckily, we know how to fix that.\n\n" + "The complete server response text was " + xhr.responseText ) ; xmlDoc = null; // Create the xml document from the responseText string. // This uses the w3schools method. // see also if( window.DOMParser ) { parser=new DOMParser(); xmlDoc=parser.parseFromString( xhr.responseText,"text/xml" ) ; } else // Internet Explorer { xmlDoc=new ActiveXObject( "Microsoft.XMLDOM" ) ; xmlDoc.async = "false" ; xmlDoc.loadXML( xhr.responseText ) ; } $( '#response' ).append( 'complete event/xmlDoc: ' + xmlDoc + '
' ) ; $( '#response' ).append( 'complete event/status: ' + status + '
' ) ; processXMLDoc( xmlDoc ) ; } },
Reading XML with jQuery Server says:
Tove Jani Reminder Don't forget me this weekend!
它扩展了这个例子.
检查响应的内容类型.如果将messages.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不支持这种方法.
dataType:"xml"不能解决IE8中的这个问题,而是通过"TypeError"预测.
快速和肮脏的修复,是将xml响应包装在html元素中,如div:
$("" + xml + "").find("something");
(适用于所有浏览器)
您可能会发现,如果将数据类型传递给get调用,它可能会正确解析为XML.IE的怪癖可能会阻止jQuery将其自动检测为XML,从而导致错误的数据类型被传递给回调函数.
编辑:
我实际上只是经历过.find()不能在任何浏览器中为一个项目工作,但我能够使用.filter()代替.令人讨厌的是我不得不诉诸于此,但如果它有效......
$(d).filter('message').each(......);