2010-03-17 39 views
2

我消毒的輸入欄和手動獲取和設置在該過程中插入位置。對於一些抽象的,這裏的基本思想是:如何替換正則表達式中的許多字符?

<input type="text" onkeyup"check(this)"> 

和JavaScript ...

function check(element) { 
    var charPosition = getCaretPosition(element); 
    $(element).val(sanitize($(element).val())); 
    setCaretPosition(element, charPosition); 
} 

function sanitize(s) { 
    return s.replace(/[^a-zA-Z0-9\s]/g, ''); 
} 

這是工作除了當一個字符不會真正得到消毒罰款,我的插入位置是關閉的一個。基本上我想辦法,看看是否的sanitize功能實際上已經取代了字符(以及在什麼指數)所以後來我在必要時調整charPosition。有任何想法嗎?

+1

如果您已經使用jQuery,沒有理由突然附加你的事件處理程序。相反,你應該在你的JavaScript中附加onkeyup甚至處理程序。 – 2010-03-17 21:32:25

+0

其實,有一個原因。這是一個大的web應用程序針對IE6(不幸),有一個巨大的性能擊中的jQuery的document.ready(在一些網頁上4+秒)。所以我試圖儘可能地從document.ready中取出儘可能多的東西。 (此外,這是在需要的JavaScript內部網應用程序,所以突出性不是問題) – macca1 2010-03-18 00:56:55

回答

3

嗯,是不是很簡單之前和之後的值進行比較,然後相應的補償? -

charPosition -= beforeVal.length - afterVal.length; 
+0

你的第一個答案是偉大的,你編輯的答案是更有效的。非常感謝! – macca1 2010-03-17 20:52:54

2

對於您的特定問題,J-P的答案是最簡單的。

一般來說,如果你想知道一個替代的結果,最簡單的方法是寫自己的替換功能:

var numReplaced = 0; 

function sanitize(s) { 
    return s.replace(/[^a-zA-Z0-9\s]/g, replacementFunc); 
} 
function replacementFunc() { 
    numReplaced += arguments[0].length; 
    return ""; 
} 
2

我個人認爲你應該重新考慮改變數據它正在鍵入。這很不尋常,可能會讓人困惑。更好的技術可能是在視覺上通知用戶並且可能不允許模糊或在onblur期間簡單地進行消毒。

另外,考慮使用的onkeydown,如果不正確的密鑰類型將短路它們按鍵完全和避免需要在現場替換文本返回false。

<input type="text" onkeydown="return check(event)"> 

但你必須手動處理的鍵碼,包括調節劑(Shift,Ctrl,...):

<script> 
    function check(e) { 
    var w = e.which; 
    var k = e.ctrlKey||e.altKey||e.metaKey; 
    var m = k||e.shiftKey; 
    return (!k && w>=65&&w<90) // a-z allowing shift 
      ||(!m && w>=48&&w<=57) // 0-9 no modifiers 
      ||(w>=33&&w<=40)  // navigation keys 
      ||w==8     // Backspace 
      ||w==9     // Tab 
      ||w==13    // Return 
      ||w==32    // Space 
      ||w==46    // Delete 
      ; 
    } 
</script> 
+0

謝謝,這是一個很好的建議,我沒有考慮。我會嘗試將其添加到我正在構建的框架中。謝謝! – macca1 2010-03-18 01:03:08