jquery event: fixes #4989. blur and focus events now bubble and can be handled using live().

This commit is contained in:
Ariel Flesler 2009-09-14 22:04:22 +00:00
parent f3474c00cd
commit bca8225413
2 changed files with 63 additions and 2 deletions

View File

@ -518,9 +518,10 @@ var withinElement = function( event ) {
}
};
// Create mouseenter and mouseleave events
jQuery.each({
mouseover: 'mouseenter',
mouseout: 'mouseleave'
mouseover: "mouseenter",
mouseout: "mouseleave"
}, function( orig, fix ) {
jQuery.event.special[ fix ] = {
setup: function(){
@ -532,6 +533,36 @@ jQuery.each({
};
});
// Create "bubbling" focus and blur events
jQuery.each({
focus: "focusin",
blur: "focusout"
}, function( orig, fix ){
var event = jQuery.event,
special = event.special,
handle = event.handle;
function ieHandler() {
arguments[0].type = orig;
return handle.apply(this, arguments);
}
special[orig] = {
setup:function() {
if ( this.addEventListener )
this.addEventListener( orig, handle, true );
else
jQuery.event.add( this, fix, ieHandler );
},
teardown:function() {
if ( this.removeEventListener )
this.removeEventListener( orig, handle, true );
else
jQuery.event.remove( this, fix, ieHandler );
}
};
});
jQuery.fn.extend({
bind: function( type, data, fn, thisObject ) {
if ( jQuery.isFunction( data ) ) {

View File

@ -745,6 +745,36 @@ test(".live()/.die()", function() {
jQuery('span#liveSpan1').die('click');
});
test("live with focus/blur", function(){
expect(2);
// Setup
jQuery("<input type='text' id='livefb' />").appendTo("body");
var $child = jQuery("#livefb"),
child = $child[0],
counter = 0;
function count(){
counter++;
}
// Test
$child.live("focus", count);
$child.live("blur", count);
child.focus();
equals(counter, 1, "Test live() with focus event");
child.blur();
equals(counter, 2, "Test live() with blur event");
// Teardown
$child.die("focus", count);
$child.die("blur", count);
$child.remove();
});
test("Non DOM element events", function() {
expect(3);