2013-12-17 57 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

相關問題