textarea 자동 성장

7732 단어
때때로 textarea가 자동으로 높이를 조절하여 입력한 내용에 적응하기를 바란다
인터넷에서 많은 해결 방안을 보았다. 예를 들어 동적으로 숨겨진div를 만들고 사용자가 입력할 때textarea의 내용을div에 연결하면div의 높이가 자동으로 벌어지기 때문에div의 높이를 동적으로 감지한 다음div의 높이를textarea에 복제할 수 있다.이 방법은 호환성이 비교적 좋고 비교적 온건한 방법이어야 하는데, 정말 너무 번거롭다
또 하나의 해결 방법은 텍스타리아의 scroll Height를 높이로 동적으로 복제하는 것이다.내가 채택한 것은 후자이다
       
      
      
      
1
2
3
4
5
6
7
8
9
10
11
12
13
14
       
      
      
      
var textarea = document.getElementById( 'textarea');
textarea.style.overflow = 'hidden';
var height = parseInt( window.getComputedStyle(textarea).height);
var width = parseInt( window.getComputedStyle(textarea).width);
var autoHeight = function() {
if( this.scrollHeight <= height || this.value == '') {
this.style.height=height + '  textarea ;px';
return;
}
this.style.height = this.scrollHeight + 'px';
}
textarea.oninput = autoHeight;

这个方法就是通过监听textarea的oninput 来实现,也可以监听keyup,keydown;但是如果使用keyup或者keydown来监听的话会存在一个问题,那就是如果textarea有复制或者剪切操作,keyup,keydown不会立即响应内容的变化,并且也不能响应鼠标右键粘贴。

最后再象征性地增加兼容

       
      
      
      
1
2
3
4
5
6
       
      
      
      
textarea.onpropertychange = function (event) {
if(event.propertyName.toLowerCase() == 'value') {
autoHeight();
console.log( this.value);
}
}

그러나 슬픈 것은 이런 방식은 이동단에 적용되지 않고 이동단의 모든 브라우저는 테스트가 무효이다
또 다른 해결 방법은textarea를 사용하지 않고 일반적인div로textarea를 시뮬레이션하는 것이다. 왜냐하면div 자체의 높이가 자동으로 증가하기 때문에 모든 것은 다른 문제를 걱정할 필요가 없다.실현 방식은div에 속성contentEditable=true을 설정하는 것이다. 이렇게 하면div는 편집 가능한 것으로 변한다.그러나 이런 방식은 일부 Firefox 위에서div 외층에 빈 테두리가 생겨서div의 본질이 의심할 여지없이 드러난다.해결 방법은 css 설정outline:0 none

좋은 웹페이지 즐겨찾기