防止双击 jQuery 链接的最佳方法是什么?
我有一个触发 ajax 调用的链接,当该 ajax 调用返回时,它会显示一条消息。
问题是如果我双击,或者在 ajax 调用返回之前单击它两次,当我真的只想要一条消息时,我会在页面上看到两条消息。
我需要disabled
一个按钮上的属性。但这不适用于链接。
$('a').on('click', function(e){
e.preventDefault();
//do ajax call
});
防止双击 jQuery 链接的最佳方法是什么?
我有一个触发 ajax 调用的链接,当该 ajax 调用返回时,它会显示一条消息。
问题是如果我双击,或者在 ajax 调用返回之前单击它两次,当我真的只想要一条消息时,我会在页面上看到两条消息。
我需要disabled
一个按钮上的属性。但这不适用于链接。
$('a').on('click', function(e){
e.preventDefault();
//do ajax call
});
您可以使用data-
属性,如下所示:
$('a').on('click', function () {
var $this = $(this);
var alreadyClicked = $this.data('clicked');
if (alreadyClicked) {
return false;
}
$this.data('clicked', true);
$.ajax({
//some options
success: function (data) { //or complete
//stuff
$this.data('clicked', false);
}
})
});
我带来了下一个简单的 jquery 插件:
(function($) {
$.fn.oneclick = function() {
$(this).one('click', function() {
$(this).click(function() { return false; });
});
};
// auto discover one-click elements
$(function() { $('[data-oneclick]').oneclick(); });
}(jQuery || Zepto));
// Then apply to selected elements
$('a.oneclick').oneclick();
或者只是在 html 中添加自定义数据属性:
<a data-oneclick href="/">One click</a>
你需要async:false
默认情况下,所有请求都是异步发送的(即默认设置为true)。如果您需要同步请求,请将此选项设置为false
。
$.ajax({
async: false,
success: function (data) {
//your message here
}
})
你可以为此使用一个虚拟类。
$('a#anchorID').bind('click',function(){
if($(this).hasClass('alreadyClicked')){
return false;
}else{
$(this).addClass('alreadyClicked);
$/ajax({
success: function(){$('a#anchorID').removeClass('alreadyClicked');},
error: function(){$('a#anchorID').removeClass('alreadyClicked');}
});
}});
尽管提供了一些很好的解决方案,但我最终使用的方法是只使用一个<button class="link">
我可以设置disabled
属性的方法。
有时最简单的解决方案是最好的。
检查这个例子。您可以在第一次单击后通过 CSS 属性禁用按钮(并在 ajax 请求或使用 setTimeout 后删除此属性)或使用 jQuery.one() 函数在第一次单击后删除触发器(不禁用按钮)
var normal_button = $('#normal'),
one_button = $('#one'),
disabled_button = $('#disabled'),
result = $('#result');
normal_button.on('click', function () {
result.removeClass('hide').append(normal_button.html()+'<br/>');
});
one_button.one('click', function () {
result.removeClass('hide').append(one_button.html()+'<br/>');
});
disabled_button.on('click', function () {
disabled_button.attr('disabled', true);
setTimeout(function () {
result.removeClass('hide').append(disabled_button.html()+'<br/>');
}, 2000);
});
您可以禁用您的链接(例如,href="#"
),并使用click
事件来代替,使用 jQueryone()
函数绑定到链接。
将所有链接与“按钮”类绑定并尝试以下操作:
$("a.button").click(function() { $(this).attr("disabled", "disabled"); });
$(document).click(function(evt) {
if ($(evt.target).is("a[disabled]"))
return false;
});