非主流的textarea自增长实现js代码


Posted in Javascript onDecember 20, 2011

其中大部分是靠scrollHeight(非W3C标准,由IE引入),keyup事件来完成。有一种比较有意思的是 通过“镜像元素(mirror element)”, 和setTimeout轮询实现。大致的实现思路如下:

把一个单独的pre元素,通过position:absolute的方式定位于client view之外,并且把它和textarea的样式设置的一样,我们把这个pre元素称为“mirror“,然后通过setTimeout进行200ms的轮询,把textarea中新的值更新到mirror元素中,由于mirror元素被设为block,所以它的大小会随内容的多少而变化,再通过取得mirror元素的offsetHeight来应用到对应的textarea,使之高度随内容变化。

这确实是个过不错的想法。但是这样的轮询似乎有点”浪费“,因为一般用户不会一直不停的进行输入, 而且每次去计算offsetHeight,也是比较耗费资源的。

既然发现了问题,那么我们就针对问题进行改进,在他人的思路上进行修改,不会太困难。

先去掉计算mirror元素offsetHeight这一操作,我们可以用个wrapper包裹mirror元素和textarea,把它们的样式设置成相同,mirror元素通过visibility:hidden进行隐藏(注意不是display:none),这样mirror元素空间依然占着, 然后把textarea相对于wrapper绝对定位,把textarea覆盖于mirror元素之上,我们的例子中就是textarea覆盖于pre之上, textarea的height,width属性均设为100%,这样pre的高度变化可以直接反应到wrapper上, textarea的大小也会随之改变, 这都是自动的,我们利用了”块级“元素的特点

针对无止境的轮询,我还是觉得用keyup来做好些,但是事件的处理上,我们可以给用户一个时间间隔,并不需要每次输入都要进行处理,例子中设置的时间间隔为250ms,当用户输入的过程中,如果用户停顿了下,有250ms间隙的话,就把textarea的value赋值给pre的span中。

思路讲完了,应该还是比较简单的。

下面是html和对应javascript(最近喜欢上mootools了),由于css篇幅较长,具体可以看页面底部的jsfiddle share.

<div class="expanding-wrap"> 
<div class="expanding-area"> 
<pre class="mirror-wrap"><span class="mirror"></span><br/></pre> 
<textarea class="source" cols="30" rows="10"></textarea> 
</div> 
</div>

(function($, $$) { 
var mirrorEl = $$('.expanding-area .mirror'), 
textEl = $$('.expanding-area .source'), 
timehandle = null, 
handler = function() { 
mirrorEl.set('text', textEl.get('value')); 
}; 
handler(); 
textEl.addEvent('keyup', function(event) { 
clearTimeout(timehandle); 
timehandle = handler.delay(200); 
}); 
})($, $$);

最后,有个参考文献,觉得不错,感兴趣的可以看看“参考”,本例子可能不支持IE6,放弃IE6有段时间了,我们做前端的,得先前看呐: D
Javascript 相关文章推荐
javascript Split方法,indexOf方法、lastIndexOf 方法和substring 方法
Mar 21 Javascript
判断是否安装flash player及当前版本的JS代码
Aug 08 Javascript
12种不宜使用的Javascript语法整理
Nov 04 Javascript
js中对象的声明方式以及数组的一些用法示例
Dec 11 Javascript
jQuery判断指定id的对象是否存在的方法
May 22 Javascript
Jquery 自定义事件实现发布/订阅的简单实例
Jun 12 Javascript
浅谈JS使用[ ]来访问对象属性
Sep 21 Javascript
基于KO+BootStrap+MVC实现的分页控件代码分享
Nov 07 Javascript
JS定时器用法分析【时钟与菜单中的应用】
Dec 21 Javascript
JS SetInterval 代码实现页面轮询
Aug 11 Javascript
Vue 创建组件的两种方法小结(必看)
Feb 23 Javascript
javascript设计模式 ? 模板方法模式原理与用法实例分析
Apr 23 Javascript
javascript之querySelector和querySelectorAll使用介绍
Dec 20 #Javascript
js有关元素内容操作小结
Dec 20 #Javascript
js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME
Dec 20 #Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
Dec 20 #Javascript
js change,propertychange,input事件小议
Dec 20 #Javascript
JavaScript面向对象设计二 构造函数模式
Dec 20 #Javascript
Javascript面向对象设计一 工厂模式
Dec 20 #Javascript
You might like
php file_get_contents函数轻松采集html数据
2010/04/22 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
JS弹出窗口代码大全(详细整理)
2012/12/21 Javascript
jquery easyui滚动条部分设置介绍
2013/09/12 Javascript
jquery获取节点名称
2015/04/26 Javascript
jquery实现向下滑出的二级导航下滑菜单效果
2015/08/25 Javascript
基于jquery步骤进度条源码分享
2015/11/12 Javascript
浅谈JavaScript的innerWidth与innerHeight
2017/10/12 Javascript
JS获取浏览器地址栏的多个参数值的任意值实例代码
2018/07/24 Javascript
ES6 中可以提升幸福度的小功能
2018/08/06 Javascript
小程序登录态管理的方法示例
2018/11/13 Javascript
Vue实现页面添加水印功能
2019/11/09 Javascript
jquery检测上传文件大小示例
2020/04/26 jQuery
浅析JavaScript 函数防抖和节流
2020/07/13 Javascript
python读写ini文件示例(python读写文件)
2014/03/25 Python
python使用socket连接远程服务器的方法
2015/04/29 Python
Python 类与元类的深度挖掘 II【经验】
2016/05/06 Python
python爬取内容存入Excel实例
2019/02/20 Python
Python3中编码与解码之Unicode与bytes的讲解
2019/02/28 Python
python如何统计代码运行的时长
2019/07/24 Python
python实现复制大量文件功能
2019/08/31 Python
python如何获取apk的packagename和activity
2020/01/10 Python
Python爬虫工具requests-html使用解析
2020/04/29 Python
详解Python设计模式之策略模式
2020/06/15 Python
CSS3地图动态实例代码(圆圈向外扩散)
2018/06/15 HTML / CSS
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
static全局变量与普通的全局变量有什么区别
2014/05/27 面试题
护理专业本科生自荐信
2013/10/01 职场文书
大学生毕业求职简历的自我评价
2013/10/24 职场文书
门卫岗位安全职责
2013/12/13 职场文书
机械个人求职信范文
2014/01/24 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
首都博物馆观后感
2015/06/05 职场文书
在Django中使用MQTT的方法
2021/05/10 Python