Bug Tracker

Changeset 1596

Show
Ignore:
Timestamp:
03/26/07 02:06:50 (2 years ago)
Author:
john
Message:

Added a number of additional speed gains (we now hold our own against Dojo and DOMQuery), touched up some of the selector code, fixed some minor bugs, fixed a bug with triggerEvent in Opera, fixed some more test case bugs.

Location:
trunk/jquery
Files:
4 modified

Legend:

Unmodified
Added
Removed
  • trunk/jquery/build/test/data/testrunner.js

    r1592 r1596  
    265265 */ 
    266266function triggerEvent( elem, type, event ) { 
    267     if ( jQuery.browser.mozilla ) { 
     267    if ( jQuery.browser.mozilla || jQuery.browser.opera ) { 
    268268        event = document.createEvent("MouseEvents"); 
    269269        event.initMouseEvent(type, true, true, elem.ownerDocument.defaultView, 
    270270            0, 0, 0, 0, 0, false, false, false, false, 0, null); 
    271271        elem.dispatchEvent( event ); 
    272     } else if ( jQuery.browser.msie || jQuery.browser.opera ) { 
    273         event = document.createEventObject(); 
    274         elem.fireEvent("on"+type, event); 
    275     } 
    276 } 
     272    } else if ( jQuery.browser.msie ) { 
     273        elem.fireEvent("on"+type); 
     274    } 
     275} 
  • trunk/jquery/src/jquery/coreTest.js

    r1592 r1596  
    345345    $('#check1').click(function() {      
    346346        var checkbox = this;         
    347         ok( !checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); 
     347        ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); 
    348348        $(checkbox).wrap( '<div id="c1" style="display:none;"></div>' ); 
    349         ok( !checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); 
     349        ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); 
    350350        // use a fade in to check state after this event handler has finished 
    351         $("#c1").fadeIn(function() { 
    352             ok( checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); 
     351        setTimeout(function() { 
     352            ok( !checkbox.checked, "Checkbox's state is erased after wrap() action, see #769" ); 
    353353            start(); 
    354         }); 
     354        }, 100); 
    355355    }).click(); 
    356356}); 
     
    693693    isSet( $("#sndp").siblings("[code]").get(), q("sap"), "Check for filtered siblings (has code child element)" );  
    694694    isSet( $("#sndp").siblings("[a]").get(), q("en", "sap"), "Check for filtered siblings (has anchor child element)" ); 
    695     isSet( $("#foo").siblings("form, b").get(), q("form", "floatTest"), "Check for multiple filters" ); 
     695    isSet( $("#foo").siblings("form, b").get(), q("form", "lengthtest", "floatTest"), "Check for multiple filters" ); 
    696696}); 
    697697 
  • trunk/jquery/src/jquery/jquery.js

    r1594 r1596  
    16311631        for ( var i = 0; second[i]; i++ ) 
    16321632            first.push(second[i]); 
    1633  
    16341633        return first; 
    16351634    }, 
  • trunk/jquery/src/selector/selector.js

    r1595 r1596  
    155155            if ( m ) { 
    156156                // Perform our own iteration and filter 
    157                 jQuery.each( ret, function(){ 
    158                     for ( var c = this.firstChild; c; c = c.nextSibling ) 
    159                         if ( c.nodeType == 1 && ( jQuery.nodeName(c, m[1]) || m[1] == "*" ) ) 
     157                for ( var i = 0; ret[i]; i++ ) 
     158                    for ( var c = ret[i].firstChild; c; c = c.nextSibling ) 
     159                        if ( c.nodeType == 1 && ( m[1] == "*" || jQuery.nodeName(c, m[1]) ) ) 
    160160                            r.push( c ); 
    161                 }); 
    162161 
    163162                ret = r; 
     
    167166            } else { 
    168167                // Look for pre-defined expression tokens 
    169                 for ( var i = 0; i < jQuery.token.length; i += 2 ) { 
     168                for ( var i = 0, tl = jQuery.token.length; i < tl; i += 2 ) { 
    170169                    // Attempt to match each, individual, token in 
    171170                    // the specified order 
     
    237236                        // that div#foo searches will be really fast 
    238237                        ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; 
    239  
    240238                    } else { 
    241239                        // We need to find all descendant elements 
    242                         for ( var i = 0, rl = ret.length; i < rl; i++ ) { 
     240                        for ( var i = 0; ret[i]; i++ ) { 
    243241                            // Grab the tag name being searched for 
    244242                            var tag = m[1] != "" || m[0] == "" ? "*" : m[2]; 
     
    253251                        // It's faster to filter by class and be done with it 
    254252                        if ( m[1] == "." ) 
    255                             r = jQuery.grep( r, function(e) { 
    256                                 return jQuery.className.has(e, m[2]); 
    257                             }); 
     253                            r = jQuery.classFilter( r, m[2] ); 
    258254 
    259255                        // Same with ID filtering 
    260256                        if ( m[1] == "#" ) { 
    261                             // Remember, then wipe out, the result set 
    262                             var tmp = r; 
    263                             r = []; 
    264  
    265                             // Then try to find the element with the ID 
    266                             jQuery.each( tmp, function(){ 
    267                                 if ( this.getAttribute("id") == m[2] ) { 
    268                                     r = [ this ]; 
    269                                     return false; 
     257                            var tmp = []; 
     258 
     259                            // Try to find the element with the ID 
     260                            for ( var i = 0; r[i]; i++ ) 
     261                                if ( r[i].getAttribute("id") == m[2] ) { 
     262                                    tmp = [ r[i] ]; 
     263                                    break; 
    270264                                } 
    271                             }); 
     265 
     266                            r = tmp; 
    272267                        } 
    273268 
     
    304299    }, 
    305300 
     301    classFilter: function(r,m,not){ 
     302        m = " " + m + " "; 
     303        var tmp = []; 
     304        for ( var i = 0; r[i]; i++ ) { 
     305            var pass = (" " + r[i].className + " ").indexOf( m ) >= 0; 
     306            if ( !not && pass || not && !pass ) 
     307                tmp.push( r[i] ); 
     308        } 
     309        return tmp; 
     310    }, 
     311 
    306312    filter: function(t,r,not) { 
    307313        var last; 
     
    313319            var p = jQuery.parse, m; 
    314320 
    315             jQuery.each( p, function(i,re){ 
    316          
    317                 // Look for, and replace, string-like sequences 
    318                 // and finally build a regexp out of it 
    319                 m = re.exec( t ); 
     321            for ( var i = 0; p[i]; i++ ) { 
     322                m = p[i].exec( t ); 
    320323 
    321324                if ( m ) { 
     
    329332                    m[2] = m[2].replace(/\\/g, ""); 
    330333 
    331                     return false; 
     334                    break; 
    332335                } 
    333             }); 
     336            } 
    334337 
    335338            if ( !m ) 
    336                 continue; 
     339                break; 
    337340 
    338341            // :not() is a special case that can be optimized by 
     
    340343            if ( m[1] == ":" && m[2] == "not" ) 
    341344                r = jQuery.filter(m[3], r, true).r; 
     345 
     346            // We can get a big speed boost by filtering by class here 
     347            else if ( m[1] == "." ) 
     348                r = jQuery.classFilter(r, m[2], not); 
    342349 
    343350            // Otherwise, find the expression to execute