2013-04-11 96 views
0

我試圖驗證一個主題的字段,我將在發送郵件時使用郵件()發送郵件並使用它。JS正則表達式被跳過?

到目前爲止,我已經完成了正則表達式,編輯了一個現有的Javascript片段,並使用前實習生的字段驗證功能,在我的HTML輸入字段中添加了一個模式,並編寫了一個小型的服務器端PHP/regex驗證下一頁。它看起來在第一眼看起來很好,但是當我刪除我的inputfield中的模式(通過Chrome使用inspect元素完成)時,Javascript檢查被完全跳過並且我的表單被髮布。僅由於服務器端檢查,我返回到上一頁。

下面是一些我使用的代碼:

的Javascript

<script type="text/javascript"> 
    if($.browser.msie || navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1) 
    { 
     jQuery(function(){ 
      $("#submit").click(function(){ 
      $(".error").hide(); 

      var hasError = false; 
      var onderwerpReg = /^[a-zA-Z0-9_]{4,20}[^\/'"<>;]*$/; 
      var onderwerpVal = $("#subject").val(); 

      if (onderwerpVal == '') 
      { 
       $("#subject").html('<br/><span class="error">Vul een onderwerp in.</span>'); 
       var hasError = true; 
      } 
      else if (!onderwerpReg.test(onderwerpVal)) 
      { 
       $("#subject").html('<br/><span class="error">Onderwerp bevat gefilterde karakters.</span>'); 
       var hasError = true; 
      } 
      if (hasError == true) 
       return false; 
      }); 
     }); 
    } 
</script> 

HTML

<input type="text" id="subject" name="subject" size="30" placeholder="Onderwerp" required aria-required="true" pattern="^[a-zA-Z0-9_]{4,20}[^\/'&quot;<>;]*$"/> 

我的問題是:怎麼可能,我的一段JavaScript代碼是被跳過?我沒有正確加載它嗎? Javascript明顯錯了嗎?另一方面,它在我網站上的其他表格上工作,所以我認爲我會堅持以同樣的方式驗證字段。

回答

1

我可能是錯的,但... if($.browser.msie || navigator.userAgent.indexOf('Safari') != -1 && navigator.userAgent.indexOf('Chrome') == -1)。只有在使用IE或Safari時才能完成檢查。
我不知道,但它可能是瀏覽器發送一個形式錯誤(模式不匹配)阻止,所以他這樣做是爲了只檢查不支持的格局屬性瀏覽器(它不是很多問題無論如何用戶可以做任何他想跳過JS中的驗證)。再一次,我不確定這一點。

編輯:
關於使用錯誤發送形式的一部分。我測試過了,如果它匹配模式(或者是一個空字符串,但是有必要的屬性),則只能發送它。

+0

我看着你的答案,得出的結論是,它確實在IE中工作。我知道Javascript可以被禁用,並且可以通過編輯客戶端手動刪除該模式,這樣當服務器端檢查啓動時。您認爲如果忽略JS +模式會有什麼壞處? – 2013-04-11 09:59:05

+0

檢查的所有情況下(我假設)。所以,對於任何普通用戶來說,這裏沒有問題。對於只想惹你的應用的人來說,有服務器端檢查。 JS檢查(和HTML在這裏)僅僅是對用戶的禮貌。 – Loamhoof 2013-04-11 10:00:52

+0

好吧,夠公平的。至少現在我知道我需要查看其他頁面上的服務器端檢查。我會接受你的回答:) – 2013-04-11 10:02:03

0

正如Loamhoof已經說了,你的JS代碼在Chrome中執行。

但是當我刪除我的inputfield模式(通過檢查與鉻元素來完成的),JavaScript的檢查也完全跳過

pattern屬性無關,與你的JavaScript。

它是HTML5規範具有由瀏覽器本身直接驗證表單字段的一部分,而沒有任何腳本。

因此,您的JavaScript代碼實際上只是Internet Explorers的後備解決方案,它尚未實現HTML5表單字段驗證。 (也許IE 10的確如此,但是< = 9肯定不是。)

至於你的問題,如果通過JS進行驗證被忽略,是否會有害 - 如果你驗證你的數據服務器沒有,實際上「有害」 - (你絕對總是要做)。進行客戶端驗證只是用戶友好性的問題,因爲它可以避免用戶提交未正確填寫表單的麻煩,只能在下一頁獲取服務器端生成的錯誤消息。無論您希望保持此腳本在用戶使用IE時爲用戶提供這種額外的舒適功能,還是隻使用現代瀏覽器中的HTML5方式,您都可以使用該腳本,這取決於您。