Fixed #216, added several tests for ajax module and fixed more stuff revealed by those; Reverted Johns change for each (changeset 433), caused way too much trouble

This commit is contained in:
Jörn Zaefferer 2006-10-13 13:57:55 +00:00
parent ba7dc19416
commit cb53fc02b6
3 changed files with 63 additions and 13 deletions

View File

@ -0,0 +1,4 @@
html text<br/>
<script type="text/javascript">foo = "foo";</script>
<script src="data/test.js"></script>
blabla

View File

@ -46,6 +46,19 @@ jQuery.fn.extend({
* start(); * start();
* }); * });
* *
* @test stop();
* foobar = undefined;
* foo = undefined;
* var verifyEvaluation = function() {
* ok( foobar == "bar", 'Check if script src was evaluated after load' );
* start();
* };
* $('#first').load('data/test.html', function() {
* ok( $('#first').html().match(/^html text/), 'Check content after loading html' );
* ok( foo == "foo", 'Check if script was evaluated after load' );
* setTimeout(verifyEvaluation, 600);
* });
*
* @name load * @name load
* @type jQuery * @type jQuery
* @param String url The URL of the HTML file to load. * @param String url The URL of the HTML file to load.
@ -84,15 +97,11 @@ jQuery.fn.extend({
if ( status == "success" || !ifModified && status == "notmodified" ) { if ( status == "success" || !ifModified && status == "notmodified" ) {
// Inject the HTML into all the matched elements // Inject the HTML into all the matched elements
self.html(res.responseText).each( callback, [res.responseText, status] ); self.html(res.responseText)
// Execute all the scripts inside of the newly-injected HTML
// Execute all the scripts inside of the newly-injected HTML .evalScripts()
jQuery("script", self).each(function(){ // Execute callback
if ( this.src ) .each( callback, [res.responseText, status] );
jQuery.getScript( this.src );
else
eval.call( window, this.text || this.textContent || this.innerHTML || "" );
});
} else } else
callback.apply( self, [res.responseText, status] ); callback.apply( self, [res.responseText, status] );
@ -125,6 +134,16 @@ jQuery.fn.extend({
*/ */
serialize: function() { serialize: function() {
return jQuery.param( this ); return jQuery.param( this );
},
evalScripts: function() {
return this.find('script').each(function(){
if ( this.src )
// for some weird reason, it doesn't work if the callback is ommited
jQuery.getScript( this.src, function() {} );
else
eval.call( window, this.text || this.textContent || this.innerHTML || "" );
}).end();
} }
}); });
@ -299,7 +318,6 @@ jQuery.extend({
* start(); * start();
* }); * });
* *
*
* @name $.get * @name $.get
* @type jQuery * @type jQuery
* @param String url The URL of the page to load. * @param String url The URL of the page to load.
@ -308,7 +326,7 @@ jQuery.extend({
* @cat AJAX * @cat AJAX
*/ */
get: function( url, data, callback, type, ifModified ) { get: function( url, data, callback, type, ifModified ) {
if ( data.constructor == Function ) { if ( data && data.constructor == Function ) {
type = callback; type = callback;
callback = data; callback = data;
data = null; data = null;
@ -376,6 +394,10 @@ jQuery.extend({
* start(); * start();
* }); * });
* *
* @test
* $.getScript("data/test.js");
* ok( true, "Check with single argument, can't verify" );
*
* @name $.getScript * @name $.getScript
* @type jQuery * @type jQuery
* @param String url The URL of the page to load. * @param String url The URL of the page to load.
@ -383,7 +405,11 @@ jQuery.extend({
* @cat AJAX * @cat AJAX
*/ */
getScript: function( url, callback ) { getScript: function( url, callback ) {
jQuery.get(url, callback, "script"); if(callback)
jQuery.get(url, null, callback, "script");
else {
jQuery.get(url, null, null, "script");
}
}, },
/** /**
@ -618,6 +644,23 @@ jQuery.extend({
* } * }
* }); * });
* *
* @test stop();
* foobar = undefined;
* foo = undefined;
* var verifyEvaluation = function() {
* ok( foobar == "bar", 'Check if script src was evaluated for datatype html' );
* start();
* };
* $.ajax({
* dataType: "html",
* url: "data/test.html",
* success: function(data) {
* ok( data.match(/^html text/), 'Check content for datatype html' );
* ok( foo == "foo", 'Check if script was evaluated for datatype html' );
* setTimeout(verifyEvaluation, 600);
* }
* });
*
* @name $.ajax * @name $.ajax
* @type jQuery * @type jQuery
* @param Hash prop A set of properties to initialize the request with. * @param Hash prop A set of properties to initialize the request with.
@ -786,6 +829,9 @@ jQuery.extend({
// Get the JavaScript object, if JSON is used. // Get the JavaScript object, if JSON is used.
if ( type == "json" ) eval( "data = " + data ); if ( type == "json" ) eval( "data = " + data );
// evaluate scripts within html
if ( type == "html" ) $("<div>").html(data).evalScripts();
return data; return data;
}, },

View File

@ -1384,7 +1384,7 @@ jQuery.extend({
each: function( obj, fn, args ) { each: function( obj, fn, args ) {
if ( obj.length == undefined ) if ( obj.length == undefined )
for ( var i in obj ) for ( var i in obj )
if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break; fn.apply( obj[i], args || [i, obj[i]] );
else else
for ( var i = 0; i < obj.length; i++ ) for ( var i = 0; i < obj.length; i++ )
if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break; if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;