Landing a faster trim method. Based upon the work by Travis Hardiman and DBJDBJ. More details here: http://forum.jquery.com/topic/faster-jquery-trim Fixes #2279, #4452, and #4835.

This commit is contained in:
jeresig 2010-03-09 09:14:27 -05:00
parent 0a307b332e
commit 141ad3c3e2
3 changed files with 36 additions and 24 deletions

View file

@ -27,7 +27,8 @@ var jQuery = function( selector, context ) {
rnotwhite = /\S/, rnotwhite = /\S/,
// Used for trimming whitespace // Used for trimming whitespace
rtrim = /^(\s|\u00A0)+|(\s|\u00A0)+$/g, trimLeft = /^\s+/,
trimRight = /\s+$/,
// Match a standalone tag // Match a standalone tag
rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/, rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
@ -567,9 +568,20 @@ jQuery.extend({
return object; return object;
}, },
trim: function( text ) { // Use native String.trim function wherever possible
return (text || "").replace( rtrim, "" ); trim: String.trim ?
}, function( text ) {
return text == null ?
"" :
String.trim( text );
} :
// Otherwise use our own trimming functionality
function( text ) {
return text == null ?
"" :
text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
},
// results is for internal usage only // results is for internal usage only
makeArray: function( array, results ) { makeArray: function( array, results ) {
@ -720,6 +732,13 @@ if ( indexOf ) {
}; };
} }
// Verify that \s matches non-breaking spaces
// (IE fails on this test)
if ( !/\s/.test( "\xA0" ) ) {
trimLeft = /^[\s\xA0]+/;
trimRight = /[\s\xA0]+$/;
}
// All jQuery objects should point back to these // All jQuery objects should point back to these
rootjQuery = jQuery(document); rootjQuery = jQuery(document);

View file

@ -56,10 +56,7 @@
// (WebKit defaults to false instead of true, IE too, if it's in an optgroup) // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected, optSelected: document.createElement("select").appendChild( document.createElement("option") ).selected,
parentNode: div.removeChild( div.appendChild( document.createElement("div") ) ).parentNode === null,
// Will be defined later // Will be defined later
deleteExpando: true,
checkClone: false, checkClone: false,
scriptEval: false, scriptEval: false,
noCloneEvent: true, noCloneEvent: true,
@ -69,7 +66,7 @@
script.type = "text/javascript"; script.type = "text/javascript";
try { try {
script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); script.appendChild( document.createTextNode( "window." + id + "=1;" ) );
} catch( scriptError ) {} } catch(e) {}
root.insertBefore( script, root.firstChild ); root.insertBefore( script, root.firstChild );
@ -81,15 +78,6 @@
delete window[ id ]; delete window[ id ];
} }
// Test to see if it's possible to delete an expando from an element
// Fails in Internet Explorer
try {
delete script.test;
} catch( expandoError ) {
jQuery.support.deleteExpando = false;
}
root.removeChild( script ); root.removeChild( script );
if ( div.attachEvent && div.fireEvent ) { if ( div.attachEvent && div.fireEvent ) {
@ -120,7 +108,6 @@
document.body.appendChild( div ); document.body.appendChild( div );
jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2;
document.body.removeChild( div ).style.display = 'none'; document.body.removeChild( div ).style.display = 'none';
div = null; div = null;
}); });

View file

@ -201,14 +201,20 @@ test("noConflict", function() {
}); });
test("trim", function() { test("trim", function() {
expect(4); expect(9);
var nbsp = String.fromCharCode(160); var nbsp = String.fromCharCode(160);
equals( jQuery.trim("hello "), "hello", "trailing space" ); equals( jQuery.trim("hello "), "hello", "trailing space" );
equals( jQuery.trim(" hello"), "hello", "leading space" ); equals( jQuery.trim(" hello"), "hello", "leading space" );
equals( jQuery.trim(" hello "), "hello", "space on both sides" ); equals( jQuery.trim(" hello "), "hello", "space on both sides" );
equals( jQuery.trim(" " + nbsp + "hello " + nbsp + " "), "hello", "&nbsp;" ); equals( jQuery.trim(" " + nbsp + "hello " + nbsp + " "), "hello", "&nbsp;" );
equals( jQuery.trim(), "", "Nothing in." );
equals( jQuery.trim( undefined ), "", "Undefined" );
equals( jQuery.trim( null ), "", "Null" );
equals( jQuery.trim( 5 ), "5", "Number" );
equals( jQuery.trim( false ), "false", "Boolean" );
}); });
test("isPlainObject", function() { test("isPlainObject", function() {