这是正常工作的代码:
bonzo.aug({
bind: function (event, handler) {
if (this[0].attachEvent)
this[0].attachEvent('on'+event, handler);
else
this[0].addEventListener(event, handler);
},
unbind: function (event, handler) {
if (this[0].detachEvent)
this[0].detachEvent('on'+event, handler);
else
this[0].removeEventListener(event, handler);
},
once: function (event, handler) {
function doOnce(e) {
bonzo(this).unbind(event, doOnce);
handler.call(this, e);
}
this.bind(event, doOnce);
}
});
但是,当我尝试将它的一部分合并和汤化一点时,unbind
然后once
打破:
(function($){
$.ieEventApi = !!window.attachEvent; // !-[1,];
$.addEventListener = $.ieEventApi ? "attachEvent" : "addEventListener",
$.removeEventListener = $.ieEventApi ? "detachEvent" : "removeEventListener",
$.onForIe = $.ieEventApi ? 'on' : '',
$.adaptEventHandlerForIe = function(f){
return function(e){
e.target = e[(e.target ? e.target : (e.srcElement || document))];
return f(e);
};
};
$.aug({
bind: function (event, handler) {
for(var i = 0; i < this.length; i++) // I'd use Bonzo.each if I could find any documentation for its use.. :-\
this[i][$.addEventListener]($.onForIe+event, $.adaptEventHandlerForIe(handler), false); // The "false" is superfluous on IE, but apparently not problematically so.
return this;
},
unbind: function (event, handler) {
for(var i = 0; i < this.length; i++)
this[i][$.removeEventListener]($.onForIe+event, $.adaptEventHandlerForIe(handler), false);
return this;
},
once: function (event, oncehandler) {
// This just calls the other two, which already handle iteration.
this.bind(event, doOnce);
return this;
function doOnce(e) {
$(e.target /*Or should I be using e.target here?*/ ).unbind(event, doOnce);
oncehandler.call(this, e);
}
}
});
})(bonzo);