2013-02-08 43 views
1

我寫了一個函數來調用默認jQuery.fn.on -handler,觸發事件的指定次數後,。現在我卡住了,因爲原來event不會傳遞給函數,任何想法如何改進呢?通行證jQuery的事件拖欠,事件處理

;(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

+0

你能指望此行'爲(VAR最後在args);'怎麼辦? – Hogan 2013-02-08 12:54:17

+0

@Hogan在我看來,這是擺脫參數的最後一個項目的最簡單方法。 – yckart 2013-02-08 12:55:20

+0

也就是說,這將是不錯的:)問題 – Hogan 2013-02-08 12:55:38

回答

0

你不是傳遞的參數從回調包裝功能離子到原來的回調函數。

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/

+0

Wohoo,你是我的英雄♥ – yckart 2013-02-08 13:04:56

+0

在我的小提琴,是啊,因爲它只是意味着作爲示例(並作爲一個獨立的功能jQuery的#上)。當你只是在你的代碼中傳遞參數的時候它會起作用。我也更新了小提琴。 – Flo 2013-02-08 13:36:33

+0

是啊,拿到它已經所以我刪除我的評論:對我道:'返回oldOn.apply(這一點,(isNaN(NUM)參數:參數));'http://jsfiddle.net/ARTsinn/hmn3B/ – yckart 2013-02-08 13:40:55

0

我覺得

for (var last in args); 

應該

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

但它不工作http://jsfiddle.net/ARTsinn/hmn3B/0 BTW:''長度>'length';) – yckart 2013-02-08 13:01:49

+0

好自己的方式並沒有爲工作確定 - > http://jsfiddle.net/6fcPf/ – Hogan 2013-02-08 13:10:14