当试图非常快地单击选项卡时,两个选项卡在Jquery SmartWizard.js插件中被选中我尝试了这种方式但没有运气任何人经历过这个...并且还尝试了.on /.off
事件没有运气。< / p>
$($this.steps).bind("click", function (e) {
//e.stopImmediatePropagation();
$($this.steps).unbind("click");
if ($this.steps.index(this) == $this.curStepIdx) {
return false;
}
var nextStepIdx = $this.steps.index(this);
var isDone = $this.steps.eq(nextStepIdx).attr("isDone") - 0;
if (isDone == 1) {
_loadContent($this, nextStepIdx);
}
$($this.steps).bind("click");
return false;
});
答案 0 :(得分:0)
也许设置一个全局变量并检查全局变量是否为真?单击后,您可以使用内置的javascript delay()函数设置一个短暂的延迟。例如,
go=true;
onclick:
go=false;
delay(100, some filler event);
go=true;
编辑:此链接可能有所帮助:http://ejohn.org/blog/how-javascript-timers-work/
编辑:在jQuery中试试这个:
$('id').click(function() {return false;});
然后设置延迟并将其设置回来。
编辑:this似乎对我有用。请注意,如果您以较小的延迟点击链接两次,它将只闪一次。除非你真的快速地将按钮垃圾邮件大约10次,否则它可以正常工作。 (使用最新的Chrome btw)
编辑:http://jsfiddle.net/ZDHZv/2/对我来说很好。如果您对标签使用该方法,则无法获得双重选择。使用$('.selected')
答案 1 :(得分:0)
我通常做这样的事情:
var selection;
$('a').click(function () {
if (selection !== undefined) {
selection.removeClass('selected');
}
selection = $(this);
selection.addClass('selected');
});
但我发现你也可以这样做,假设所有的标签都是兄弟姐妹,没有别的:
$('a').click(function () {
$(this).addClass('selected');
$(this).siblings().removeClass('selected');
});
答案 2 :(得分:0)
您可以尝试这样的事情:
var process = false;
$($this.steps).bind("click", function (e) {
if (process) {
return false;
}
process = true;
if ($this.steps.index(this) == $this.curStepIdx) {
return false;
}
var nextStepIdx = $this.steps.index(this);
var isDone = $this.steps.eq(nextStepIdx).attr("isDone") - 0;
if (isDone == 1) {
_loadContent($this, nextStepIdx);
}
process = false;
return false;
});
答案 3 :(得分:0)
在我阅读了400多行源代码之后,我想我知道问题所在。
它位于函数_loadContent中。由于ajax,内容加载是异步的,并且在ajax加载后设置为select。
因此,虽然单击已完成,但在加载上一个选项卡时可以选择下一个选项卡。
我得到两个答案。
让ajax同步。喜欢
var ajax_args = {
...
async : false,
...
它可以保证所选的和所有的顺序。 但是,正如您所知,它将迫使用户等待内容加载完成。
立即设置选中,然后设置错误样式。喜欢
...
var stepNum = stepIdx + 1;
_showStep($this, stepIdx);// add this to set selected immediately.
if (ajaxurl && ajaxurl.length > 0) {
if ($this.options.contentCache && hasContent) {
return; // remove this and other _showStep calls.
} else {
var ajax_args = {
...
error : function() {
$this.loader.hide();
$this.showError(stepIdx);// show error.
},
...
选择的顺序可以。但是ajax加载和错误样式将变为异步。
这是你的电话。
答案 4 :(得分:0)
嗨,大家好,感谢您的努力,我通过使用UI块插件阻止UI来解决问题
$($this.steps).on("click", function (e) {
e.preventDefault();
e.stopImmediatePropagation();
if ($(this).attr('class') !== 'disabled' && $(this).attr('class') !== 'selected' && $(this).attr('class') !== 'error') {
$('div.swMain').block({ message: "Processing..." });
}
try {
if ($this.steps.index(this) == $this.curStepIdx) {
$('div.swMain').unblock();
return false;
}
var nextStepIdx = $this.steps.index(this);
var isDone = $this.steps.eq(nextStepIdx).attr("isDone") - 0;
if (isDone == 1) {
e.preventDefault();
_loadContent($this, nextStepIdx);
}
}
catch (e) {
$($this.steps).on("click");
console.log("Fast click Error ===> " + e);
}
if ($(this).attr('class') !== 'disabled' && $(this).attr('class') !== 'selected' && $(this).attr('class') !== 'error') {
$('div.swMain').unblock();
}
return false;
});