angular : direative : autoResize

今天为大家推出自己的auto resize 指令功能。

目的:解决textarea在给height的问题。

参考源码:http://monospaced.github.io/angular-elastic/elastic.js

参考网站:http://plnkr.co/edit/9y6YLriAwsK9hqdu72WT?p=preview

<script>
 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());
                        });
                    }
                }
            }
        }]);
    </script>

过程:在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没附上。

时间: 2024-10-07 03:00:45

angular : direative : autoResize的相关文章

angular : direative :通讯

在网络上可以找到多种指令之间的通讯 · $on,$emit,$boardcast (向上或向下冒泡) · 指令return的required (^)向上一个scope通讯,前提要先给scope一个name · 建立一个factory,让需要通讯的指令依赖注入factory服务 以上都可以解决通讯问题,但是在不同的状况下还是会遇到代码阅读上的问题 今天遇到的问题是当指令A的child的指令B要和指令A通讯,同时指令C(不在指令A的child)要和指令A通讯 最终决定使用$on和$boardcast

angular : direative : scope 指令scope和transclude的关系

今天记入的是指令的scope和transclude关系 a 和 b 都是指令 <div a> <div b></div> </div> a transclude了b,b的$$prevSibling是a,而a的$$prevSibling不是b <div a> <div ng-transclude=""> <div b></div> </div> </div> angul

angular : direative : scope | 指令scope里的符号@,=

先看看以下的代码 <body ng-app="app" ng-controller="ctrl"> <dir myname="name"></dir> <script src="js/angular.js"></script> <script> var app = angular.module("app", []); app.contr

angular中模板

<!DOCTYPE html><!--调用模块--><html lang="en" ng-app="myApp"><head> <meta charset="UTF-8"> <script src="js/angular.js"></script> <title>Title</title></head><

利用angular打造管理系统页面

1 创建一个新的angular应用 ng new adminSystem 2 利用WebStorm打开adminSystem应用 3 借助AdminLTE这个开源项目来辅助开发 AdminLTE项目:点击前往 将AdminLTE项目的精简版本源代码复制到adminSystem应用主模块的主组件的模板中 AdminLTE项目的精简版本效果图 <!DOCTYPE html> <!-- This is a starter template page. Use this page to star

Angular基础(二) 组件的使用

? 一.简单操作 a) 使用Angular CLI可以快速创建项目框架,先运行 $ npm install –g @angular/[email protected]安装CLI,为CLI的位置设置环境变量,然后就可以全局使用ng命令了. 执行ng new –ng4 angular-hello-world可以创建Angular4项目,会自动生成基础的文件夹和文件,还会自动进行npm i操作,下载并安装所需的依赖. 然后执行ng serve就可以编译并启动这个程序了,但ng并不会自动打开浏览器. b

Angular 2基础(一) 环境搭建

Angular2是一款开源JavaScript库,由Google维护,用来创建页面应用程序.正式发布于2016年9月,基于ES6开发. 一.准备工作 使用Angular2开发,需要预先做一些配置上的配置,如NPM.Node.Js.Git等,还要对TypeScript有个大概的了解. a)NPM是随同NodeJS一起安装的包管理器,那应该类似NuGet的作用了.NPM集成在了NodeJS安装包,可以一起安装,在CMD输入npm –v和node –v可以验证是否已安装. b)TypeScript则是

angular踩坑之路:初探webpack

之前费了一番力气安装好了angular开发环境,后面的几天都是在angular中文官网上看文档,照着英雄教程一步一步操作,熟悉了angular的一些基本特性,这部分没有遇到什么大问题,还比较顺利.这两天在看官方文档中的Webpack简介,想跟着文档做一遍,了解一下如何用Webpack打包angular项目,结果遇到了一些问题,因为是初学angular和Webpack的小白,这些问题一时难以解决,花费了不少时间,想在这里记录一下. 首先跟着文档将相关的文件都添加到项目中,目录是这样子的: 根据文档

angular参考手册拷贝

AngularJS 参考手册 AngularJS 指令 本教程用到的 AngularJS 指令 : 指令 描述 ng-app 定义应用程序的根元素. ng-bind 绑定 HTML 元素到应用程序数据 ng-bind-html 绑定 HTML 元素的 innerHTML 到应用程序数据,并移除 HTML 字符串中危险字符 ng-bind-template 规定要使用模板替换的文本内容 ng-blur 规定 blur 事件的行为 ng-change 规定在内容改变时要执行的表达式 ng-check