textarea.js 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. /**
  2. * 文本框根据输入内容自适应高度
  3. * @param {HTMLElement} 输入框元素
  4. * @param {Number} 设置光标与输入框保持的距离(默认0)
  5. * @param {Number} 设置最大高度(可选)
  6. */
  7. var autoTextarea = function (elem, extra, maxHeight) {
  8. extra = extra || 0;
  9. var isFirefox = !!document.getBoxObjectFor || 'mozInnerScreenX' in window,
  10. isOpera = !!window.opera && !!window.opera.toString().indexOf('Opera'),
  11. addEvent = function (type, callback) {
  12. elem.addEventListener ?
  13. elem.addEventListener(type, callback, false) :
  14. elem.attachEvent('on' + type, callback);
  15. },
  16. getStyle = elem.currentStyle ? function (name) {
  17. var val = elem.currentStyle[name];
  18. if (name === 'height' && val.search(/px/i) !== 1) {
  19. var rect = elem.getBoundingClientRect();
  20. return rect.bottom - rect.top -
  21. parseFloat(getStyle('paddingTop')) -
  22. parseFloat(getStyle('paddingBottom')) + 'px';
  23. };
  24. return val;
  25. } : function (name) {
  26. return getComputedStyle(elem, null)[name];
  27. },
  28. minHeight = parseFloat(getStyle('height'));
  29. elem.style.resize = 'none';
  30. var change = function () {
  31. var scrollTop, height,
  32. padding = 0,
  33. style = elem.style;
  34. if (elem._length === elem.value.length) return;
  35. elem._length = elem.value.length;
  36. if (!isFirefox && !isOpera) {
  37. padding = parseInt(getStyle('paddingTop')) + parseInt(getStyle('paddingBottom'));
  38. };
  39. scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
  40. elem.style.height = minHeight + 'px';
  41. if (elem.scrollHeight > minHeight) {
  42. if (maxHeight && elem.scrollHeight > maxHeight) {
  43. height = maxHeight - padding;
  44. style.overflowY = 'auto';
  45. } else {
  46. height = elem.scrollHeight - padding;
  47. style.overflowY = 'hidden';
  48. };
  49. style.height = height + extra + 'px';
  50. scrollTop += parseInt(style.height) - elem.currHeight;
  51. document.body.scrollTop = scrollTop;
  52. document.documentElement.scrollTop = scrollTop;
  53. elem.currHeight = parseInt(style.height);
  54. };
  55. };
  56. addEvent('propertychange', change);
  57. addEvent('input', change);
  58. addEvent('focus', change);
  59. change();
  60. };