【问题标题】:Pass jQuery event to default on-eventhandler将 jQuery 事件传递给默认的 on-eventhandler
【发布时间】:2013-02-08 12:34:26
【问题描述】:

我编写了一个函数来调用默认的jQuery.fn.on-handler,在给定数量的触发事件之后。现在我卡住了,因为原来的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

【问题讨论】:

  • 你希望这条线for (var last in args);做什么?
  • @Hogan 在我看来,这是从参数中获取最后一项的最简单方法。

标签: events jquery-plugins event-handling jquery


【解决方案1】:

您没有将参数从回调包装函数传递给原始回调函数。

args[j] = function (*HERE*) {
  i++;
  if (i === after) {
    oldFn.call(*TO HERE*);
    i = 0;
  }
};

尝试用oldFn.apply(this, [].slice.call(arguments)); 替换oldFn.call(); 以继续使用它们(并保持jQuery 的this)。

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

【讨论】:

  • 在我的小提琴中,是的,因为它只是作为示例(并且作为 jQuery#on 的单独函数)。但是,当您只在代码中执行参数传递时,它就可以工作。我也更新了小提琴。
  • 是的,已经知道了,因此我删除了我的评论:P 我的方式:return oldOn.apply(this, (isNaN(num) ? arguments : args));jsfiddle.net/ARTsinn/hmn3B
【解决方案2】:

我认为

for (var last in args);

应该是

var last = args[args.length-1];

【讨论】:

猜你喜欢
  • 2016-06-23
  • 2014-08-07
  • 2015-10-29
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2018-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多