Tooltip: Handle synthetic focusin events. Fixes #8740 - Tooltip: Does not hide consistently with dynamically loaded content.

This commit is contained in:
Scott González 2012-11-14 14:14:25 -05:00
parent eca5abd873
commit 1b503a237e
2 changed files with 37 additions and 1 deletions

View File

@ -107,4 +107,31 @@ test( "tooltip on .ui-state-disabled element", function() {
equal( $( ".ui-tooltip" ).length, 0 );
});
// http://bugs.jqueryui.com/ticket/8740
asyncTest( "programmatic focus with async content", function() {
expect( 2 );
var element = $( "#tooltipped1" ).tooltip({
content: function( response ) {
setTimeout(function() {
response( "test" );
});
}
});
element.bind( "tooltipopen", function( event ) {
deepEqual( event.originalEvent.type, "focusin" );
element.bind( "tooltipclose", function( event ) {
deepEqual( event.originalEvent.type, "focusout" );
start();
});
setTimeout(function() {
element.blur();
});
});
element.focus();
});
}( jQuery ) );

View File

@ -188,7 +188,8 @@ $.widget( "ui.tooltip", {
_updateContent: function( target, event ) {
var content,
contentOption = this.options.content,
that = this;
that = this,
eventType = event ? event.type : null;
if ( typeof contentOption === "string" ) {
return this._open( event, target, contentOption );
@ -202,6 +203,14 @@ $.widget( "ui.tooltip", {
// IE may instantly serve a cached response for ajax requests
// delay this call to _open so the other call to _open runs first
that._delay(function() {
// jQuery creates a special event for focusin when it doesn't
// exist natively. To improve performance, the native event
// object is reused and the type is changed. Therefore, we can't
// rely on the type being correct after the event finished
// bubbling, so we set it back to the previous value. (#8740)
if ( event ) {
event.type = eventType;
}
this._open( event, target, response );
});
});