From 62c1c07cdff943244dac14bf79d5853116d4a544 Mon Sep 17 00:00:00 2001 From: Peinkillar Date: Tue, 28 Aug 2012 16:30:09 +0300 Subject: [PATCH 1/3] Update ui/jquery.ui.selectmenu.js Added hover and blur events to react on mouseover states. --- ui/jquery.ui.selectmenu.js | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js index ae0a953fc10..e0e34aa7f85 100644 --- a/ui/jquery.ui.selectmenu.js +++ b/ui/jquery.ui.selectmenu.js @@ -345,15 +345,17 @@ $.widget("ui.selectmenu", { .bind('mouseover.selectmenu focus.selectmenu', function(e) { // no hover if diabled if (!$(e.currentTarget).hasClass(self.namespace + '-state-disabled') && !$(e.currentTarget).parent("ul").parent("li").hasClass(self.namespace + '-state-disabled')) { + self.hover(e, $(this).data('index')); self._selectedOptionLi().addClass(activeClass); self._focusedOptionLi().removeClass(self.widgetBaseClass + '-item-focus ui-state-hover'); $(this).removeClass('ui-state-active').addClass(self.widgetBaseClass + '-item-focus ui-state-hover'); } }) - .bind('mouseout.selectmenu blur.selectmenu', function() { + .bind('mouseout.selectmenu blur.selectmenu', function(e) { if ($(this).is(self._selectedOptionLi().selector)) { $(this).addClass(activeClass); } + self.blur(e, $(this).data('index')); $(this).removeClass(self.widgetBaseClass + '-item-focus ui-state-hover'); }); @@ -604,6 +606,18 @@ $.widget("ui.selectmenu", { this._trigger("change", event, this._uiHash()); }, + hover: function (event, hoverIndex) { + event.optionValue = this.element[0].options[hoverIndex].value; + this._trigger("hover", event, this._uiHash()); + }, + + blur: function (event, hoverIndex) { + if (this.element[0].options[hoverIndex] != null) { + event.optionValue = this.element[0].options[hoverIndex].value; + } + this._trigger("blur", event, this._uiHash()); + }, + select: function(event) { if (this._disabled(event.currentTarget)) { return false; } this._trigger("select", event, this._uiHash()); From 194356b5d207aa3efbc6ba7072188c8b29ab7419 Mon Sep 17 00:00:00 2001 From: Peinkillar Date: Wed, 5 Sep 2012 15:17:18 +0300 Subject: [PATCH 2/3] Update ui/jquery.ui.selectmenu.js made hover() and blur() methods private and added check for null value in _hover() --- ui/jquery.ui.selectmenu.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js index e0e34aa7f85..c39dd44c484 100644 --- a/ui/jquery.ui.selectmenu.js +++ b/ui/jquery.ui.selectmenu.js @@ -345,7 +345,7 @@ $.widget("ui.selectmenu", { .bind('mouseover.selectmenu focus.selectmenu', function(e) { // no hover if diabled if (!$(e.currentTarget).hasClass(self.namespace + '-state-disabled') && !$(e.currentTarget).parent("ul").parent("li").hasClass(self.namespace + '-state-disabled')) { - self.hover(e, $(this).data('index')); + self._hover(e, $(this).data('index')); self._selectedOptionLi().addClass(activeClass); self._focusedOptionLi().removeClass(self.widgetBaseClass + '-item-focus ui-state-hover'); $(this).removeClass('ui-state-active').addClass(self.widgetBaseClass + '-item-focus ui-state-hover'); @@ -355,7 +355,7 @@ $.widget("ui.selectmenu", { if ($(this).is(self._selectedOptionLi().selector)) { $(this).addClass(activeClass); } - self.blur(e, $(this).data('index')); + self._blur(e, $(this).data('index')); $(this).removeClass(self.widgetBaseClass + '-item-focus ui-state-hover'); }); @@ -606,12 +606,14 @@ $.widget("ui.selectmenu", { this._trigger("change", event, this._uiHash()); }, - hover: function (event, hoverIndex) { - event.optionValue = this.element[0].options[hoverIndex].value; + _hover: function (event, hoverIndex) { + if (this.element[0].options[hoverIndex] != null) { + event.optionValue = this.element[0].options[hoverIndex].value; + } this._trigger("hover", event, this._uiHash()); }, - blur: function (event, hoverIndex) { + _blur: function (event, hoverIndex) { if (this.element[0].options[hoverIndex] != null) { event.optionValue = this.element[0].options[hoverIndex].value; } From 6b87f0aed7ab978bdbc0747111e82f131214f804 Mon Sep 17 00:00:00 2001 From: Dennis Bock Date: Fri, 7 Sep 2012 11:11:26 +0200 Subject: [PATCH 3/3] made blur and hover methods inline and removed unneeded check for null because the element at the index should actually be never null. otherwise it wouldn't be triggered --- ui/jquery.ui.selectmenu.js | 1774 ++++++++++++++++++------------------ 1 file changed, 882 insertions(+), 892 deletions(-) diff --git a/ui/jquery.ui.selectmenu.js b/ui/jquery.ui.selectmenu.js index c39dd44c484..0c679af8a45 100644 --- a/ui/jquery.ui.selectmenu.js +++ b/ui/jquery.ui.selectmenu.js @@ -1,892 +1,882 @@ - /* - * jQuery UI selectmenu 1.3.0pre version - * - * Copyright (c) 2009-2010 filament group, http://filamentgroup.com - * Copyright (c) 2010-2012 Felix Nagel, http://www.felixnagel.com - * Dual licensed under the MIT (MIT-LICENSE.txt) - * and GPL (GPL-LICENSE.txt) licenses. - * - * http://docs.jquery.com/UI - * https://github.com/fnagel/jquery-ui/wiki/Selectmenu - */ - -(function($) { - -$.widget("ui.selectmenu", { - options: { - appendTo: "body", - typeAhead: 1000, - style: 'dropdown', - positionOptions: { - my: "left top", - at: "left bottom", - offset: null - }, - width: null, - menuWidth: null, - handleWidth: 26, - maxHeight: null, - icons: null, - format: null, - escapeHtml: false, - bgImage: function() {} - }, - - _create: function() { - var self = this, o = this.options; - - // set a default id value, generate a new random one if not set by developer - var selectmenuId = (this.element.attr( 'id' ) || 'ui-selectmenu-' + Math.random().toString( 16 ).slice( 2, 10 )).replace(/(:|\.)/g,'') - - // quick array of button and menu id's - this.ids = [ selectmenuId, selectmenuId + '-button', selectmenuId + '-menu' ]; - - // define safe mouseup for future toggling - this._safemouseup = true; - this.isOpen = false; - - // create menu button wrapper - this.newelement = $( '', { - 'class': this.widgetBaseClass + ' ui-widget ui-state-default ui-corner-all', - 'id' : this.ids[ 1 ], - 'role': 'button', - 'href': '#nogo', - 'tabindex': this.element.attr( 'disabled' ) ? 1 : 0, - 'aria-haspopup': true, - 'aria-owns': this.ids[ 2 ] - }); - this.newelementWrap = $( "" ) - .append( this.newelement ) - .insertAfter( this.element ); - - // transfer tabindex - var tabindex = this.element.attr( 'tabindex' ); - if ( tabindex ) { - this.newelement.attr( 'tabindex', tabindex ); - } - - // save reference to select in data for ease in calling methods - this.newelement.data( 'selectelement', this.element ); - - // menu icon - this.selectmenuIcon = $( '' ) - .prependTo( this.newelement ); - - // append status span to button - this.newelement.prepend( '' ); - - // make associated form label trigger focus - this.element.bind({ - 'click.selectmenu': function( event ) { - self.newelement.focus(); - event.preventDefault(); - } - }); - - // click toggle for menu visibility - this.newelement - .bind('mousedown.selectmenu', function(event) { - self._toggle(event, true); - // make sure a click won't open/close instantly - if (o.style == "popup") { - self._safemouseup = false; - setTimeout(function() { self._safemouseup = true; }, 300); - } - return false; - }) - .bind('click.selectmenu', function() { - return false; - }) - .bind("keydown.selectmenu", function(event) { - var ret = false; - switch (event.keyCode) { - case $.ui.keyCode.ENTER: - ret = true; - break; - case $.ui.keyCode.SPACE: - self._toggle(event); - break; - case $.ui.keyCode.UP: - if (event.altKey) { - self.open(event); - } else { - self._moveSelection(-1); - } - break; - case $.ui.keyCode.DOWN: - if (event.altKey) { - self.open(event); - } else { - self._moveSelection(1); - } - break; - case $.ui.keyCode.LEFT: - self._moveSelection(-1); - break; - case $.ui.keyCode.RIGHT: - self._moveSelection(1); - break; - case $.ui.keyCode.TAB: - ret = true; - break; - case $.ui.keyCode.PAGE_UP: - case $.ui.keyCode.HOME: - self.index(0); - break; - case $.ui.keyCode.PAGE_DOWN: - case $.ui.keyCode.END: - self.index(self._optionLis.length); - break; - default: - ret = true; - } - return ret; - }) - .bind('keypress.selectmenu', function(event) { - if (event.which > 0) { - self._typeAhead(event.which, 'mouseup'); - } - return true; - }) - .bind('mouseover.selectmenu', function() { - if (!o.disabled) $(this).addClass('ui-state-hover'); - }) - .bind('mouseout.selectmenu', function() { - if (!o.disabled) $(this).removeClass('ui-state-hover'); - }) - .bind('focus.selectmenu', function() { - if (!o.disabled) $(this).addClass('ui-state-focus'); - }) - .bind('blur.selectmenu', function() { - if (!o.disabled) $(this).removeClass('ui-state-focus'); - }); - - // document click closes menu - $(document).bind("mousedown.selectmenu-" + this.ids[0], function(event) { - if ( self.isOpen ) { - self.close( event ); - } - }); - - // change event on original selectmenu - this.element - .bind("click.selectmenu", function() { - self._refreshValue(); - }) - // FIXME: newelement can be null under unclear circumstances in IE8 - // TODO not sure if this is still a problem (fnagel 20.03.11) - .bind("focus.selectmenu", function() { - if (self.newelement) { - self.newelement[0].focus(); - } - }); - - // set width when not set via options - if (!o.width) { - o.width = this.element.outerWidth(); - } - // set menu button width - this.newelement.width(o.width); - - // hide original selectmenu element - this.element.hide(); - - // create menu portion, append to body - this.list = $( '