2013-12-17 18 views
0

我试图在Dajaxice/Dajax正在处理时阻止使用按钮。我需要保证,如果在Dajax完成之前需要很长时间才能完成第二次Dajaxice onclick调用。如何在调用Dajaxice之前运行jQuery来禁用onclick?目前的解决方案很难看

我检查了Dajax/Dajaxice readthedocs,stackoverflow和google找不到解决方案。于是我开始黑客....

我开始在一个基本的按钮使用Dajaxice可能是这样的:

<button id="btn" onclick="Dajaxice.example.myexample(Dajax.process);"> 
    Click here! 
</button> 

但我想删除onclick属性值,而Dajax正在处理中。我第一次尝试删除的onclick的回调函数,但为时已晚,在这一点上,因为回调不会被调用,直到Dajaxice调用后:

<button id="btn" onclick="Dajaxice.example.myexample(my_js1_callback);"> 
    Click here! 
</button> 

<script> 
    function my_js1_callback(data){ 
    $("#wkbtn").attr('onclick', ""); /* Too Late */ 
    Dajax.process(data); 
    } 
</script> 

的问题是,Dajaxice功能myexample中在onclick属性值清除之前调用(因为它需要或者它们不会调用)。我想在执行Dajaxice函数之前清除之前的

在我的最新尝试,我搬到了Dajaxice调用到了jQuery,而不是在onclick:

<button id="btn" onclick="my_dajaxice_myexample();"> 
    Click here! 
</button> 

<script> 
    function my_js1_callback(data){ 
    Dajax.process(data); /* process callback */ 
    } 
    function my_dajaxice_myexample(){ 
    $("#wkbtn").attr('onclick', ""); /* runs before Dajaxice */ 
     $(function(){Dajaxice.example.myexample(my_js1_callback);}) 
    } 
</script> 

它的工作原理,但似乎丑陋。看起来似乎有一个比这种腰带和吊带矫枉过正的方法更好的东西。

有什么建议吗?

编辑:基于VASH的答案更新:

<button id="btn"> 
    Click here! 
</button> 

与jQuery/Dajaxice代码:

<script> 
$('#btn').click(function(){ 

    $('#btn').attr("disabled", "disabled"); 
    /* other pre-Dajaxice changes here */ 
    Dajaxice.example.myexample(Dajax.process); 
}); 
</script> 

扩展此一点,我喜欢有取代“Dajax的可能性。过程“的用法与函数调用,以允许在此修订的jQuery/Dajaxice代码中运行Dajaxice调用JavaScript代码:

<script> 
function my_callback(data){ 
    /* post-Dajaxice call, pre-Dajax execution changes here */ 
    Dajax.process(data); /* process callback */ 
    /* post-Dajax execution changes here */ 
} 
$('#btn').click(function(){ 

    $('#btn').attr("disabled", "disabled"); 
    /* other pre-Dajaxice changes here */ 
    Dajaxice.example.myexample(my_callback); 
}); 
</script> 

回答

2

我相信这样做就足够了:

留下你的HTML作为是:

<button id="btn"> 
    Click here! 
</button> 

而且用jQuery做到这一点:

$('#btn').click(function(){ 

    $('#btn').attr("disabled", "disabled"); 

    if($('#btn').attr("disabled")) { 
     Dajaxice.example.myexample(Dajax.process); 
    } 
}); 

一个简单的jsfiddle说明了这一点http://jsfiddle.net/37VTL/1/

它禁用按钮,然后检查按钮是否真的被禁用, d如果是,则执行该功能。尽管在禁用按钮之后检查按钮是否被禁用似乎是多余的,但这只是确保您的功能以您想要的方式运行的一种方式。

+0

不幸的是,执行顺序很重要。在FF中运行你的例子并打破这两个文件。getElementBy和attr禁用行,getElement总是首先执行,这似乎表明Dajaxice会在按钮被禁用之前执行。看来我可以移动getElement _into_ btn click函数,所以它必须在禁用btn后执行。 – ChrisFreeman

+0

我的不好,我显然没有阅读你所说的在Dajaxice()函数被调用之前需要清除按钮**的部分。是的,你可以这样做,只是为了确保你的功能在按钮被禁用后运行,你可以检查属性。这是一个更新的jsfiddle:http://jsfiddle.net/37VTL/1/(我会相应地更新我的答案;希望这是你所需要的) –

+0

太好了!通过将两个操作放在同一个函数中强制排序是我所需要的。我想我陷入了试图通过onclick属性中的Dajaxice调用来解决它的陷阱。我对你的回答做出的一个改变是*不*使用额外的if-disabled-check并依赖代码我的推理是,如果这是一个远程机会,代码顺序不起作用,那么检查是不会工作,或者由于if-disable阻止Dajaxice运行,*然后*该按钮变为禁用将导致与锁定一个死锁并没有执行。 – ChrisFreeman

相关问题