非主流的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 进度条效果实现代码整理
May 21 Javascript
网页防止tab键的使用快速解决方法
Nov 07 Javascript
jquery修改属性值实例代码(设置属性值)
Jan 06 Javascript
jQuery源码解读之removeClass()方法分析
Feb 20 Javascript
jQuery满屏焦点图左右滚动特效代码分享
Sep 07 Javascript
EasyUi中的Combogrid 实现分页和动态搜索远程数据
Apr 01 Javascript
Bootstrap每天必学之折叠(Collapse)插件
Apr 25 Javascript
Javascript基础教程之比较null和undefined值
May 16 Javascript
真正好用的js验证上传文件大小的简单方法
Oct 27 Javascript
微信小程序模板之分页滑动栏
Feb 10 Javascript
JavaScript动态绑定详解
Sep 14 Javascript
javascript实现京东快递单号的查询效果
Nov 30 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
APMServ使用说明
2006/10/23 PHP
开源SNS系统-ThinkSNS
2008/05/18 PHP
PHP CURL模拟GET及POST函数代码
2010/04/25 PHP
php 目录与文件处理-郑阿奇(续)
2011/07/04 PHP
php中session退出登陆问题
2014/02/27 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
2015/09/20 PHP
php使用curl下载指定大小的文件实例代码
2017/09/30 PHP
用javascript判断IE版本号简单实用且向后兼容
2013/09/11 Javascript
如何通过javascript操作web控件的自定义属性
2013/11/25 Javascript
Jquery利用mouseenter和mouseleave实现鼠标经过弹出层且可以点击
2014/02/12 Javascript
Javascript中的Array数组对象详谈
2014/03/03 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
jquery读取xml文件实现省市县三级联动的方法
2015/05/29 Javascript
js时间戳转为日期格式的方法
2015/12/28 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
vue-cli入门之项目结构分析
2017/04/20 Javascript
Vue.js鼠标悬浮更换图片功能
2017/05/17 Javascript
深入理解JavaScript创建对象的多种方式以及优缺点
2017/06/01 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
Vue入门之animate过渡动画效果
2018/04/08 Javascript
Vue2.0实现简单分页及跳转效果
2019/07/29 Javascript
Python3 jupyter notebook 服务器搭建过程
2018/11/30 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
2020/03/03 Python
tensorflow 大于某个值为1,小于为0的实例
2020/06/30 Python
如何从csv文件构建Tensorflow的数据集
2020/09/21 Python
阿里巴巴国际站:Alibaba.com
2016/07/21 全球购物
AVIS安飞士奥地利租车官网:提供奥地利、欧洲和全世界汽车租赁
2016/11/29 全球购物
亚洲颇具影响力的男性在线购物零售商:His
2019/11/24 全球购物
EJB3.1都有哪些改进
2012/11/17 面试题
计算机相关的自我评价
2014/01/15 职场文书
医院信息公开实施方案
2014/05/09 职场文书
企业安全生产承诺书
2014/05/22 职场文书
如何书写读后感?(附范文)
2019/07/26 职场文书
高一作文之乐趣
2019/11/21 职场文书
Java面试题冲刺第十五天--设计模式
2021/08/07 面试题
分享MySQL常用 内核 Debug 几种常见方法
2022/03/17 MySQL