Skip to content

Commit

Permalink
Fixed jquery#216, added several tests for ajax module and fixed more …
Browse files Browse the repository at this point in the history
…stuff revealed by those; Reverted Johns change for each (changeset 433), caused way too much trouble
  • Loading branch information
jzaefferer committed Oct 13, 2006
1 parent ba7dc19 commit cb53fc0
Show file tree
Hide file tree
Showing 3 changed files with 63 additions and 13 deletions.
4 changes: 4 additions & 0 deletions build/test/data/test.html
@@ -0,0 +1,4 @@
html text<br/>
<script type="text/javascript">foo = "foo";</script>
<script src="data/test.js"></script>
blabla
70 changes: 58 additions & 12 deletions src/ajax/ajax.js
Expand Up @@ -46,6 +46,19 @@ jQuery.fn.extend({
* 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
* @type jQuery
* @param String url The URL of the HTML file to load.
Expand Down Expand Up @@ -84,15 +97,11 @@ jQuery.fn.extend({

if ( status == "success" || !ifModified && status == "notmodified" ) {
// Inject the HTML into all the matched elements
self.html(res.responseText).each( callback, [res.responseText, status] );

// Execute all the scripts inside of the newly-injected HTML
jQuery("script", self).each(function(){
if ( this.src )
jQuery.getScript( this.src );
else
eval.call( window, this.text || this.textContent || this.innerHTML || "" );
});
self.html(res.responseText)
// Execute all the scripts inside of the newly-injected HTML
.evalScripts()
// Execute callback
.each( callback, [res.responseText, status] );
} else
callback.apply( self, [res.responseText, status] );

Expand Down Expand Up @@ -125,6 +134,16 @@ jQuery.fn.extend({
*/
serialize: function() {
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();
}

});
Expand Down Expand Up @@ -299,7 +318,6 @@ jQuery.extend({
* start();
* });
*
*
* @name $.get
* @type jQuery
* @param String url The URL of the page to load.
Expand All @@ -308,7 +326,7 @@ jQuery.extend({
* @cat AJAX
*/
get: function( url, data, callback, type, ifModified ) {
if ( data.constructor == Function ) {
if ( data && data.constructor == Function ) {
type = callback;
callback = data;
data = null;
Expand Down Expand Up @@ -376,14 +394,22 @@ jQuery.extend({
* start();
* });
*
* @test
* $.getScript("data/test.js");
* ok( true, "Check with single argument, can't verify" );
*
* @name $.getScript
* @type jQuery
* @param String url The URL of the page to load.
* @param Function callback A function to be executed whenever the data is loaded.
* @cat AJAX
*/
getScript: function( url, callback ) {
jQuery.get(url, callback, "script");
if(callback)
jQuery.get(url, null, callback, "script");
else {
jQuery.get(url, null, null, "script");
}
},

/**
Expand Down Expand Up @@ -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
* @type jQuery
* @param Hash prop A set of properties to initialize the request with.
Expand Down Expand Up @@ -786,6 +829,9 @@ jQuery.extend({

// Get the JavaScript object, if JSON is used.
if ( type == "json" ) eval( "data = " + data );

// evaluate scripts within html
if ( type == "html" ) $("<div>").html(data).evalScripts();

return data;
},
Expand Down
2 changes: 1 addition & 1 deletion src/jquery/jquery.js
Expand Up @@ -1384,7 +1384,7 @@ jQuery.extend({
each: function( obj, fn, args ) {
if ( obj.length == undefined )
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
for ( var i = 0; i < obj.length; i++ )
if ( fn.apply( obj[i], args || [i, obj[i]] ) === false ) break;
Expand Down

0 comments on commit cb53fc0

Please sign in to comment.