angular : direative : autoResize textarea auto resize
今天为大家推出自己的auto resize 指令功能。
目的:解决textarea在给height的问题。
参考源码:http://monospaced.github.io/angular-elastic/elastic.js
参考网站:http://plnkr.co/edit/9y6YLriAwsK9hqdu72WT?p=preview
 angular.module("Stooges", []).
        directive("autoResize", ["$interpolate", function ($interpolate) {
            var calcTextarea; //缓存 calcTextarea 指针
            var lastTeaxArea; //保留最后一次textarea的指针,for 验证要不要 copy paste comeputedStyle
            function createCalcTextarea() {
                var txa = document.createElement("textarea");
                txa.style.cssText = "position:fixed; top:-9999px; left:0; overflow-y:hidden;";
                document.body.appendChild(txa);
                calcTextarea = txa
                return calcTextarea;
            }
            function resizeTextarea($element, value) {
                calcTextarea = (calcTextarea) ? calcTextarea : createCalcTextarea(); //没有就创建一个
                if (lastTeaxArea !== $element[0]) {
                    //copy paste all style to calcTextarea
                    var COPY_PASTE_COMPUTED_STYLE = ['width', 'border-top-width', 'border-bottom-width', 'border-left-width', 'border-right-width', 'padding-top', 'padding-bottom', 'padding-left', 'padding-right', 'line-height', 'font-family', 'font-size', 'font-weight', 'font-style', 'resize', 'letter-spacing', 'text-transform', 'word-spacing', 'text-indent', 'word-break', 'word-wrap', '-webkit-box-sizing', '-moz-box-sizing', 'box-sizing']
                    lastTeaxArea = $element[0];
                    var computedStyle = window.getComputedStyle($element[0], null);
                    COPY_PASTE_COMPUTED_STYLE.forEach(function (attr) {
                        var camelCaseWord = attr.toCamelCase();
                        calcTextarea.style.setProperty(attr, computedStyle[camelCaseWord]); //用 setProperty 比较好(不然font处理不到)
                    });
                }
                calcTextarea.value = value;
                var currentHeight = calcTextarea.scrollHeight;
                $element.css("height", currentHeight + 20 + "px");
            }
            return {
                restrict: "A",
                link: function (scope, $element, attrs, ctrl) {
                    $element[0].style.cssText = "resize:none; overflow:hidden; -webkit-transition: 0.3s linear; transition: 0.3s linear;"; //set default css
                    var is_watch = attrs["autoResize"] === "watch";
                    var value = $interpolate($element.val())(scope);
                    resizeTextarea($element, value);
                    if (is_watch) {
                        $element.on("keyup", function () {
                            resizeTextarea($element, $element.val());
                        });
                    }
                    else {
                        $element.attr("readonly");
                    }
                }
            }
        }]);
过程:在body里append一个textarea,定位在老远的北方(top:-9999px)。接着把有auto-resize指令的textarea的所有css属性(大概20个)给取出,给刚刚append的textarea附上新属性。把内容给取出来放进新的textarea里,计算高度,最后把高度给当前被使用的textarea里。
css取出来是为了更精准的计算文字的高度,所以我只拿会影响高度的css,同时我也把textarea的overflow附上hidden属性,因为这点为影响width。
auto-resize指令有一个默认,当没有value时,会没有keyup事件。如果把value设置成"watch",就有keyup事件。
在第一次keyup新的对象时,会把当前的对象css属性给复制到在北方的textarea。
在每次keyup时,会把对象的value同步到北方的textarea,计算高度后给对象新的高度。
*不用复制代码自己测试,因为有些js没附上。
angular : direative : autoResize textarea auto resize的更多相关文章
- angular : direative : scope | 指令scope里的符号@,=
		先看看以下的代码 <body ng-app="app" ng-controller="ctrl"> <dir myname="nam ... 
- angular : direative : scope | 指令scope和transclude的关系
		今天记入的是指令的scope和transclude关系 a 和 b 都是指令 <div a> <div b></div> </div> a transc ... 
