It works. I just split the building blocks for better readability.
Check the explanations and inline comments to understand how this works and why it should be done as follows.
Of course, this cannot be used to obtain cross-domain content, for which you either need to proxy calls using a script, or think about integration, for example, flXHR (cross-domain Ajax with Flash)
call.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>asd</title> <script src="jquery.js" type="text/javascript"></script> <script src="xmlDoc.js" type="text/javascript"></script> <script src="output.js" type="text/javascript"></script> <script src="ready.js" type="text/javascript"></script> </head> <body> <div> <input type="button" id="getit" value="GetIt" /> </div> </body> </html>
jquery.js (jQuery 1.3.2 uncompressed) test.html is a valid XHTML document
xmlDoc.js
// helper function to create XMLDocument out of a string jQuery.createXMLDocument = function( s ) { var xmlDoc; // is it a IE? if ( window.ActiveXObject ) { xmlDoc = new ActiveXObject('Microsoft.XMLDOM'); xmlDoc.async = "false"; // prevent erros as IE tries to resolve the URL in the DOCTYPE xmlDoc.resolveExternals = false; xmlDoc.validateOnParse = false; xmlDoc.loadXML(s); } else { // non IE. give me DOMParser // theoretically this else branch should never be called // but just in case. xmlDoc = ( new DOMParser() ).parseFromString( s, "text/xml" ); } return xmlDoc; };
output.js
// Output the title of the loaded page // And get the script-tags and output either the // src attribute or code function headerData(data) { // give me the head element var x = jQuery("head", data).eq(0); // output title alert(jQuery("title", x).eq(0).text()); // for all scripttags which include a file out put src jQuery("script[src]", x).each(function(index) { alert((index+1)+" "+jQuery.attr(this, 'src')); }); // for all scripttags which are inline javascript output code jQuery("script:not([src])", x).each(function(index) { alert(this.text); }); }
ready.js
$(document).ready(function() { $('#getit').click(function() { $.ajax({ type : "GET", url : 'test.html', dataType : "xml", // overwrite content-type returned by server to ensure // the response getst treated as xml beforeSend: function(xhr) { // IE doesn't support this so check before using if (xhr.overrideMimeType) { xhr.overrideMimeType('text/xml'); } }, success: function(data) { headerData(data); }, error : function(xhr, textStatus, errorThrown) { // if loading the response as xml failed try it manually // in theory this should only happen for IE // maybe some if (textStatus == 'parsererror') { var xmlDoc = jQuery.createXMLDocument(xhr.responseText); headerData(xmlDoc); } else { alert("Failed: " + textStatus + " " + errorThrown); } } }); }); });
In Opera, everything works without the createXMLDocument and beforeSend .
Additional complexity is required for Firefox (3.0.11) and IE6 (cannot test IE7, IE8, other browsers), because they have a problem when the server returns the Content-Type: does not indicate that it is xml, My web server returned Content-Type: text/html; charset=UTF-8 Content-Type: text/html; charset=UTF-8 for test.html. . In these two browsers, jQuery called the error textStatus with textStatus , saying parsererror . Because on line 3706 in jQuery.js
data = xml ? xhr.responseXML : xhr.responseText;
data set to null. As in FF and IE, the value of xhr.responseXML is null. This is because they do not get the returned data is xml (like Opera). And only xhr.responseText installed with all xhtml code. Because the data is null, line 3708
if ( xml && data.documentElement.tagName == "parsererror" )
throws an exception, which is marked on line 3584, and the status is set to parsererror .
In FF, I can solve the problem with the overrideMimeType() function before sending the request.
But IE does not support this function in the XMLHttpRequest object, so I need to generate the XMLDocument itself if the error callback is executed and the error is parsererror .
example for test.html
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Plugins | jQuery Plugins</title> <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript">var imagePath = '/content/img/so/';</script> </head> <body> </body> </html>