每条评论更新
@adeneo:有this question关于自定义属性disabled
属性和this question语法的答案,我觉得内容将该属性添加到列出的元素之外in the docs可以是&#34;实际上已禁用&#34;。确实,我的一些<a>
甚至<span>
元素可能会获得该属性,以便更加统一地使用CSS和JS来解决它们。
为了简洁和面向未来(例如有人稍后在页面上添加一个或两个输入),我将click事件监听器一次性附加到所有相似的元素 - 并根据元素处理它们是。在ajax请求完成之前,必须禁用某些元素,这个问题被提示。通过点击触发了呼叫,我希望在第一个呼叫完成之前阻止其他呼叫。
@Patrick Q我不知道如何通过一个非常简短的代码段传达我的意图的可行性 - 所以我在codepen中写了一个例子:
我想为我的&#34;点击&#34;添加一个条件。事件侦听器,用于检查目标元素是否已禁用。
我的一些链接已经或获得了#34;禁用&#34;属性(出于多种原因使用链接更方便 - 尽管交互是用js处理的)。在这种情况下,我希望click
处理程序立即返回false(即preventDefault和stopPropogation),因此禁用的链接确实会被禁用。
我当然可以在我的代码中搜索所有点击处理程序附件,并在每个单独添加条件 - 但这真的非常干。另一种方法是根据属性绑定/取消绑定事件 - 但这似乎也很麻烦...我想在一个地方更改它,以便它只是工作无处不在: - 。)
每{{}}},click
用于附加侦听器只是$.on()
的简写。所以我想我可以扩展它的功能...但是如何?
这是否是正确的思考方向?
答案 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
}
});