Bug Tracker

Ticket #1698: jquery-20071012.patch

File jquery-20071012.patch, 2.1 kB (added by diz, 1 year ago)

New patch that should correct kennydee's test case.

  • .js

    old new  
    397397            if ( table && jQuery.nodeName(this, "table") && jQuery.nodeName(a[0], "tr") ) 
    398398                obj = this.getElementsByTagName("tbody")[0] || this.appendChild(document.createElement("tbody")); 
    399399 
    400             jQuery.each( a, function(){ 
    401                 var elem = clone ? this.cloneNode(true) : this; 
    402                 if ( !evalScript(0, elem) ) 
    403                     fn.call( obj, elem ); 
     400            jQuery.each(a, function() { 
     401                var elem = clone ? jQuery.extractScript(this.cloneNode(true)) : jQuery.extractScript(this); 
     402                if (elem[1]) 
     403                    fn.call(obj, elem[1]); 
     404                if (elem[0]) 
     405                    jQuery.evalScript(elem[0]); 
    404406            }); 
    405407        }); 
    406408    } 
    407409}; 
    408410 
    409 function evalScript(i, elem){ 
    410     var script = jQuery.nodeName(elem, "script"); 
    411  
    412     if ( script ) { 
    413         if ( elem.src ) 
    414             jQuery.ajax({ url: elem.src, async: false, dataType: "script" }); 
    415         else 
    416             jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); 
    417      
     411// This function should be called with a single argument: the DOM elements in jQuery format. 
     412// Returns an array containing at key 0 the extracted script elements and at key 1 the remaining DOM elements. 
     413jQuery.extractScript = function() { 
     414    var r = !arguments[1], 
     415        elem = r ? arguments[0] : arguments[1]; 
     416    if ( jQuery.nodeName(elem, "script") ) { 
    418417        if ( elem.parentNode ) 
    419418            elem.parentNode.removeChild(elem); 
    420  
     419        if ( r ) 
     420            return [elem, null]; 
    421421    } else if ( elem.nodeType == 1 ) 
    422     jQuery("script", elem).each(evalScript); 
     422        return [jQuery("script", elem).each(jQuery.extractScript), elem]; 
     423    else 
     424        return [null, elem]; 
     425}; 
    423426 
    424     return script; 
    425 } 
     427// This function should be called with a single argument: the script element alone or in a jQuery list. 
     428jQuery.evalScript = function() { 
     429    var scr = arguments[1] ? arguments[1] : arguments[0]; 
     430    if ( scr.each ) { 
     431        scr.each(jQuery.evalScript); 
     432    } else { 
     433        if ( scr.src ) 
     434            jQuery.ajax({ url: scr.src, async: false, dataType: "script" }); 
     435        else 
     436            jQuery.globalEval( scr.text || scr.textContent || scr.innerHTML || "" ); 
     437    } 
     438}; 
    426439 
    427440jQuery.extend = jQuery.fn.extend = function() { 
    428441    // copy reference to target object