在给定数量的触发事件之后,我编写了一个函数来调用默认的jQuery.fn.on
- 处理程序。现在我卡住了,因为原来的event
不会传递给函数,任何想法如何改进呢?
;(function ($) {
var oldOn = $.fn.on,
i = 0;
$.fn.on = function () {
var args = arguments,
j = args.length;
for (var last in args);
while (j--) {
if ($.isFunction(args[j]) && !isNaN(args[last])) {
var oldFn = args[j],
after = args[last];
args[j] = function () {
i++;
if (i === after) {
oldFn.call();
i = 0;
}
};
}
}
if (!isNaN(args[last])) delete args[last];
return oldOn.apply(this, arguments);
};
})(jQuery);
// call the plugin and fire the `fn` after each 20 mousemoves
$(document).on('mousemove', function (e) {
console.log(e); // undefined
}, 20);
如您所见,以下工作会毫无问题:
var oldOn = $.fn.on;
$.fn.on = function () {
return oldOn.apply(this, arguments);
};
$(document).on('click', function(e){
console.log(e) // jQuery.Event
});
错误在哪里,我怎样才能让它发挥作用?
更新
答案 0 :(得分:0)
我认为
for (var last in args);
应该是
var last = args[args.length-1];
答案 1 :(得分:0)
您没有将回调包装函数中的参数传递给原始回调函数。
args[j] = function (*HERE*) {
i++;
if (i === after) {
oldFn.call(*TO HERE*);
i = 0;
}
};
尝试将oldFn.call();
替换为oldFn.apply(this, [].slice.call(arguments));
以将其移除(并保持jQuery的this
)。