2013-03-19 33 views
1

問題:我有一個使用下面的代碼在onpressonkeydown HTML文本輸入,並onkeyup事件:正則表達式驗證不允許HOME,END,箭頭鍵的工作

this.value = this.value.replace(/[^a-zA-Z0-9]/, '') 

該作品用於字母數字驗證,但不允許使用主頁鍵,結束鍵或方向鍵放置光標;光標只能使用退格鍵移動。說實話,在某些情況下這是可取的行爲,但在其他情況下則不行。

爲什麼在Firefox和Chrome中這種行爲(還沒有在IE中測試過)?我的問題在於它與this.value =部分將光標放在最後,因爲我從未見過箭頭鍵等的正則表達式。

+0

這不是正則表達式,你可能在某處返回false,並取消該鍵。請張貼更多的代碼。 – bfavaretto 2013-03-19 21:12:31

+1

這應該是所有必要的代碼,但我發佈了整個輸入標籤的代碼(非常冗餘)。雖然退格工作,刪除不會,家庭或方向鍵也不會。正如問題所述,我認爲這與這個價值部分有關。 – Adam 2013-03-19 21:14:06

+0

你是對的。由於每次擊鍵都會替換整個內容(實際上,每次擊鍵都會重複3次),所以在替換之後插入符會被放置在最後。 – bfavaretto 2013-03-19 21:16:52

回答

3

由於您要替換每個擊鍵上的全部內容(實際上,每次擊鍵3次),插入符號將被置於替換後的末尾。

我建議另一種方法:只需更換該字段的內容,如果驗證未通過:

<input id="uname" type="text"> 
var f = document.getElementById('uname'); 
f.addEventListener('keyup', function(e){ 
    var regex = /[^a-zA-Z0-9]/; 
    if(regex.test(this.value)) { 
     this.value = this.value.replace(regex, '') 
    } 
}); 

JavaScript代碼段上面應該在<script>標籤中添加只是</body>之前(或包裹在document.ready/DOMContentLoaded/window.onload處理程序中確保該字段在運行時已經存在)。

Demo

+0

+ +1對於如上所述的不顯眼,它肯定更不顯眼,但沒有腳本標籤OP(或其他人)知道如何應用它? (我很挑剔,我知道)。 – iain 2013-03-19 21:39:14

+1

@iain好的,補充說明一下。 – bfavaretto 2013-03-19 21:41:14

+0

我建議在正則表達式('/ [^ a-zA-Z0-9]/g')中添加'g'修飾符,否則用戶可以複製並粘貼一個無效的字符串。 – carla 2015-09-17 15:30:19

1

兩件事:第一,你觸發事件的三倍,這似乎是不必要的。試試這個:

<script type="text/javascript"> 
    function forceAlphaNumeric(field){ 
     var invalidChars = /[^a-z0-9]/ig 
     if(field.value.match(invalidChars)) 
      field.value = field.value.replace(invalidChars, ''); 
    } 
</script> 
<input id="uname" type="text" onkeypress="forceAlphaNumeric(this);" /> 
+0

+1不顯眼。我想添加+2,如果你已經抓住腳本中的元素_使其真正不引人注意:) – iain 2013-03-19 21:31:05

+0

@iain不!這樣,他可以用一段代碼強制多個字段爲alphaNumeric。這顯然是更好的解決方案,因爲當他增加了強制字段的alphaNumeric性質的方法時,他可以在一個位置更改它,並且每次在頁面上調用時都會影響該頁面(至少),但是具有適當的庫結構整個網站! – FrankieTheKneeMan 2013-03-19 21:33:47

+0

@FrankeTheKneeMan是的,但他可以通過在調用'document.getElementById'後將函數綁定到那裏將它們添加到腳本中。無論如何,這將是我的首選。該函數可以放在一個單獨的腳本中,該腳本包含在需要的地方,甚至還有一個幫助函數來獲取id列表並進行綁定。因人而異。 – iain 2013-03-19 21:36:36