将jQuery事件传递给默认的on-eventhandler

时间:2013-02-08 12:34:26

标签: events jquery-plugins event-handling jquery

在给定数量的触发事件之后,我编写了一个函数来调用默认的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

2 个答案:

答案 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)。

修改:http://jsfiddle.net/QFyhX/