非主流的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 相关文章推荐
jquery $.getJSON()跨域请求
Dec 21 Javascript
jQuery 淡出一个图像到另一个图像的实现代码
Jun 12 Javascript
js操作checkbox遇到的问题解决
Jun 29 Javascript
javascript的创建多行字符串的7种方法
Apr 29 Javascript
一个不错的js html页面倒计时可精确到秒
Oct 22 Javascript
HTML5canvas 绘制一个圆环形的进度表示实例
Dec 16 Javascript
jQuery编写textarea输入字数限制代码
Mar 23 jQuery
vue-cli如何快速构建vue项目
Apr 26 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
基于js 字符串indexof与search方法的区别(详解)
Dec 04 Javascript
vue.js删除列表中的一行
Jun 30 Javascript
js取0-9随机取4个数不重复的数字代码实例
Mar 27 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网页游戏学习之Xnova(ogame)源码解读(六)
2014/06/23 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
文本链接逐个出现的js脚本
2007/12/12 Javascript
jQuery实现的立体文字渐变效果
2010/05/17 Javascript
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
js jquery验证银行卡号信息正则学习
2013/01/21 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
jQuery $.each遍历对象、数组用法实例
2015/04/16 Javascript
js中substring和substr两者区别和使用方法
2015/11/09 Javascript
jquery把int类型转换成字符串类型的方法
2016/10/07 Javascript
移动适配的几种方案(三种方案)
2016/11/25 Javascript
完美解决node.js中使用https请求报CERT_UNTRUSTED的问题
2017/01/08 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
JS鼠标滚动分页效果示例
2017/07/05 Javascript
基于$.ajax()方法从服务器获取json数据的几种方式总结
2018/01/31 Javascript
微信小程序上传图片实例
2018/05/28 Javascript
利用hasOwnProperty给数组去重的面试题分享
2018/11/05 Javascript
Vue press 支持图片放大功能的实例代码
2018/11/09 Javascript
Vue中使用Echarts仪表盘展示实时数据的实现
2020/11/01 Javascript
Python数据分析之如何利用pandas查询数据示例代码
2017/09/01 Python
Python3 replace()函数使用方法
2018/03/19 Python
python消费kafka数据批量插入到es的方法
2018/12/27 Python
Python在cmd上打印彩色文字实现过程详解
2019/08/07 Python
基于Python测试程序是否有错误
2020/05/16 Python
神经网络训练采用gpu设置的方式
2021/03/03 Python
css3 矩阵的使用详解
2018/03/20 HTML / CSS
美国最大的城市服装和运动鞋零售商:Jimmy Jazz
2016/11/19 全球购物
赫里福德的一家乡村零售商店:Philip Morris & Son
2017/06/25 全球购物
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
如何从一个文件档案的尾端新增记录
2016/12/02 面试题
环保倡议书怎么写
2014/05/16 职场文书
公安机关查摆剖析材料
2014/10/10 职场文书
幼儿园园长新年寄语2015
2014/12/08 职场文书
2015年父亲节寄语
2015/03/23 职场文书
培养联系人考察意见
2015/06/01 职场文书