在javascript中用另一个jQuery click事件覆盖(包装)现有的jQuery click事件

在javascript中用另一个jQuery click事件覆盖(包装)现有的jQuery click事件,javascript,jquery,Javascript,Jquery,假设我有一个现有按钮,并通过jQuery对其进行单击: var $button = $('#test').click(function () { console.log('original function') }); 现在,假设我想覆盖这个点击,这样我就可以在它之前和之后向函数添加一些逻辑。我尝试过使用下面的函数进行绑定和包装 Function.prototype.bind = function () { var fn = this; var args = Array.proto

假设我有一个现有按钮,并通过jQuery对其进行单击:

var $button = $('#test').click(function () { console.log('original function') });
现在,假设我想覆盖这个点击,这样我就可以在它之前和之后向函数添加一些逻辑。我尝试过使用下面的函数进行绑定和包装

Function.prototype.bind = function () {
   var fn = this;
   var args = Array.prototype.slice.call(arguments);
   var object = args.shift();

   return function () {
       return fn.apply(object, args.concat(Array.prototype.slice.call(arguments)));
   }
}

function wrap(object, method, wrapper) {
   var fn = object[method];

   return object[method] = function() {
       return wrapper.apply(this, [fn.bind(this)].concat(
        Array.prototype.slice.call(arguments)));
   }
}
因此,我使用方法是其属性的对象、方法和我想要执行的匿名函数调用wrap。我想:

wrap($button 'click', function (click) {
     console.log('do stuff before original function');
     click();
     console.log('do stuff after original function');
 });
这只调用原始函数。我曾经在对象的方法上成功地使用过这种方法。比如:

有谁能帮我举个具体的例子吗


感谢您,您可以创建一个jQuery函数,从数据中获取原始事件处理程序函数,删除click事件,然后添加一个新的事件处理程序。此函数将有两个前后处理程序的参数(每个函数)

$(function() {

    jQuery.fn.wrapClick = function(before, after) {
        // Get and store the original click handler.
        // TODO: add a conditional to check if click event exists.
        var _orgClick = $._data(this[0], 'events').click[0].handler,
            _self = this;

        // Remove click event from object.
        _self.off('click');

        // Add new click event with before and after functions.
        return _self.click(function() {
            before.call(_self);
            _orgClick.call(_self);
            after.call(_self);
        });
    };

    var $btn = $('.btn').click(function() {
        console.log('original click');
    });

    $btn.wrapClick(function() {
        console.log('before click');
    }, function() {
        console.log('after click');
    });

});

经过长时间的搜索,我得到了与@Corey相同的答案,考虑到多个事件,这里有一种类似的方法:

函数包装(对象、方法、包装器){
var arr=[]
变量事件=$。\u数据(对象[0],“事件”)
if(events[method]&&events[method].length>0){//将所有函数添加到数组中
事件[方法].forEach(函数(obj){
arr.push(目标处理器)
})
}
if(阵列长度){
函数processAll(){//按正确顺序处理所有原始函数
arr.forEach(函数(func){
函数调用(对象)
})
}
object.off(method).on(method,function(e){wrapper.call(object,processAll)})//取消注册以前的事件并调用传递旧方法的新方法
}
}
$(函数(){
$('#test')。单击(函数(){console.log('originalfunction1'));
var$button=$('#test')。单击(函数(){console.log('originalfunction2'));
包装($按钮,'点击',功能(点击,e){
log('do stuff before original functions');
单击()
log('在原始函数之后执行操作');
});
})


单击我
是否可以使用
.off()
解除绑定,然后传入新函数?例如
$('whatever').off()。单击(newFunc)
?。。。嗯,重读这个问题,不确定我最初的评论是否能满足你的需求?@ann0nC0d3r这是在贬低问题issue@charlietfl... 你应该阅读我的全部评论;)@ann0nC0d3r,我真的只是想知道如何(如果我可以)覆盖类似或类似的方法。谢谢。假设原始事件是由jquery添加的,那么事件处理程序是由jquery在内部缓存的。缓存没有记录在api中,可能会发生更改,但您可以了解如何访问那里的事件处理程序并进行重写