Permalink
Browse files

Selector: add jQuery.escapeSelector

Fixes gh-1761
Close gh-2878
  • Loading branch information...
1 parent a8c0194 commit 25068bf2c664e05d5ae48d8d2fb480ee572d3b97 Timmy Willison committed Jan 27, 2016
Showing with 34 additions and 3 deletions.
  1. +27 −3 src/selector-native.js
  2. +1 −0 src/selector-sizzle.js
  3. +6 −0 test/unit/selector.js
@@ -37,7 +37,26 @@ var hasDuplicate, sortInput,
documentElement.webkitMatchesSelector ||
documentElement.mozMatchesSelector ||
documentElement.oMatchesSelector ||
- documentElement.msMatchesSelector;
+ documentElement.msMatchesSelector,
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g,
+ fcssescape = function( ch, asCodePoint ) {
+ if ( asCodePoint ) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if ( ch === "\0" ) {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ };
function sortOrder( a, b ) {
@@ -110,7 +129,14 @@ function uniqueSort( results ) {
return results;
}
+function escape( sel ) {
+ return ( sel + "" ).replace( rcssescape, fcssescape );
+}
+
jQuery.extend( {
+ uniqueSort: uniqueSort,
+ unique: uniqueSort,
+ escapeSelector: escape,
find: function( selector, context, results, seed ) {
var elem, nodeType,
i = 0;
@@ -140,8 +166,6 @@ jQuery.extend( {
return results;
},
- uniqueSort: uniqueSort,
- unique: uniqueSort,
text: function( elem ) {
var node,
ret = "",
@@ -10,5 +10,6 @@ jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;
+jQuery.escapeSelector = Sizzle.escape;
} );
@@ -536,3 +536,9 @@ QUnit.asyncTest( "Iframe dispatch should not affect jQuery (#13936)", 1, functio
iframeDoc.write( "<body><form id='navigate' action='?'></form></body>" );
iframeDoc.close();
} );
+
+QUnit.test( "Ensure escapeSelector exists (escape tests in Sizzle)", function( assert ) {
+ assert.expect( 1 );
+
+ assert.equal( jQuery.escapeSelector( "#foo.bar" ), "\\#foo\\.bar", "escapeSelector present" );
+} );

0 comments on commit 25068bf

Please sign in to comment.