• 非主流的textarea自增长实现


    今天稍微研究了下textarea随输入内容自动增长的功能,通过google参考了一些实现方式。

    其中大部分是靠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.

    1 <div class="expanding-wrap">
    2     <div class="expanding-area">
    3         <pre class="mirror-wrap"><span class="mirror"></span><br/></pre>
    4         <textarea class="source" cols="30" rows="10"></textarea>
    5     </div>
    6 </div>
     1 (function($, $$) {
     2     var mirrorEl = $$('.expanding-area .mirror'),
     3         textEl = $$('.expanding-area .source'),
     4         timehandle = null,
     5                     
     6     handler = function() {
     7         mirrorEl.set('text', textEl.get('value'));
     8     };
     9                 
    10     handler();
    11                     
    12     textEl.addEvent('keyup', function(event) {
    13                     
    14         clearTimeout(timehandle);
    15                     
    16         timehandle = handler.delay(200);
    17     });
    18             
    19 })($, $$);

    最后,有个参考文献,觉得不错,感兴趣的可以看看“参考”,本例子可能不支持IE6,放弃IE6有段时间了,我们做前端的,得先前看呐: D

  • 相关阅读:
    Duilib 控件类html富文本绘制
    再谈如何使用Taglist?
    如何让vim自动显示函数声明-使用 echofunc.vim插件
    vim 标签页 tabnew 等的操作命令
    php数组操作集锦- 掌握了数组操作, 也就掌握了php
    php字符串操作集锦
    thinkphp疑难解决4
    如何保存gnome的linux的 会话?相当于windows下的休眠?
    开发thinkphp的第一步就是给Application目录(不包括其下的文件)777权限, 关闭selinux
    如何更改gnome-screenshot的默认的保存路径?
  • 原文地址:https://www.cnblogs.com/AndyWithPassion/p/autoexpanding_textarea.html
Copyright © 2020-2023  润新知