2010-03-17 2 views
2

입력 필드를 살균 처리하고 프로세스에서 수동으로 캐럿 위치를 가져오고 설정하는 중입니다. 이 문자가 실제로 소독 얻을 않는 경우를 제외하고는 잘 작동정규식에서 많은 문자를 어떻게 대체합니까?

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, ''); 
} 

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

그리고 자바 스크립트 ..., 내 캐럿 위치가 하나 꺼져 : 일부 추상화로, 여기에 기본적인 생각입니다. 기본적으로 sanitize 함수가 실제로 문자를 대체했는지 (그리고 어떤 인덱스에서) 그래서 필요한 경우 charPosition을 조정할 수 있는지 확인하는 방법이 필요합니다. 어떤 아이디어?

+1

이미 jQuery를 사용하는 경우는, 이유가 없다 귀하의 이벤트 처리기를 애매하게 첨부하십시오. 대신 JavaScript에서 onkeyup even 처리기를 첨부해야합니다. –

+0

사실, 이유가 있습니다. 이것은 IE6을 대상으로하는 대규모 웹 애플리케이션 용이며 (불행히도) jQuery document.ready (일부 페이지에서는 4 초 이상)에 큰 성능이 나타납니다. 그래서 나는 가능한 한 많은 자료를 document.ready에서 꺼내려고합니다. (또한 자바 스크립트가 필요한 인트라넷 앱이므로 obtrusiveness는 문제가되지 않습니다.) – macca1

답변

3

흠, 이전 값과 이후 값을 비교하고 그에 따라 보상하는 것이 더 간단하지 않습니까? -

+0

첫 번째 답변은 훌륭했으며 편집 된 답변은 훨씬 효율적입니다. 고마워요! – macca1

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

로 입력 되 있어요 . 드물고 혼란 스럽습니다. 보다 나은 기술은 시각적으로 사용자에게 알리고 아마도 블러 블을 허용하지 않거나 블러 블하는 동안 단순히 살균하는 것일 수 있습니다.

또는 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

관련 문제