非主流的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解析与序列化json数据(一)json.stringify()的基本用法
Feb 01 Javascript
javascript框架设计之种子模块
Jun 23 Javascript
JavaScript实现点击单选按钮改变输入框中文本域内容的方法
Aug 12 Javascript
jQuery右侧选项卡焦点图片轮播特效代码分享
Sep 05 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
angularjs之$timeout指令详解
Jun 13 Javascript
详解React native全局变量的使用(跨组件的通信)
Sep 07 Javascript
在create-react-app中使用css modules的示例代码
Jul 31 Javascript
JavaScript封装的常用工具类库bee.js用法详解【经典类库】
Sep 03 Javascript
JS实现分页导航效果
Feb 19 Javascript
javascript 易错知识点实例小结
Apr 25 Javascript
Vue基于localStorage存储信息代码实例
Nov 16 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
生成ubuntu自动切换壁纸xml文件的php代码
2010/07/17 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
JavaScript中的事件处理
2008/01/16 Javascript
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
很多人都是用下面的js刷新站IP和PV
2008/09/05 Javascript
javascript获取当前日期时间及其它操作函数
2011/01/11 Javascript
JavaScript使用yield模拟多线程的方法
2015/03/19 Javascript
ExtJs动态生成treepanel的Json格式
2015/07/19 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
nodejs高大上的部署方式(PM2)
2018/09/11 NodeJs
vue debug 二种方法
2018/09/16 Javascript
小程序hover-class点击态效果实现
2019/02/26 Javascript
详解从0开始搭建微信小程序(前后端)的全过程
2019/04/15 Javascript
nodejs中实现用户注册路由功能
2019/05/20 NodeJs
Jquery实现获取子元素的方法分析
2019/08/24 jQuery
node+multer实现图片上传的示例代码
2020/02/18 Javascript
python中的错误处理
2016/04/10 Python
Python正则替换字符串函数re.sub用法示例
2017/01/19 Python
深入理解python中的atexit模块
2017/03/07 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
Python数据模型与Python对象模型的相关总结
2021/01/26 Python
详解Html5 Canvas画线有毛边解决方法
2018/03/01 HTML / CSS
COSETTE官网:奢华,每天
2020/03/22 全球购物
DataList 能否分页,请问如何实现?
2015/05/03 面试题
会计与审计毕业生自荐信范文
2013/12/30 职场文书
工程造价专业大学生职业生涯规划书
2014/01/18 职场文书
大学生会计职业生涯规划范文
2014/02/28 职场文书
企业后勤岗位职责
2014/02/28 职场文书
2014年大学庆元旦迎新年活动方案
2014/03/09 职场文书
yy生日主持词
2014/03/20 职场文书
公司委托书格式范文
2014/10/09 职场文书
2014个人年终工作总结范文
2014/12/15 职场文书
慈善募捐倡议书
2015/04/27 职场文书
感恩教师节主题班会
2015/08/12 职场文书
python非标准时间的转换
2021/07/25 Python