Skip to content
Permalink
Browse files

Added a fix for bug #1698, in which injected scripts were executed ou…

…t of order, in relation to the DOM.
  • Loading branch information
jeresig committed Oct 17, 2007
1 parent a2fc65f commit e287007f6a129901a07b6a342d0c7bfa36a7a868
Showing with 36 additions and 20 deletions.
  1. +31 −19 src/core.js
  2. +5 −1 test/unit/core.js
@@ -461,39 +461,51 @@ jQuery.fn = jQuery.prototype = {
if ( table && jQuery.nodeName( this, "table" ) && jQuery.nodeName( elems[0], "tr" ) )
obj = this.getElementsByTagName("tbody")[0] || this.appendChild( document.createElement("tbody") );

var scripts = jQuery( [] );

jQuery.each(elems, function(){
var elem = clone ?
this.cloneNode( true ) :
this;

if ( !evalScript( 0, elem ) )
if ( jQuery.nodeName( elem, "script" ) ) {

// If scripts are waiting to be executed, wait on this script as well
if ( scripts.length )
scripts = scripts.add( elem );

// If nothing is waiting to be executed, run immediately
else
evalScript( 0, elem );

} else {
// Remove any inner scripts for later evaluation
if ( elem.nodeType == 1 )
scripts = scripts.add( jQuery( "script", elem ).remove() );

// Inject the elements into the document
callback.call( obj, elem );
}
});

scripts.each( evalScript );
});
}
};

function evalScript( i, elem ) {
var script = jQuery.nodeName( elem, "script" );

if ( script ) {
if ( elem.src )
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});

else
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );

if ( elem.parentNode )
elem.parentNode.removeChild( elem );
if ( elem.src )
jQuery.ajax({
url: elem.src,
async: false,
dataType: "script"
});

} else if ( elem.nodeType == 1 )
jQuery( "script", elem ).each( evalScript );
else
jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" );

return script;
if ( elem.parentNode )
elem.parentNode.removeChild( elem );
}

jQuery.extend = jQuery.fn.extend = function() {
@@ -834,8 +834,10 @@ test("val(String)", function() {
ok( $("#select1").val() == "3", "Check for modified (via val(String)) value of select element" );
});

var scriptorder = 0;

test("html(String)", function() {
expect(3);
expect(9);
var div = $("div");
div.html("<b>test</b>");
var pass = true;
@@ -850,6 +852,8 @@ test("html(String)", function() {

$("#main").html('foo <form><script type="text/javascript">ok( true, "$().html().evalScripts() Evals Scripts Twice in Firefox, see #975" );</script></form>');

$("#main").html("<script>ok(scriptorder++ == 0, 'Script is executed in order');ok($('#scriptorder').length == 0,'Execute before html')<\/script><span id='scriptorder'><script>ok(scriptorder++ == 1, 'Script is executed in order');ok($('#scriptorder').length == 1,'Execute after html')<\/script></span><script>ok(scriptorder++ == 2, 'Script is executed in order');ok($('#scriptorder').length == 1,'Execute after html')<\/script>");

setTimeout( start, 100 );
});

0 comments on commit e287007

Please sign in to comment.
You can’t perform that action at this time.