非主流的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 KeyDown、KeyPress和KeyUp事件的区别与联系
Dec 03 Javascript
jQuery实现长文字部分显示代码
May 13 Javascript
node.js中的fs.utimes方法使用说明
Dec 15 Javascript
javascript实现左右控制无缝滚动
Dec 31 Javascript
使用js画图之正弦曲线
Jan 12 Javascript
javascript常见数据验证插件大全
Aug 03 Javascript
JS中sort函数排序用法实例分析
Jun 16 Javascript
微信小程序 loading 详解及实例代码
Nov 09 Javascript
使用JS批量选中功能实现更改数据库中的status状态值(批量展示)
Nov 22 Javascript
jQuery实现的仿百度,仿谷歌搜索下拉框效果示例
Dec 30 Javascript
JavaScript中this函数使用实例解析
Feb 21 Javascript
jQuery实现广告显示和隐藏动画
Jul 04 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
dedecms中常见问题修改方法总结
2007/03/21 PHP
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
php数组去重实例及分析
2013/11/26 PHP
php设计模式之单例模式使用示例
2014/01/20 PHP
PHP安全上传图片的方法
2015/03/21 PHP
DEDE实现转跳属性文档在模板上调用出转跳地址
2016/11/04 PHP
Laravel框架实现抢红包功能示例
2019/10/31 PHP
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
基本jquery的控制tabs打开的数量的代码
2010/10/17 Javascript
window.open不被拦截的实现代码
2012/08/22 Javascript
JS常用字符串处理方法应用总结
2014/05/22 Javascript
javascript实现网页背景烟花效果的方法
2015/08/06 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
很棒的一组js图片轮播特效
2017/01/12 Javascript
BootStrap实现带关闭按钮功能
2017/02/15 Javascript
JavaScript 上传文件(psd,压缩包等),图片,视频的实现方法
2017/06/19 Javascript
JS立即执行函数功能与用法分析
2019/01/15 Javascript
关于JavaScript 数组你应该知道的事情(推荐)
2019/04/10 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
微信小程序实现收货地址左滑删除
2020/11/18 Javascript
javascript随机变色实例代码
2019/10/15 Javascript
小程序如何自主实现拦截器的示例代码
2019/11/04 Javascript
Python3使用正则表达式爬取内涵段子示例
2018/04/22 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
Python队列RabbitMQ 使用方法实例记录
2019/08/05 Python
python中使用input()函数获取用户输入值方式
2020/05/03 Python
DjangoWeb使用Datatable进行后端分页的实现
2020/05/18 Python
h5页面唤起app如果没安装就跳转下载(iOS和Android)
2020/06/03 HTML / CSS
体育专业个人求职信范文
2013/12/27 职场文书
蜜蜂引路教学反思
2014/02/04 职场文书
奥利奥广告词
2014/03/20 职场文书
颁奖晚会主持词
2014/03/25 职场文书
法院干警四风问题自我剖析材料
2014/09/29 职场文书
2016重阳节红领巾广播稿
2015/12/18 职场文书
Pytorch中的数据集划分&正则化方法
2021/05/27 Python