2015-12-17 298 views
11

我有一個向後端提交值的表單,但我希望有一個取消按鈕來停止提交表單。使用取消按鈕單擊提交按鈕後防止表單提交

<form action="upload.php" method="post" enctype="multipart/form-data" id="UploadForm"> 
/* 
* 
parameters 
* 
*/ 
<button type="submit" value="submit" id="SubmitButton">Submit</button> 
<button type="button" value="cancel" id="CancelButton">Cancel</button> 
</form> 

任何人都可以請告訴它是如何做到的嗎?

+1

使用'event.preventDefult();'所以很多時候問。 –

+1

@Parth Trivedi ...我懷疑event.preventDefault是否會在這種情況下工作。一旦點擊提交按鈕,表單將被髮布,如何防止默認停止在中途? –

+0

你可以有一個'click'處理程序,根據條件,你可以'返回false',它應該停止。 – Rajesh

回答

-2

嗯,這不適合你嗎?

form (...) onsubmit="return false;" 

代替'return false',你可以使用你希望的任何JS函數。例如,典型的用法是表單驗證。

4

解決方案,能可能工作:

var cancelObject = ''; 

$('#UploadForm').on('submit', function(e){ 

    //prevent default submit 
    e.preventDefault(); 

    //submit via ajax 
    cancelObject = $.post('upload.php', $("#UploadForm").serialize()); 

}); 

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

    //Cancel the request 
    cancelObject.abort(); 

}); 

UNTESTET! - 只有一個想法,可以工作....

+0

嘗試烏爾代碼,它已經停止提交表單,即使提交按鈕 – darcy

-1

添加onsubmit屬性按鈕標籤: <button type="submit" value="submit" id="SubmitButton" onsubmit="return cancel()"> SubmitIt </button>

Javascript: 
function cancel() 
{ 
    var decision=null; 

    alert("Press Y to submit or N to cancel"); 
     decision=prompt("Do you want to submit?","Y or N"); 
     if(decision.equals("Y")) 
{ 
     return true; 
     alert("Form has been submitted"); 

} 
    else if (decision.equals("N")) 
{ 
    return false; 
    alert("Form submission has been cancelled"); 

} 
    else 
{ 
    alert("wrong input.Re-submit the form."); 
    return false; 

} 

} 

如果返回值是true表單將提交.The JS功能要求用戶如果他想繼續並提交或取消該行動。

+0

我不想選擇詢問用戶,我刪除了這部分,並嘗試,但它沒有工作 – darcy

+0

沒有用戶輸入它不會工作!它取決於變量決定的價值。所以,如果你不採取用戶輸入,表單提交將得到每次都取消。 –

+0

這不會創建按鈕。如果您想要一個按鈕,請使用Chris的解決方案。我的解決方案可用於詢問用戶並進行輸入,但按鈕總是更好。 –

1

嘗試類似這樣的事情。這是你的HTML:

<form action="upload.php" method="post" enctype="multipart/form-data" id="UploadForm"> 
    <button type="submit" value="submit" id="SubmitButton">Submit</button> 
    <button type="button" id="CancelButton" disabled>Cancel</button> 
</form> 

這是你的jQuery和JavaScript:

$(function() { 
    var $form = $('#UploadForm'); 
    var form = $form.get(0); 
    var $submit = $('#SubmitButton'); 
    var $cancel = $('#CancelButton'); 
    var xhr = null; 

    function cleanup() { 
    xhr = null; 
    $submit.removeAttr('disabled'); 
    $cancel.attr('disabled', true); 
    } 

    function doneCallback() { 
    // your code for completed form submission goes here 
    // redirect the page or whatever you need to do 
    cleanup(); 
    } 

    $cancel.on('click', function() { 
    if($cancel.attr('disabled')) { 
     return; 
    } 

    if(xhr instanceof XMLHttpRequest) { 
     xhr.abort(); 
    } 

    cleanup(); 
    }) 

    $form.on('submit', function(event) { 
    event.preventDefault(); 

    xhr = new XMLHttpRequest(); 
    xhr.open($form.attr('method'), $form.attr('action'), true); 
    xhr.addEventListener('load', doneCallback); 

    $submit.attr('disabled', true); 
    $cancel.removeAttr('disabled'); 

    xhr.send(new FormData(form)); 

    return false; 
    }); 
}); 

它使用FormData API,以便檢查browser support for that

+0

我試過我們的代碼,雖然它在控制檯中顯示我的upload.php已被中止,但腳本正在運行並且值正在保存在db – darcy

+0

@darcy可能是因爲請求以毫秒爲單位發生。您可以在客戶端或服務器上添加仿真油門嗎?讓它持續幾秒鐘。這是您不經常看到「提交」按鈕旁邊的「取消」按鈕的原因。 –

0

這不像放棄提交那麼簡單。只要點擊該按鈕,就沒有實際的方法知道它的數據已經發送了多少,如果有的話。

Web瀏覽器和Web服務器不保持其請求之間的連接,因此停止腳本客戶端並不意味着它會停止它的服務器端。

要中止提交,您需要向服務器發送第二個請求,告訴服務器它可能已經保存了,因此需要進行刪除,如果需要,您需要一些唯一的ID以確定提交和中止請求,因爲它們將作爲2個唯一請求到達服務器端。

在服務器上,設置一些規則以及實際將數據保存到數據庫需要多少數據可以完成,但是,如果一個用戶只有一個圖像,另一個有3個,如何知道什麼時候該怎麼辦它應該是一個「中止提交」或不是,基於這樣的規則?

保存之前的一段時間延遲可能是其他情況,當中止可以被接受時,但同樣很難使安全失敗並且需要唯一的ID來識別請求。

我想你最好的選擇是保存它,因爲我想相信大多數用戶都希望這樣做,並且如果第二個請求在特定時間範圍內出現,它可以被刪除。

接受和使用Patrick Roberts answer作爲一個開始將是一個好主意。

在這2個類似的帖子中,您可能會發現其他幫助。