非主流的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 相关文章推荐
Javascript面向对象之四 继承
Feb 08 Javascript
Javascript new Date().valueOf()的作用与时间戳由来详解
Apr 24 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(三)
Sep 14 Javascript
jQuery实现获取元素索引值index的方法
Sep 18 Javascript
AngularJS 过滤器(自带和自建)详解
Sep 19 Javascript
vue-cli下的vuex的简单Demo图解(实现加1减1操作)
Feb 26 Javascript
Vue-CLI3.x 设置反向代理的方法
Dec 06 Javascript
JsonProperty 的使用方法详解
Oct 11 Javascript
简单了解常用的JavaScript 库
Jul 16 Javascript
js+h5 canvas实现图片验证码
Oct 11 Javascript
vue ref如何获取子组件属性值
Mar 31 Vue.js
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连接mysql数据库代码
2009/03/10 PHP
php中用foreach来操作数组的代码
2011/07/17 PHP
codeigniter使用技巧批量插入数据实例方法分享
2013/12/31 PHP
php观察者模式应用场景实例详解
2017/02/03 PHP
PHP微信PC二维码登陆的实现思路
2017/07/13 PHP
laravel实现查询最后执行的一条sql语句的方法
2019/10/09 PHP
下载站控制介绍字数显示的脚本 显示全部 隐藏介绍等功能
2009/09/19 Javascript
jquery 利用show和hidden实现级联菜单示例代码
2013/08/09 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
让JavaScript的Alert弹出框失效的方法禁止弹出警告框
2014/09/03 Javascript
jquery中表单 多选框的一种巧妙写法
2015/09/06 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
js实现的简练高效拖拽功能示例
2016/12/21 Javascript
浅谈vue中慎用style的scoped属性
2017/11/28 Javascript
js消除图片小游戏代码
2019/12/11 Javascript
vue-cli4使用全局less文件中的变量配置操作
2020/10/21 Javascript
vue中利用three.js实现全景图的完整示例
2020/12/07 Vue.js
Python实现全局变量的两个解决方法
2014/07/03 Python
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
python简单实现基数排序算法
2015/05/16 Python
Django中cookie的基本使用方法示例
2018/02/03 Python
python装饰器-限制函数调用次数的方法(10s调用一次)
2018/04/21 Python
python面试题之列表声明实例分析
2019/07/08 Python
Django实现文件上传下载
2019/10/06 Python
python文件绝对路径写法介绍(windows)
2019/12/25 Python
python urllib和urllib3知识点总结
2021/02/08 Python
浅谈基于Canvas的手绘风格图形库Rough.js
2018/03/19 HTML / CSS
我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。 为什么如下的代码((int *)p)++; 不行?
2013/05/09 面试题
设计部经理的岗位职责
2013/11/16 职场文书
法制宣传月活动方案
2014/05/11 职场文书
竞赛口号大全
2014/06/16 职场文书
关于青春的演讲稿三分钟
2014/08/22 职场文书
影视后期实训报告
2014/11/05 职场文书
2014年教师德育工作总结
2014/11/10 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
2015年度物流工作总结
2015/04/30 职场文书