非主流的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在IE和FF下attachEvent,addEventListener学习笔记
Nov 26 Javascript
当前页禁止复制粘贴截屏代码小集
Jul 24 Javascript
JavaScript中字符串拼接的基本方法
Jul 07 Javascript
七夕情人节丘比特射箭小游戏
Aug 20 Javascript
js实现的万能flv网页播放器代码
Apr 30 Javascript
用原生JS对AJAX做简单封装的实例代码
Jul 13 Javascript
[原创]jQuery常用的4种加载方式分析
Jul 25 Javascript
angular中ui calendar的一些使用心得(推荐)
Nov 03 Javascript
VueJs组件之父子通讯的方式
May 06 Javascript
微信小程序前端自定义分享的实现方法
Jun 13 Javascript
vue 组件开发原理与实现方法详解
Nov 29 Javascript
vue实现前端列表多条件筛选
Oct 26 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函数array_merge用法一例(合并同类数组)
2013/02/03 PHP
有关于PHP中常见数据类型的汇总分享
2014/01/06 PHP
PHP使用Mysql事务实例解析
2014/09/08 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
php实现姓名根据首字母排序的类与方法(实例代码)
2018/05/16 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
php curl获取https页面内容,不直接输出返回结果的设置方法
2019/01/15 PHP
javascript new 需不需要继续使用
2009/07/02 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
js动态添加表格数据使用insertRow和insertCell实现
2014/05/22 Javascript
Jquery对select的增、删、改、查操作
2015/02/06 Javascript
浅谈JavaScript的事件
2015/02/27 Javascript
jQuery插件zoom实现图片全屏放大弹出层特效
2015/04/15 Javascript
基于jQuery的ajax方法封装
2016/07/14 Javascript
详解js中call与apply关键字的作用
2016/11/21 Javascript
jQuery实现花式轮播之圣诞节礼物传送效果
2016/12/25 Javascript
关于Node.js的events.EventEmitter用法介绍
2017/04/01 Javascript
jquery.masonry瀑布流效果
2017/05/25 jQuery
node.js 核心http模块,起一个服务器,返回一个页面的实例
2017/09/11 Javascript
67 个节约开发时间的前端开发者的工具、库和资源
2017/09/12 Javascript
关于vue单文件中引用路径的处理方法
2018/01/08 Javascript
详解Vue依赖收集引发的问题
2019/04/22 Javascript
JS如何实现网站中PC端和手机端自动识别并跳转对应的代码
2020/01/08 Javascript
vue实现日历表格(element-ui)
2020/09/24 Javascript
[05:08]第一届“网鱼杯”DOTA2比赛精彩集锦
2014/09/05 DOTA
python实现的阳历转阴历(农历)算法
2014/04/25 Python
pandas多级分组实现排序的方法
2018/04/20 Python
浅谈关于Python3中venv虚拟环境
2018/08/01 Python
Python中的 enum 模块源码详析
2019/01/09 Python
Python实现word2Vec model过程解析
2019/12/16 Python
如何在windows下安装配置python工具Ulipad
2020/10/27 Python
司法工作人员群众路线对照检查材料思想汇报
2014/09/30 职场文书
2015年全国爱耳日活动总结
2015/02/27 职场文书
遗嘱范文
2015/08/07 职场文书
《怀念母亲》教学反思
2016/02/19 职场文书
优秀新员工事迹材料
2019/05/13 职场文书