非主流的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 目录列举函数
Nov 06 Javascript
关于锚点跳转及jQuery下相关操作与插件
Oct 01 Javascript
javascript去掉前后空格的实例
Nov 07 Javascript
js实现全屏漂浮广告移入光标停止移动
Dec 02 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
Aug 07 Javascript
基于Jquery和html5的7款个性化地图插件
Nov 17 Javascript
JS产生随机数的用法小结
Dec 10 Javascript
js实现文字无缝向上滚动
Feb 16 Javascript
webpack-dev-server自动更新页面方法
Feb 22 Javascript
详解vue-cli中模拟数据的两种方法
Jul 03 Javascript
浅谈Vue.js 关于页面加载完成后执行一个方法的问题
Apr 01 Javascript
Vue快速实现通用表单验证的方法
Feb 24 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
PHP学习散记_编码(json_encode 中文不显示)
2011/11/10 PHP
php需登录的文件上传管理系统
2020/03/21 PHP
PHP实现图片不变型裁剪及图片按比例裁剪的方法
2016/01/14 PHP
php ajax异步读取rss文档数据
2016/03/29 PHP
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
Javascript中 关于prototype属性实现继承的原理图
2013/04/16 Javascript
javascript中全局对象的parseInt()方法使用介绍
2013/12/19 Javascript
原生javascript实现Tab选项卡切换功能
2015/01/12 Javascript
jQuery中的Deferred和promise 的区别
2016/04/03 Javascript
AngularJS通过$http和服务器通信详解
2016/09/21 Javascript
简单实现js点击展开二级菜单功能
2017/05/16 Javascript
详解使用angular-cli发布i18n多国语言Angular应用
2017/05/20 Javascript
详解Vue 事件修饰符capture 的使用
2017/12/29 Javascript
vue语法自动转typescript(解放双手)
2019/09/18 Javascript
javascript的delete运算符知识点总结
2019/11/19 Javascript
原生JS实现留言板
2020/03/26 Javascript
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
Python lxml模块安装教程
2015/06/02 Python
Python中操作mysql的pymysql模块详解
2016/09/13 Python
Python实现将Excel转换为json的方法示例
2017/08/05 Python
python中实现数组和列表读取一列的方法
2018/04/03 Python
使用Python正则表达式操作文本数据的方法
2019/05/14 Python
python同步windows和linux文件
2019/08/29 Python
Django admin禁用编辑链接和添加删除操作详解
2019/11/15 Python
python enumerate内置函数用法总结
2020/01/07 Python
解决redis与Python交互取出来的是bytes类型的问题
2020/07/16 Python
利用纯html5绘制出来的一款非常漂亮的时钟
2015/01/04 HTML / CSS
奥地利手表、香水、化妆品和珠宝购物网站:Brasty.at
2021/01/17 全球购物
你常见到的runtime exception
2016/09/05 面试题
大学生旅游业创业计划书
2014/01/29 职场文书
活动总结结尾怎么写
2014/08/30 职场文书
英文感谢信格式
2015/01/21 职场文书
学校施工安全责任书
2015/01/29 职场文书
Go使用协程交替打印字符
2021/04/29 Golang
纯html+css实现奥运五环的示例代码
2021/08/02 HTML / CSS