2014-02-20 40 views
0

我有一個表單提交按鈕啓動和禁用當滿足條件(完成形式)被啓用。爲了防止雙重提交,我正在使用一個簡單的「onclick禁用按鈕」。它按預期禁用按鈕,但表單不會發布操作。完全沒有任何反應。任何人都可以看到我的錯誤或更正表格,使其正確提交?的Javascript異常,同時防止按鈕提交雙

<form method="post" action="log.php" > 
    ... 
    <INPUT TYPE="submit" name="submit" VALUE="LOG" onClick="this.disabled=true" title="Log the Comment" disabled> 
+2

您在事件處理程序中放入的代碼會在瀏覽器爲對象構建代碼之前觸發。因此,您在瀏覽器提交表單之前將該按鈕設置爲禁用。您可以通過使用常規按鈕並有條件地在事件處理程序中手動提交表單來解決此問題。 –

+1

這是'onSubmit'而不是'onClick' – MMM

+0

謝謝你的回覆!你們都正確地找出問題所在;然而,沒有任何提議的解決方案似乎不起作用。提交php需要時間讓用戶雙擊。我似乎無法停止兩次發生的提交。 – user3283304

回答

0

除了我在你的問題的意見建議,你可以使用一個覆蓋股利。這是一個固定的位置div,定位在整個頁面上,其中z-index999(將其放在所有內容之上)。當其display CSS屬性設置爲none,它不會顯示/呈現在頁面上,但是當它是空的,它被繪製並涵蓋了預防與頁面元素的用戶交互。 Submit按鈕的onclick處理程序在提交表單之前取消隱藏此div。 div有30%的不透明度,所以你可以看到有些東西覆蓋了頁面,但仍然可以看到頁面中的其他元素。

我把一個PHP腳本,包含一個整數,每個迭代的負載是一個服務器端的文本文件生成一些垃圾數據,所以你可以在更新服務器端發生的看到。這證明覆蓋層可以防止重複提交。

<?php 
    // THIS JUST RECORDS SOME JUNK DATA AND INCREMENTS IT EACH LOAD 
    // IN A TEXT FILE TO SHOW THAT THE DATA IS NOT UPDATED MORE 
    // THAN ONCE PER CLICK 
    if (isset($_GET['i'])) { 
     file_put_contents("./record.txt", intval(file_get_contents("./record.txt"), 10) + 1); 
    } else { 
     file_put_contents("./record.txt", "1"); 
    } 
    // THIS SIMULATES EXTENSIVE SERVER SIDE PROCESSING ... FIVE SECONDS WORTH 
    sleep(5); 
?> 

<!--THIS IS THE OVERLAY DIV THAT BLOCKS PAGE INTERACTION DURRING SERVR SIDE PROCESSING 
    THE OVERLAY IS FIXED (SO ITS POSITION IS RELATIVE TO THE BROWSER WINDOW RATHER THAN 
    THE DOCUMENT) AND HAS LEFT, RIGHT, TOP, AND BOTTOM POSITIONS THAT MAKE IT FIT 
    OVER THE ENTIRE BROWSER WINDOW. 
    THE BACKGROUND COLOR IS A LIGHT GRAY AND HAS AN OPACITY OF 30% 
    THESE CAN BE ADJUSTED, MAYBE YOU COULD PUT A "LOADING" GIF OR SOMETHING IN IT 
    AND MAKE IT FIT JUST OVER THE FORM RATHER THAN THE ENTIRE WINDOW... 
    I PUT THE CSS IN THE "STYLE" ATTRIBUTE RATHER THAN IN A STYLE NODE/CSS SCRIPT 
    YOU SHOULD PUT IT IN A CSS SCRIPT 
--> 
<div 
id="formoverlay" 
style="position:fixed; 
     left:0; 
     top:0; 
     right:0; 
     bottom:0; 
     background-color:#aaa; 
     filter:alpha(opacity=30); 
     opacity:.3; 
     z-index:999; 
     display:none;" 
></div> 

<!--THIS IS A FORM THAT SUBMITS TO A PHP PAGE CALLED ONCLICKSUBMIT.PHP (THIS PAGE)--> 
<form method="GET" action="onclicksubmit.php"> 
    <!--HIDDEN INPUT ELEMENT NAMED i. PHP WRITES THE VALUE FROM THE "DATA FILE" ABOVE 
     IN ITS "VALUE" ATTRIBUTE 
    --> 
    <input name="i" id="i" type="hidden" value="<?php echo file_get_contents("./record.txt");?>" /> 
    <!--THE ONCLICK EVENT OF THIS SUBMIT UNHIDES THE "FORMOVERLAY" DIV THAT COVERS THE PAGE--> 
    <input type="Submit" onclick="document.getElementById('formoverlay').style.display='';"/> 
</form> 
+0

謝謝!這是一個非常簡單但有創意的解決方案!我會盡快將其插入我的代碼。 – user3283304

0

我在想什麼是的onClick功能被點擊跑得那麼它永遠不會提交。你有沒有嘗試在你的JavaScript頁面上提交和禁用,並讓它從那裏運行一切?

function sub() 
{ 
    document.getElementById("form name").submit(); 
    this.disabled=true; 
} 

然後在onClick中放入「sub()」。你也可以在HTML中去掉type =「submit」。

這樣,代碼將運行提交功能,然後後禁用按鈕。你也可以把重定向的功能以及:

window.location.replace("..."); 
+0

感謝您的建議!您的代碼提交,但我仍然可以雙擊並強制執行雙提交。這只是我必須忍受的事嗎? – user3283304

+0

您是否嘗試過爲雙擊添加if語句?的document.getElementById( '... ')的addEventListener(' DBLCLICK',函數(){ 無能爲力 },假的)。 – 13ruce1337