1

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
});

错误在哪里,我怎样才能让它工作?

更新

我现在变得简单多了:https ://github.com/yckart/jquery.unevent.js

4

2 回答 2

0

我认为

for (var last in args);

应该

var last = args[args.length-1];
于 2013-02-08T12:56:51.323 回答
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)。

编辑:http: //jsfiddle.net/QFyhX/

于 2013-02-08T13:02:13.487 回答