非主流的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 相关文章推荐
用Mootools获得操作索引的两种方法分享
Dec 12 Javascript
将数字转换成大写的人民币表达式的js函数
Sep 21 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
Sep 29 Javascript
jQuery实现页面滚动时动态加载内容的方法
Mar 20 Javascript
深入解读JavaScript中的Iterator和for-of循环
Jul 28 Javascript
javascript实现随机读取数组的方法
Aug 03 Javascript
JS实现HTML标签转义及反转义
Apr 14 Javascript
利用CSS、JavaScript及Ajax实现图片预加载的三大方法
Jan 22 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
Jan 23 Javascript
Vue.js中组件中的slot实例详解
Jul 17 Javascript
Vue2 模板template的四种写法总结
Feb 23 Javascript
基于layui内置模块(element常用元素的操作)
Sep 20 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
造势之举?韩国总统候选人发布《星际争霸》地图
2017/04/22 星际争霸
YII2框架中使用yii.js实现的post请求
2017/04/09 PHP
yii2多图上传组件的使用教程
2018/05/10 PHP
PHP实现多图上传和单图上传功能
2018/05/17 PHP
Laravel5.5 数据库迁移:创建表与修改表示例
2019/10/23 PHP
学习从实践开始之jQuery插件开发 对话框插件开发
2012/04/26 Javascript
jquery实现动画菜单的左右滚动、渐变及图形背景滚动等效果
2015/08/25 Javascript
整理JavaScript对DOM中各种类型的元素的常用操作
2016/05/05 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
js实现图片左右滚动效果
2017/02/27 Javascript
创建简单的node服务器实例(分享)
2017/06/23 Javascript
简单实现jQuery手风琴效果
2017/08/18 jQuery
js排序与重组的实例讲解
2017/08/28 Javascript
vue-resouce设置请求头的三种方法
2017/09/12 Javascript
Vue组件中prop属性使用说明实例代码详解
2018/05/31 Javascript
vue中使用codemirror的实例详解
2018/11/01 Javascript
vue双向绑定及观察者模式详解
2019/03/19 Javascript
Vue匿名插槽与作用域插槽的合并和覆盖行为
2019/04/22 Javascript
关于layui 弹出层一闪而过就消失的解决方法
2019/09/09 Javascript
使用PreloadJS加载图片资源的基础方法详解
2020/02/03 Javascript
vue+canvas实现拼图小游戏
2020/09/18 Javascript
[00:33]DOTA2上海特级锦标赛 CDEC战队宣传片
2016/03/04 DOTA
利用python模拟实现POST请求提交图片的方法
2017/07/25 Python
Python os.access()用法实例
2019/02/18 Python
python3实现绘制二维点图
2019/12/04 Python
python中的线程threading.Thread()使用详解
2019/12/17 Python
python 实现朴素贝叶斯算法的示例
2020/09/30 Python
DKNY品牌官网:纽约大都会时尚风格
2016/10/20 全球购物
垃圾回收的优点和原理
2014/05/16 面试题
健康教育评估方案
2014/05/25 职场文书
水电维修专业推荐信
2014/09/06 职场文书
好媳妇事迹材料
2014/12/24 职场文书
2015年入党决心书
2015/02/05 职场文书
个人工作能力自我评价
2015/03/05 职场文书
2019企业给员工的慰问信
2019/06/24 职场文书
OpenCV图像变换之傅里叶变换的一些应用
2021/07/26 Python