Datepicker: Abstract mouseover logic to avoid explicit event trigger

The reliance on `.mouseover()` caused an issue in some circumstances
(see #5816). The removal of `.mouseover()` broke keyboard navigation
(see #10319).

Fixes #10319
Closes gh-1290
This commit is contained in:
TJ VanToll 2014-07-23 12:50:49 -04:00
parent 69f25dbff7
commit c399f1f77a

View File

@ -799,12 +799,16 @@ $.extend(Datepicker.prototype, {
datepicker_instActive = inst; // for delegate hover events datepicker_instActive = inst; // for delegate hover events
inst.dpDiv.empty().append(this._generateHTML(inst)); inst.dpDiv.empty().append(this._generateHTML(inst));
this._attachHandlers(inst); this._attachHandlers(inst);
inst.dpDiv.find("." + this._dayOverClass + " a");
var origyearshtml, var origyearshtml,
numMonths = this._getNumberOfMonths(inst), numMonths = this._getNumberOfMonths(inst),
cols = numMonths[1], cols = numMonths[1],
width = 17; width = 17,
activeCell = inst.dpDiv.find( "." + this._dayOverClass + " a" );
if ( activeCell.length > 0 ) {
datepicker_handleMouseover.apply( activeCell.get( 0 ) );
}
inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width(""); inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");
if (cols > 1) { if (cols > 1) {
@ -2000,18 +2004,20 @@ function datepicker_bindHover(dpDiv) {
$(this).removeClass("ui-datepicker-next-hover"); $(this).removeClass("ui-datepicker-next-hover");
} }
}) })
.delegate(selector, "mouseover", function(){ .delegate( selector, "mouseover", datepicker_handleMouseover );
if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline ? dpDiv.parent()[0] : datepicker_instActive.input[0])) { }
$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
$(this).addClass("ui-state-hover"); function datepicker_handleMouseover() {
if (this.className.indexOf("ui-datepicker-prev") !== -1) { if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
$(this).addClass("ui-datepicker-prev-hover"); $(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
} $(this).addClass("ui-state-hover");
if (this.className.indexOf("ui-datepicker-next") !== -1) { if (this.className.indexOf("ui-datepicker-prev") !== -1) {
$(this).addClass("ui-datepicker-next-hover"); $(this).addClass("ui-datepicker-prev-hover");
} }
} if (this.className.indexOf("ui-datepicker-next") !== -1) {
}); $(this).addClass("ui-datepicker-next-hover");
}
}
} }
/* jQuery extend now ignores nulls! */ /* jQuery extend now ignores nulls! */