Skip to content

Commit

Permalink
Datepicker: Abstract mouseover logic to avoid explicit event trigger
Browse files Browse the repository at this point in the history
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
  • Loading branch information
tjvantoll committed Jul 23, 2014
1 parent 69f25db commit c399f1f
Showing 1 changed file with 20 additions and 14 deletions.
34 changes: 20 additions & 14 deletions ui/datepicker.js
Original file line number Diff line number Diff line change
Expand Up @@ -799,12 +799,16 @@ $.extend(Datepicker.prototype, {
datepicker_instActive = inst; // for delegate hover events
inst.dpDiv.empty().append(this._generateHTML(inst));
this._attachHandlers(inst);
inst.dpDiv.find("." + this._dayOverClass + " a");

var origyearshtml,
numMonths = this._getNumberOfMonths(inst),
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("");
if (cols > 1) {
Expand Down Expand Up @@ -2000,18 +2004,20 @@ function datepicker_bindHover(dpDiv) {
$(this).removeClass("ui-datepicker-next-hover");
}
})
.delegate(selector, "mouseover", function(){
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");
if (this.className.indexOf("ui-datepicker-prev") !== -1) {
$(this).addClass("ui-datepicker-prev-hover");
}
if (this.className.indexOf("ui-datepicker-next") !== -1) {
$(this).addClass("ui-datepicker-next-hover");
}
}
});
.delegate( selector, "mouseover", datepicker_handleMouseover );
}

function datepicker_handleMouseover() {
if (!$.datepicker._isDisabledDatepicker( datepicker_instActive.inline? datepicker_instActive.dpDiv.parent()[0] : datepicker_instActive.input[0])) {
$(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");
$(this).addClass("ui-state-hover");
if (this.className.indexOf("ui-datepicker-prev") !== -1) {
$(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! */
Expand Down

0 comments on commit c399f1f

Please sign in to comment.