非主流的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 相关文章推荐
js加强的经典分页实例
Mar 15 Javascript
jQuery实现统计复选框选中数量
Nov 24 Javascript
js获取当前日期前七天的方法
Feb 28 Javascript
Jquery 效果使用详解
Nov 23 Javascript
AngularJS 使用 UI Router 实现表单向导
Jan 29 Javascript
jquery-mobile基础属性与用法详解
Nov 23 Javascript
jQuery滚动插件scrollable.js用法分析
May 25 jQuery
Angular实现点击按钮控制隐藏和显示功能示例
Dec 29 Javascript
jQuery插件jsonview展示json数据
May 26 jQuery
vue中Element-ui 输入银行账号每四位加一个空格的实现代码
Sep 14 Javascript
vue 右键菜单插件 简单、可扩展、样式自定义的右键菜单
Nov 29 Javascript
多个vue子路由文件自动化合并的方法
Sep 03 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
服务器web工具 php环境下
2010/12/29 PHP
PHP循环结构实例讲解
2014/02/10 PHP
使用php清除bom示例
2014/03/03 PHP
php实现xml与json之间的相互转换功能实例
2016/07/07 PHP
浅谈JavaScript中面向对象技术的模拟
2006/09/25 Javascript
开发跨浏览器javascript常见注意事项
2009/01/01 Javascript
javascript window.opener的用法分析
2010/04/07 Javascript
浅析JQuery中的html(),text(),val()区别
2014/09/01 Javascript
js实现鼠标经过表格行变色的方法
2015/05/12 Javascript
javascript数组去重小结
2016/03/07 Javascript
jquery按回车键实现表单提交的简单实例
2016/05/25 Javascript
jQuery监听文件上传实现进度条效果的方法
2016/10/16 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
angularjs使用gulp-uglify压缩后执行报错的解决方法
2018/03/07 Javascript
Angular2使用SVG自定义图表(条形图、折线图)组件示例
2019/05/10 Javascript
如何让Nodejs支持H5 History模式(connect-history-api-fallback源码分析)
2019/05/30 NodeJs
判断JavaScript中的两个变量是否相等的操作符
2019/12/21 Javascript
vue 子组件修改data或调用操作
2020/08/07 Javascript
[01:57]2016完美“圣”典风云人物:国士无双专访
2016/12/04 DOTA
使用python的chardet库获得文件编码并修改编码
2014/01/22 Python
让 python 命令行也可以自动补全
2014/11/30 Python
Python数据类型详解(二)列表
2016/05/08 Python
python面向对象_详谈类的继承与方法的重载
2017/06/07 Python
利用Python-iGraph如何绘制贴吧/微博的好友关系图详解
2017/11/02 Python
Python实现mysql数据库更新表数据接口的功能
2017/11/19 Python
基于数据归一化以及Python实现方式
2018/07/11 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
Python编写合并字典并实现敏感目录的小脚本
2019/02/26 Python
Python+unittest+DDT实现数据驱动测试
2020/11/30 Python
法国高保真音响和家庭影院商店:Son Video
2019/04/26 全球购物
英国领先的露营和露营车品牌之一:OLPRO
2019/08/06 全球购物
英国户外服装、鞋类和设备的领先零售商:Millets
2020/10/12 全球购物
奠基仪式主持词
2014/03/20 职场文书
优秀的导游求职信范文
2014/04/06 职场文书
竞选体育委员演讲稿
2014/04/26 职场文书
javascript拖曳互换div的位置实现示例
2021/06/28 Javascript