aboutsummaryrefslogtreecommitdiffstats
path: root/ui/core.js
diff options
context:
space:
mode:
authorAlexander Schmitz <arschmitz@gmail.com>2015-04-26 23:38:21 -0400
committerAlexander Schmitz <arschmitz@gmail.com>2015-05-05 21:43:57 -0400
commit803eaf29f732a68793b806356096fe849b9f470b (patch)
treed1be32beb2405e1abf1db89a4d67c7ec4ec8c9ee /ui/core.js
parent6a03b0f2ba422ec8edbf642eab692cbd20af2f4d (diff)
downloadjquery-ui-803eaf29f732a68793b806356096fe849b9f470b.tar.gz
jquery-ui-803eaf29f732a68793b806356096fe849b9f470b.zip
Core: Add $.fn.labels, $.fn.form, and $.ui.escapeSelector methods
$.fn.labels and $.fn.form mimic the native labels and form properties $.ui.escapeSelector is for escaping attributes and urls for use as selectors Closes gh-1546
Diffstat (limited to 'ui/core.js')
-rw-r--r--ui/core.js52
1 files changed, 51 insertions, 1 deletions
diff --git a/ui/core.js b/ui/core.js
index 5e97e03c0..0487df0a0 100644
--- a/ui/core.js
+++ b/ui/core.js
@@ -88,7 +88,15 @@ $.extend( $.ui, {
if ( element && element.nodeName.toLowerCase() !== "body" ) {
$( element ).blur();
}
- }
+ },
+
+ // Internal use only
+ escapeSelector: ( function() {
+ var selectorEscape = /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g;
+ return function( selector ) {
+ return selector.replace( selectorEscape, "\\$1" );
+ };
+ } )()
} );
// plugins
@@ -126,6 +134,48 @@ $.fn.extend( {
$( this ).removeAttr( "id" );
}
} );
+ },
+
+ // Support: IE8 Only
+ // IE8 does not support the form attribute and when it is supplied. It overwrites the form prop
+ // with a string, so we need to find the proper form.
+ form: function() {
+ return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form );
+ },
+
+ labels: function() {
+ var ancestor, selector, id, labels, ancestors;
+
+ // Check control.labels first
+ if ( this[ 0 ].labels && this[ 0 ].labels.length ) {
+ return this.pushStack( this[ 0 ].labels );
+ }
+
+ // Support: IE <= 11, FF <= 37, Android <= 2.3 only
+ // Above browsers do not support control.labels. Everything below is to support them
+ // as well as document fragments. control.labels does not work on document fragments
+ labels = this.eq( 0 ).parents( "label" );
+
+ // Look for the label based on the id
+ id = this.attr( "id" );
+ if ( id ) {
+
+ // We don't search against the document in case the element
+ // is disconnected from the DOM
+ ancestor = this.eq( 0 ).parents().last();
+
+ // Get a full set of top level ancestors
+ ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() );
+
+ // Create a selector for the label based on the id
+ selector = "label[for='" + $.ui.escapeSelector( id ) + "']";
+
+ labels = labels.add( ancestors.find( selector ).addBack( selector ) );
+
+ }
+
+ // Return whatever we have found for labels
+ return this.pushStack( labels );
}
} );