aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSimen Bekkhus <sbekkhus91@gmail.com>2014-08-29 14:18:47 +0200
committerScott González <scott.gonzalez@gmail.com>2014-09-29 14:36:46 -0400
commite3e5a9ffa647937d2dd458114e27e04f56bd47d0 (patch)
tree7d1723c35f7fe694f77f1bd74ffcf99b1607e267
parentb20387ab366aba3428dbd54196a74c0b2eb6ea70 (diff)
downloadjquery-ui-e3e5a9ffa647937d2dd458114e27e04f56bd47d0.tar.gz
jquery-ui-e3e5a9ffa647937d2dd458114e27e04f56bd47d0.zip
Menu: Filter out non-items when typing
Fixes #10571 Closes gh-1329
-rw-r--r--tests/unit/menu/menu.html9
-rw-r--r--tests/unit/menu/menu_events.js17
-rw-r--r--ui/menu.js30
3 files changed, 43 insertions, 13 deletions
diff --git a/tests/unit/menu/menu.html b/tests/unit/menu/menu.html
index 05fdcee11..2aa286c69 100644
--- a/tests/unit/menu/menu.html
+++ b/tests/unit/menu/menu.html
@@ -306,6 +306,15 @@
<li>Amesville</li>
</ul>
+<ul id="menu8">
+ <li class="foo">Aberdeen</li>
+ <li class="foo ui-state-disabled">Ada</li>
+ <li class="foo">Adamsville</li>
+ <li class="foo">Addyston</li>
+ <li class="foo">-</li>
+ <li class="foo">-Saarland</li>
+</ul>
+
</div>
</body>
</html>
diff --git a/tests/unit/menu/menu_events.js b/tests/unit/menu/menu_events.js
index 8fa77ab95..0a02cc01b 100644
--- a/tests/unit/menu/menu_events.js
+++ b/tests/unit/menu/menu_events.js
@@ -644,4 +644,21 @@ test( "#9469: Stopping propagation in a select event should not suppress subsequ
equal( logOutput(), "1,2", "Both select events were not triggered." );
});
+asyncTest( "#10571: When typing in a menu, only menu-items should be focused", function() {
+ expect( 3 );
+
+ var element = $( "#menu8" ).menu({
+ focus: function( event, ui ) {
+ equal( ui.item.length, 1, "There should only be one match when filtering" );
+ ok( ui.item.hasClass( "ui-menu-item" ), "element is .ui-menu-item" );
+ equal( ui.item.text(), "-Saarland", "element has correct text" );
+ }
+ });
+
+ setTimeout(function() {
+ element.menu( "widget" ).simulate( "keydown", { keyCode: "-".charCodeAt( 0 ) } );
+ start();
+ });
+});
+
})( jQuery );
diff --git a/ui/menu.js b/ui/menu.js
index 4dfa0d37a..9664e37ef 100644
--- a/ui/menu.js
+++ b/ui/menu.js
@@ -186,13 +186,9 @@ return $.widget( "ui.menu", {
},
_keydown: function( event ) {
- var match, prev, character, skip, regex,
+ var match, prev, character, skip,
preventDefault = true;
- function escape( value ) {
- return value.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" );
- }
-
switch ( event.keyCode ) {
case $.ui.keyCode.PAGE_UP:
this.previousPage( event );
@@ -241,10 +237,7 @@ return $.widget( "ui.menu", {
character = prev + character;
}
- regex = new RegExp( "^" + escape( character ), "i" );
- match = this.activeMenu.find( this.options.items ).filter(function() {
- return regex.test( $( this ).text() );
- });
+ match = this._filterMenuItems( character );
match = skip && match.index( this.active.next() ) !== -1 ?
this.active.nextAll( ".ui-menu-item" ) :
match;
@@ -253,10 +246,7 @@ return $.widget( "ui.menu", {
// to move down the menu to the first item that starts with that character
if ( !match.length ) {
character = String.fromCharCode( event.keyCode );
- regex = new RegExp( "^" + escape( character ), "i" );
- match = this.activeMenu.find( this.options.items ).filter(function() {
- return regex.test( $( this ).text() );
- });
+ match = this._filterMenuItems( character );
}
if ( match.length ) {
@@ -640,6 +630,20 @@ return $.widget( "ui.menu", {
this.collapseAll( event, true );
}
this._trigger( "select", event, ui );
+ },
+
+ _filterMenuItems: function(character) {
+ var escapedCharacter = character.replace( /[\-\[\]{}()*+?.,\\\^$|#\s]/g, "\\$&" ),
+ regex = new RegExp( "^" + escapedCharacter, "i" );
+
+ return this.activeMenu
+ .find( this.options.items )
+
+ // Only match on items, not dividers or other content (#10571)
+ .filter( ".ui-menu-item" )
+ .filter(function() {
+ return regex.test( $( this ).text() );
+ });
}
});