Fixed and improved jQuery's event system: The target property of the event object is now fixed (IE and Safari), bind() accepts now a third parameter "amount" to run the function only the specified number of times, oneclick etc. uses this new bind - it removes the handler when it is not necessary anymore, therefore providing better performance, see accordion for test/demo ( http://joern.jquery.com/accordion/accordion.html )
This commit is contained in:
parent
5131224427
commit
897fbfe89c
2 changed files with 26 additions and 21 deletions
|
@ -1583,8 +1583,8 @@ new function(){
|
||||||
var o = e[i];
|
var o = e[i];
|
||||||
|
|
||||||
// Handle event binding
|
// Handle event binding
|
||||||
jQuery.fn[o] = function(f){
|
jQuery.fn[o] = function(f, amount){
|
||||||
return f ? this.bind(o, f) : this.trigger(o);
|
return f ? this.bind(o, f, amount) : this.trigger(o);
|
||||||
};
|
};
|
||||||
|
|
||||||
// Handle event unbinding
|
// Handle event unbinding
|
||||||
|
@ -1592,20 +1592,8 @@ new function(){
|
||||||
|
|
||||||
// Finally, handle events that only fire once
|
// Finally, handle events that only fire once
|
||||||
jQuery.fn["one"+o] = function(f){
|
jQuery.fn["one"+o] = function(f){
|
||||||
// Attach the event listener
|
// use bind with amount param to bind only once
|
||||||
return this.each(function(){
|
return this.bind(o, f, 1);
|
||||||
|
|
||||||
var count = 0;
|
|
||||||
|
|
||||||
// Add the event
|
|
||||||
jQuery.event.add( this, o, function(e){
|
|
||||||
// If this function has already been executed, stop
|
|
||||||
if ( count++ ) return true;
|
|
||||||
|
|
||||||
// And execute the bound function
|
|
||||||
return f.apply(this, [e]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
27
src/jquery/jquery.js
vendored
27
src/jquery/jquery.js
vendored
|
@ -2271,7 +2271,7 @@ jQuery.extend({
|
||||||
handle: function(event) {
|
handle: function(event) {
|
||||||
if ( typeof jQuery == "undefined" ) return false;
|
if ( typeof jQuery == "undefined" ) return false;
|
||||||
|
|
||||||
event = event || jQuery.event.fix( window.event );
|
event = jQuery.event.fix( event );
|
||||||
|
|
||||||
// If no correct event was found, fail
|
// If no correct event was found, fail
|
||||||
if ( !event ) return false;
|
if ( !event ) return false;
|
||||||
|
@ -2295,16 +2295,19 @@ jQuery.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
fix: function(event) {
|
fix: function(event) {
|
||||||
if ( event ) {
|
if(jQuery.browser.msie) {
|
||||||
|
event = window.event;
|
||||||
event.preventDefault = function() {
|
event.preventDefault = function() {
|
||||||
this.returnValue = false;
|
this.returnValue = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
event.stopPropagation = function() {
|
event.stopPropagation = function() {
|
||||||
this.cancelBubble = true;
|
this.cancelBubble = true;
|
||||||
};
|
};
|
||||||
|
event.target = event.srcElement;
|
||||||
|
} else if(jQuery.browser.safari && event.target.nodeType == 3) {
|
||||||
|
event = jQuery.extend({}, event);
|
||||||
|
event.target = event.target.parentNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
return event;
|
return event;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3396,15 +3399,29 @@ jQuery.macros = {
|
||||||
* } )
|
* } )
|
||||||
* @desc Stop only an event from bubbling by using the stopPropagation method.
|
* @desc Stop only an event from bubbling by using the stopPropagation method.
|
||||||
*
|
*
|
||||||
|
* @example $("form").bind( "submit", function(event) {
|
||||||
|
* // do something after submit
|
||||||
|
* }, 1 )
|
||||||
|
* @desc Executes the function only on the first submit event and removes it afterwards
|
||||||
|
*
|
||||||
* @name bind
|
* @name bind
|
||||||
* @type jQuery
|
* @type jQuery
|
||||||
* @param String type An event type
|
* @param String type An event type
|
||||||
* @param Function fn A function to bind to the event on each of the set of matched elements
|
* @param Function fn A function to bind to the event on each of the set of matched elements
|
||||||
|
* @param Number amount An optional amount of times to execute the bound function
|
||||||
* @cat Events
|
* @cat Events
|
||||||
*/
|
*/
|
||||||
bind: function( type, fn ) {
|
bind: function( type, fn, amount ) {
|
||||||
if ( fn.constructor == String )
|
if ( fn.constructor == String )
|
||||||
fn = new Function("e", ( !fn.indexOf(".") ? "jQuery(this)" : "return " ) + fn);
|
fn = new Function("e", ( !fn.indexOf(".") ? "jQuery(this)" : "return " ) + fn);
|
||||||
|
if( amount > 0 ) {
|
||||||
|
var element = this, handler = fn, count = 0;
|
||||||
|
fn = function(e) {
|
||||||
|
if( ++count >= amount )
|
||||||
|
jQuery(element).unbind(type, fn);
|
||||||
|
handler.apply(element, [e]);
|
||||||
|
};
|
||||||
|
}
|
||||||
jQuery.event.add( this, type, fn );
|
jQuery.event.add( this, type, fn );
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue