2009-10-08 2 views
2

나는이 트릭을 사용하여 그것이 textareainput 요소에서 maxlength 속성을 에뮬레이트 할 수 있다고 알고 : checkLenght의 사용하여방지 사용자

<textarea rows="5" cols="30" onkeydown="return checkLength(this)"></textarea> 

<script type="text/javascript"> 
var maxLength = 30; 

function checkLength(elem) { 
    if (elem.value.length == maxLength) { 
    return false; 
    } 
    return true; 
} 
</script> 

을 반환 값을 onkeydown 이벤트의 반환 값으로 사용하면 입력 한 문자가 나타나기 전에 이벤트 체인이 끊어 지므로 사용자가 구성된 제한을 초과하여 글을 쓰는 것을 효과적으로 방지 할 수 있습니다.

Prototype의 이벤트 옵저버를 사용하여 동일한 기술을 시도했지만 작동하지 않았습니다. 여기에 내가 뭘하려의 단순화 된 버전입니다 : 내가 false를 반환하여 이벤트 체인을 깰 수 없기 때문에

<textarea rows="5" cols="30" id="myTextArea"></textarea> 

<script type="text/javascript"> 
var maxLength = 30; 

function checkLength() { 
    if ($('myTextArea').value.length == maxLength)) { 
    return false; 
    } 
    return true; 
} 

document.observe('dom:loaded',function(){ 
    $('myTextArea').observe('keydown',checkLength); 
}); 
</script> 

분명히,이 작동하지 않습니다 (그리고 Event.stop() 만 정지하지 실행을 버블 링에서이 이벤트를 방지 할 수 있습니다 전부).

onkeyup 이벤트에서 텍스트 영역의 길이를 확인하고 제한을 초과하면 해당 값을 잘라서이 문제를 해결했습니다. 사용자가 텍스트가 나타나고 사라지는 것을 볼 수 있기 때문에 동일하지는 않습니다.

동일한 결과를 얻을 수있는 방법이 있습니까?

+0

매우 관련이 있지만 웹 사이트에서 그렇게 할 때 사용하겠습니다. 사용자가 원하는 것을 입력하게하는 것이 훨씬 좋지만, 수락하기 전에 수정 (단축)해야하는 좋은 피드백을 제공하십시오. –

+0

글쎄, 데스크톱 응용 프로그램의 표준으로, 입력 한도를 초과하여 작성할 수 없습니다. 차이점은 데스크톱 응용 프로그램에서는 일반적으로 "삐"소리가 들린다는 것입니다. 어쨌든 대부분의 사용자는 이미 작성된 텍스트를 다시 작성 (또는 삭제)해야하기 때문에 한도를 초과하여 글을 쓰려고 할 때 즉각적인 피드백을 선호합니다. –

답변

3

다른 답변 및 의견을 고려하십시오. 게시물 유효성을 확인하고 게시물을 승인하지 않는 것이 좋습니다.

는 그럼에도 불구하고 다음은

<textarea rows="5" cols="30" id="myTextArea"></textarea> 
<script type="text/javascript"> 
    var maxLength = 30; 
    Event.observe('myTextArea', 'keydown', function (event) { 
     if ($('myTextArea').value.length == maxLength) { 
      Event.stop(event); 
      return false; 
     } 
    }); 
</script> 
+0

글쎄, 결국 작동 했어! 방금'event'를'Event.stop()'의 인수로 설정하는 것을 잊었습니다. –

+0

키 이벤트에서'stop()'또는 비슷한 것을 보았을 때 나는 조금 어색해했습니다. 브라우저에 따라 시스템/응용 프로그램 키보드 명령도 차단한다는 사실을 고려하십시오. 예를 들어'ctrl'과'alt'가 눌러지지 않았고 (시스템이 Mac이 아니거나)'cmd'와'ctrl'이 눌러지지 않았고 (시스템이 Mac 인 경우) 간단한 확인이었습니다. 또 다른 걱정은 'delete'와'backspace '키를 차단하고 선택한 텍스트를 바꿀 타이핑을 차단하여 사용자가 내용을 바꾸지 못하게하는 것입니다. – eyelidlessness

+0

그게 바로 당신이 전혀 이것을해서는 안되는 이유입니다. – jitter

1

documentationEvent#stop이 전파를 중지 함을 나타내며 은 기본 동작을 방지합니다. 작동하지 않습니까?

또한 keydown/keyup에 바인딩해도 텍스트 영역에 많은 양의 텍스트를 붙여 넣을 수 있습니다.

Joel이 자신의 의견에서 말한 것처럼 사용자가 타이핑하지 못하도록하는 것이 좋은 생각이 아닐 수도 있습니다. 유효성 검사 + 경고를 넣는 것이 훨씬 낫습니다 (Stackoverflow의 주석 필드처럼).

+0

작동했습니다! 'event'를'Event.stop()'의 인수로 설정하는 것을 잊었습니다. 많은 양의 텍스트를 붙이는 것에 대한 여러분의 의견에 대해, 나는 이것을 고려하여'keyup' 이벤트에서 텍스트를 다듬습니다. 하지만 이제는 내가 생각하기에, 아마 onclick 이벤트에서 그렇게해야 할 수도 있습니다. –

+0

모든 경우를 처리 할 수는 없습니다. 사용자는 마우스 오른쪽 버튼을 클릭하여 붙여 넣기하거나 다른 응용 프로그램에서 텍스트를 선택하고 끌어 텍스트를 추가 할 수 있습니다. 그리고 신은 컴퓨터를 사용자 정의하여 데이터를 입력 할 수있는 다른 방법 (예 : 가상 키보드)을 알고 있습니다. –

0

사용하여 setInterval 주기적으로 텍스트 영역의 상태를 확인하기 위해 (이 이유를 확인하기 위해 방해 할 수 없습니다하지. 않습니다 오페라, FF와 IE에서와) 작동합니다 원하는 경우 텍스트를 자르십시오.

2

트림 그냥 문자를

가 텍스트 영역 채우기 왜 다음, 알고 중간 부분에 가서 입력이 시도, 좋은 해결책이 아니다

끔찍한 효과가 있습니다

: 입력 된 문자가 촬영을하고 그런 다음 텍스트가 다듬어 져 끝 텍스트가 손실됩니다. 그 전에 입력 "이 입력 된 무엇인가" "무엇"이 : "없음" 당신이 얻을 것이다 : "이것은 T하지 무엇인가"

최대 길이 = 21
값 (길이 = 21)

원하는 효과는 끝 문자를 무시하는 대신 새 입력 된 문자가 무시된다는 것입니다.

예제에서는 매우 짧습니다 ... 여러 줄의 텍스트 영역을 상상해보십시오 ...사용자는 끝이 삭제되는 것을 보지 않고 중간에 입력을 계속합니다.

maxlength가있는 입력 유형 = "텍스트"에서 같은 예제를 시도하면 한계에 도달하면 새로운 입력 된 문자가 무시됩니다. 커서가 텍스트의 시작, 중간 또는 끝에서 무시됩니다.