扩展jQuery单击处理程序(修补$ .fn.click函数?)以检查条件

时间:2014-06-18 16:55:57

标签: javascript jquery

每条评论更新

@adeneo:有this question关于自定义属性disabled属性和this question语法的答案,我觉得内容将该属性添加到列出的元素之外in the docs可以是&#34;实际上已禁用&#34;。确实,我的一些<a>甚至<span>元素可能会获得该属性,以便更加统一地使用CSS和JS来解决它们。

为了简洁和面向未来(例如有人稍后在页面上添加一个或两个输入),我将click事件监听器一次性附加到所有相似的元素 - 并根据元素处理它们是。在ajax请求完成之前,必须禁用某些元素,这个问题被提示。通过点击触发了呼叫,我希望在第一个呼叫完成之前阻止其他呼叫。

@Patrick Q我不知道如何通过一个非常简短的代码段传达我的意图的可行性 - 所以我在codepen中写了一个例子:

example on codepen.


原始问题:

我想为我的&#34;点击&#34;添加一个条件。事件侦听器,用于检查目标元素是否已禁用。

我的一些链接已经或获得了#34;禁用&#34;属性(出于多种原因使用链接更方便 - 尽管交互是用js处理的)。在这种情况下,我希望click处理程序立即返回false(即preventDefault和stopPropogation),因此禁用的链接确实会被禁用。

我当然可以在我的代码中搜索所有点击处理程序附件,并在每个单独添加条件 - 但这真的非常干。另一种方法是根据属性绑定/取消绑定事件 - 但这似乎也很麻烦...我想在一个地方更改它,以便它只是工作无处不在: - 。)

每{{}}},click用于附加侦听器只是$.on()的简写。所以我想我可以扩展它的功能...但是如何?

这是否是正确的思考方向?

3 个答案:

答案 0 :(得分:2)

你可以修补(替换)jQuery $.on方法来添加你的逻辑,但是它很难维护,因为任何时候jQuery改变,你都需要也可以更新你的补丁。

作为概念证明,这里是working monkey patch for $.click - :

jQuery.fn['click'] = function( data, fn ) {

  var wrap = function(handler) {
    return function(e) {
      if ($(e.currentTarget).hasClass('disabled')) { 
        e.stopImmediatePropagation();
        return false;
      } else {
        handler(e); 
      } 
    }
  }

  if(arguments.length > 0) {
    if(typeof fn == 'undefined') {
      this.on('click', null, wrap(data), fn );
    } else {
      this.on('click', null, data, wrap(fn) );
    }
  } else {
    this.trigger('click');
  }
};

请注意,我最终必须从original implementation重现逻辑以正确处理可能参数的变化。

你也可以为$.on编写一个包装器并强迫你的团队使用它,但有人会不可避免地忘记它,而你最终会发现神秘的差异会让人慢慢发疯。 / p>

最后,您可能只想让浏览器使用<button>之类的表单元素来担心它,这些表单元素在disabled时可以正常运行,并根据需要设置样式。

答案 1 :(得分:1)

我不确定我是否理解您要覆盖on的原因,覆盖Jquery.click就足够了。

var old = jQuery.fn.click;
jQuery.fn.click = function(e) {
    //if (e.target == 'unworthy'){ do your stuff;}
old();
};

答案 2 :(得分:1)

点击处理程序按附加顺序执行。如果可以,请在之前添加此,然后附加其他点击处理程序。

$('.yourLinks').click(function(e){
    if(this.disabled){  // or whatever you are checking for
        e.stopImmediatePropagation();  // stops all other click handlers
    }
});

DEMO:http://jsfiddle.net/LxK3U/