非主流的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的实现原理的模拟代码 -1 核心部分
Aug 01 Javascript
angularjs学习笔记之三大模块(modal,controller,view)
Sep 26 Javascript
Web程序员必备的7个JavaScript函数
Jun 14 Javascript
AngularJS 表达式详细讲解及实例代码
Jul 26 Javascript
Node.js配合node-http-proxy解决本地开发ajax跨域问题
Aug 31 Javascript
js时间查询插件使用详解
Apr 07 Javascript
Vuex之理解state的用法实例
Apr 19 Javascript
JS操作时间 - UNIX时间戳的简单介绍(必看篇)
Aug 16 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
Nov 07 Javascript
基于vue-cli搭建多模块且各模块独立打包的项目
Jun 12 Javascript
vue项目中引入Sass实例方法
Aug 27 Javascript
jQuery class属性操作addClass()与removeClass()、hasClass()、toggleClass()
Mar 31 jQuery
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+MSSQL分页的例子
2006/10/09 PHP
慎用preg_replace危险的/e修饰符(一句话后门常用)
2013/06/19 PHP
Symfony2 session用法实例分析
2016/02/04 PHP
javascript 密码强弱度检测万能插件
2009/02/25 Javascript
Javascript 加载和执行-性能提高篇
2012/12/28 Javascript
js 获取计算后的样式写法及注意事项
2013/02/25 Javascript
jquery获取tr并更改tr内容示例代码
2014/02/13 Javascript
JS判断变量是否为空判断是否null
2014/07/25 Javascript
一个支持任意尺寸的图片上下左右滑动效果
2014/08/24 Javascript
点击button获取text内容并改变样式的js实现
2014/09/09 Javascript
纯JavaScript实现获取onclick、onchange等事件的值
2014/12/29 Javascript
JS实现表格数据各种搜索功能的方法
2015/03/03 Javascript
ajax+jQuery实现级联显示地址的方法
2015/05/06 Javascript
javascript类型系统——undefined和null全面了解
2016/07/13 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JavaScript利用Date实现简单的倒计时实例
2017/01/12 Javascript
Bootstrap 过渡效果Transition 模态框(Modal)
2017/03/17 Javascript
node中使用es5/6以及支持性与性能对比
2017/08/11 Javascript
常用的9个JavaScript图表库详解
2017/12/19 Javascript
vue 指定组件缓存实例详解
2018/04/01 Javascript
JavaScript使用Math.random()生成简单的验证码
2019/01/21 Javascript
jsonp格式前端发送和后台接受写法的代码详解
2019/11/07 Javascript
es6函数之rest参数用法实例分析
2020/04/18 Javascript
vue中jsonp插件的使用方法示例
2020/09/10 Javascript
Python decorator拦截器代码实例解析
2020/04/04 Python
Omio中国:全欧洲低价大巴、火车和航班搜索和比价
2018/08/09 全球购物
写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数
2016/04/13 面试题
自主招生自荐信范文
2013/12/04 职场文书
社区包粽子活动方案
2014/01/21 职场文书
快餐店的创业计划书范文
2014/01/29 职场文书
大学秋游活动方案
2014/02/11 职场文书
教师通用专业自荐书范文
2014/02/11 职场文书
小学生班干部竞选稿
2015/11/20 职场文书
《观察物体》教学反思
2016/02/17 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript
详解Python为什么不用设计模式
2021/06/24 Python