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:
parent
0a307b332e
commit
141ad3c3e2
27
src/core.js
27
src/core.js
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -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", " " );
|
equals( jQuery.trim(" " + nbsp + "hello " + nbsp + " "), "hello", " " );
|
||||||
|
|
||||||
|
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() {
|
||||||
|
|
Loading…
Reference in a new issue