- angular : direative :comunication 指令之间的通讯
		在网络上可以找到多种指令之间的通讯 · $on,$emit,$boardcast (向上或向下冒泡) · 指令return的required (^)向上一个scope通讯,前提要先给scope一个na ... 
- 设置textarea文本域不能调整大小 resize
		CSS3中新增了resize缩放属性,这个属性可以应用到任意元素.目前只有Webkit内核的浏览器才支持这个css3属性,即Google chrome和Apple safari都支持.而textare ... 
- jQuery autoResize
		这是一个用jQuery实现的, 自动调整textarea高度, 非常的好!但原作者已经把它的相关描述页面移除了, 这里做个备份吧~但js路径还在:full: http://james.padolsey ... 
- textarea增加字数监听且高度自适应(兼容IE8)
		1.封装方法: var textareaListener = { /*事件监听器兼容 * *attachEvent——兼容:IE7.IE8:不兼容firefox.chrome.IE9.IE10.IE1 ... 
- CSS3魔法堂:禁止用户改变textarea大小
		一.前言 在FF.Chrome和Safari下默认时允许用户以拖拽形式来改变textarea大小,这不仅与IE下textarea的行为特点有异,而且textarea的大小变化会撑大其父节点从而破坏整体 ... 
- 【转】使用 Auto Layout 的典型痛点和技巧
		layoutIfNeeded()强制立刻更新布局 原文网址:http://www.jianshu.com/p/0f031606e5f2 官方文档:Auto Layout Guide 加上去年WWDC上 ... 
- textarea禁止拖拽
		<textarea style="resize:none;" ></textarea>' 
随机推荐
- Nodejs中Mongodb使用
			Mongodb使用 打开解压后的Mongodb文件夹,新建data.logs文件夹,并在logs文件夹中新建mongodb.log文档. 添加后Mongod文件夹示意图: 用cmd命令行启动Mongo ... 
- IM 融云 之 初始化及登录
			融云是没有用户体系的,用户登录需要获取token,测试时可以使用网站提供的接口,但是正式是要通过服务器调用专门的接口从融云获取的.并且我没看到融云的重连机制,不知道是否已在SDK内部实现. 现在看来, ... 
- ExportExcel
			package cn.com.jansh.core.util; import java.awt.print.Book; import java.io.BufferedInputStream; impo ... 
- tomcat 修改网站路径(Java之负基础实战)
			1.找到server.xml 在tomcat安装路径/conf/server.xml 2.搜索webapps 添加 <Context path="" docBace=&quo ... 
- mysql常用博客论坛
			大神博客: starive的博客:http://blog.itpub.net/26435490/viewspace-1133659/ 北在南方的博客:http://blog.itpub.net/226 ... 
- php调用js变量
			<script> function tuichu(skp){ <?php $ok="skp"; echo "alert($ok)";//实验代 ... 
- 【BZOJ 3926】【ZJOI 2015】诸神眷顾的幻想乡
			http://www.lydsy.com/JudgeOnline/problem.php?id=3926 广义后缀自动机的例题,感觉广义后缀自动机好恶心... 广义后缀自动机是对一个trie建立的后缀 ... 
- Linux下配置Apache最大连接数
			最近有博友发现我的博客经常http 503,博客负载不大,应该不会出现负载问题,很有可能就是Apache最大连接数原因,Apache默认支持150个连接.1.先要修改最大连接数,必须了解Apache的 ... 
- 使用ActionBar实现下拉式导航
			ActionBar除可提供Tab导航支持之外,还提供了下拉式(DropDown)导航方式.下拉式导航的ActionBar在顶端生成下拉列表框,当用户单击某个列表项时,系统根据用户单击事件导航指定Fra ... 
- Java线程:同步
			一 同步的概念 线程的同步是为了防止多个线程访问一个数据对象时,对数据造成的破坏. 例如:两个线程ThreadA.ThreadB都操作同一个对象Foo对象,并修改Foo对象上的数据. MyRunnab ... 
