2014-09-13 228 views
0

我想在用戶輸入數字或特殊字符時阻止提交數據。我用過這個。下面 防止提交

//restric entering numbers and special characters 

function checkLetters() { 
    var crop = $('#crop').val().trim(); 

    //Entering numbers 
    if (crop.match(/([0-9])/)) { 
     $('#cropEr4').show(); 
     boolsub = false; 

    } 
    else { 
     $('#cropEr4').hide(); 
     boolsub = true; 

    } 

    //Entering special characters 
    if (crop.match(/([!,%,&,@,#,$,^,*,?,_,~])/)) { 
     $('#cropEr3').show(); 
     boolsub = false; 

    } 
    else { 
     $('#cropEr3').hide(); 
     boolsub = true; 

    } 

} 
//prevent submitting 
function validateSubmit() { 
    var crop = $('#crop').val().trim(); 
    if (crop !== "") { 
     $('#cropEr2').hide(); 
     if (boolsub) { 
      boolsub = false; 
      return false; 
     } 
     if (boolsub) { 
      boolsub = true; 
      return true; 
     } 
    } 
    else { 
     $('#cropEr2').show(); 
     return false; 
    } 

} 

是形式。

<form name="myForm" action="../controller/new.php" method="POST" 
    enctype="multipart/form-data" onSubmit="return validateSubmit()"> 
    <table align="left" width="300" height="200"> 
     <tbody> 
      <tr> 
       <td>Crop Name : </td> 
       <td><input type="text" name="crop_id" value=""size="45" id="crop" onkeyup="checkLetters(this.value);"/> 
       <div id="cropEr2" style="display:none;color:red">Enter crop name</div> 
       <div id="cropEr3" style="display:none;color:red">You cannot enter symbols, have to enter only letters.</div> 
       <div id="cropEr4" style="display:none;color:red">You cannot enter numbers, have to enter only letters.</div> 
      </td> 
     </tr> 
     <tr> 
      <td align="center"> 
       <input class="button"type="reset" value="Clear Deatils" /> 
      </td> 
      <td><input type="hidden" name="action" value="add_crop" /> 
       <input class="button" id="submit" type="submit" value="Add Details" /> 
      </td> 
     </tr> 

    </tbody> 
</table> 

誰能告訴我,爲什麼這不起作用?當我輸入數字和特殊字符時,顯示消息,但它仍然在提交表格。 我正在將此代碼加載到facebox中。

+0

它看起來像'boolsub'需要在最外面的範圍。 – DevlshOne 2014-09-13 09:18:23

+0

如果使用jQuery,請勿使用onclick/onsubmit屬性。使用jQuery連接事件。它允許多個處理程序,並且更容易維護代碼。 – 2014-09-13 09:21:54

+0

查看你的JavaScript錯誤控制檯。它說什麼? (請注意,您可能必須對其進行配置,以允許消息自表單提交併加載新頁面以來持久存在)。 – Quentin 2014-09-13 09:26:20

回答

-1

通過防止特殊字符和空白字段完成您的代碼。只是嘗試實現像這樣......

HTML:

<form name="myForm" action="../controller/new.php" method="POST" enctype="multipart/form-data" onSubmit="return validateSubmit()"> 
<input type="text" name="crop_id" value=""size="45" id="crop" /> 
<input class="button" id="submit" type="submit" value="Add Details" /> 
<div id="message" style="color:red;"></div> 
</form> 

JS代碼:

<script src="http://code.jquery.com/jquery-latest.min.js" type="text/javascript"></script> 
<script type="text/javascript"> 
//prevent submitting 
function validateSubmit(){ 
    var crop = $('#crop'); 
    var sh = $('#message'); 
    if(bv(crop,sh) === true && sc(crop,sh) === true){ 
     return true; 
    }else{ 
     return false; 
    } 
} 
function bv(e,sh){ 
    var a = e.val().trim(); 
    //Entering blank characters 
    if (a == ""){ 
     sh.html('Blank not allowed.'); 
     return false; 
    }else{ 
     sh.html('');return true; 
    } 
} 
function sc(e,sh){ 
    var b = e.val().trim(); 
    //Entering special characters 
    if (b.match(/([0-9,!,%,&,@,#,$,^,*,?,_,~])/)){ 
     sh.html('Allows only characters.'); 
     return false; 
    }else{ 
     sh.html('');return true; 
    } 
} 
</script> 
+0

這顯然適用於你,只是試圖實現。 – 2014-09-13 11:12:36

+0

非常感謝你@Rocky,yey!有用 !! :) – huz 2014-09-13 11:37:06

+0

你好,你的歡迎。 – 2014-09-13 11:45:35

-1

更新後OP的評論

var boolsub = true; 
function checkLetters() { 
    var crop = $('#crop').val().trim(); 
    if ((crop.match(/([0-9])/)) || (crop.match(/([!,%,&,@,#,$,^,*,?,_,~])/))) { 
     $('#cropEr3').show(); 
     boolsub = false; 
    } 
    else { 
     $('#cropEr3').hide(); 
     boolsub = true; 
    } 

} 
//prevent submitting 
function validateSubmit() { 
    var chek = 0; 
    var crop = $('#crop').val().trim(); 
    if (crop !== "") { 
     $('#cropEr2').hide(); 
     if (boolsub) { 
      return true; 
     } 
     else { 
      return false; 
     } 
    } 
    else { 
     $('#cropEr2').show(); 
     return false; 
    } 
} 

<form id="form1" runat="server" action="abc.html"> 
<table align="left" width="300" height="200"> 
     <tbody> 
      <tr> 
       <td>Crop Name : </td> 
       <td><input type="text" name="crop_id" value=""size="45" id="crop" onkeyup="checkLetters(this.value);"/> 
       <div id="cropEr2" style="display:none;color:red">Enter crop name</div> 
       <div id="cropEr3" style="display:none;color:red">You cannot enter symbols or numbers, have to enter only letters.</div> 
      </td> 
     </tr> 
     <tr> 
      <td align="center"> 
       <input class="button"type="reset" value="Clear Deatils" /> 
      </td> 
      <td><input type="hidden" name="action" value="add_crop" /> 
       <input class="button" id="submit" type="submit" value="Add Details" onclick="return validateSubmit()" /> 
      </td> 
     </tr> 

    </tbody> 
    </table> 
</form> 

UPDATED DEMO

+0

你只是想通過在文本輸入中按回車來提交表單來繞過客戶端驗證嗎? – Quentin 2014-09-13 09:24:43

+0

如果通過其他方式提交表單,某些瀏覽器將在提交按鈕上觸發點擊事件。我不想依賴它,它是一個不太優雅的解決方案。原來的代碼[作品](http://jsbin.com/lufofuzadoba/1/)無論如何,所以你的改變當然不能解決問題。 – Quentin 2014-09-13 09:33:39

+0

@Quentin:它不起作用。檢查你的代碼'paste bin'。輸入一些數字,按提交,它不會第一次,但再次按提交按鈕具有相同的值,它會提交。 – 2014-09-13 09:37:51

-1

你需要的是 「event.preventDefault()」:如果此方法被調用時,事件的默認動作將不會被觸發。

並添加一個事件提交按鈕。

$("#submit").click(function(event) { 
    var crop = $('#crop').val().trim(); 
      if (crop !== "") { 
       $('#cropEr2').hide(); 
       if (boolsub) { 
        boolsub = false; 
        event.preventDefault() 
       } 
       if (boolsub) { 
        boolsub = true; 
        return true; 
       } 
      } 
      else { 
       $('#cropEr2').show(); 
       event.preventDefault() 
      } 

}); 

您可以刪除此行:的onsubmit = 「返回validateSubmit()」

http://jsfiddle.net/#&togetherjs=L2vRaIkMNT

enter image description here

+0

「validateSubmit」中沒有'event'對象。它使用舊式的內部事件屬性,因此返回值用於確定是否觸發了默認行爲。 – Quentin 2014-09-13 09:25:39

+0

查看我的帖子。您應該在點擊時添加驗證..您將擁有事件對象。 – codebased 2014-09-13 09:27:45

+0

@codebased即使在添加「事件」之後,它仍然無法正常工作,因爲您在回答中建議。 – huz 2014-09-13 09:46:38

0

你需要的是不依賴於JavaScript當有理智的可用選項。

比較牆上的代碼,這樣:

<input type="text" pattern="[a-zA-Z]+" required /> 

突然,只允許字母,甚至不會提交,直到你輸入的東西!

是不是HTML5真棒?

+0

如果世界只使用HTML5這將是一個合理的問題的答案。 JQuery的全部內容都是關於世界上其他機器的工作:) – 2014-09-13 09:27:16

+1

現在是我們停止使用古老的Web瀏覽器的時候了。客戶端驗證對於用戶來說只是一種方便,因此投入大量時間來編寫大量的JS代碼以獲取HTML本地化的功能,這爲縮小少數派提供了方便。 – Quentin 2014-09-13 09:35:31

0

首先測試一下,看看字符串是否包含任何數字。如果是,則將boolsub設置爲false,否則將其設置爲true

然後您測試它是否包含任何特殊字符。如果是,則將boolsub設置爲false,否則將其設置爲true

你爲數字測試設置了boolsub爲何值。您總是爲特殊字符測試覆蓋該值。

默認設置爲boolsubtrue。如果檢查失敗,請將其設置爲false。如果通過支票,千萬不要將其重置爲true

function checkLetters() { 
    boolsub = true; 
    var crop = $('#crop').val().trim(); 

    //Entering numbers 
    if (crop.match(/([0-9])/)) { 
     $('#cropEr4').show(); 
     boolsub = false; 
    } else { 
     $('#cropEr4').hide(); 
    } 

    //Entering special characters 
    if (crop.match(/([!,%,&,@,#,$,^,*,?,_,~])/)) { 
     $('#cropEr3').show(); 
     boolsub = false; 
    } else { 
     $('#cropEr3').hide(); 
    } 

} 

但是請注意,你會過得更好重寫這個讓checkLetters返回的值,而不是設置一個全球性的,並使用modern event binding techniques

+0

我得到了你的意見,但它仍然不能阻止提交。 – huz 2014-09-13 11:31:42

+0

@huz - 是的,它的確如此! (結合其餘的原始代碼) – Quentin 2014-09-13 11:49:47