AngularJS对动态增加的DOM实现ng-keyup事件示例


Posted in Javascript onMarch 12, 2018

我们经常在网页中看到这种形式的内容,如图:

AngularJS对动态增加的DOM实现ng-keyup事件示例

用鼠标点击一下,就变成了一个input,如图:

AngularJS对动态增加的DOM实现ng-keyup事件示例

如果未输入内容,并且鼠标离开后,则变回了原来的样子;如果输入了内容,即使鼠标离开,也保持内容不变,此时输入回车,则添加内容,并清空输入框。

我在想这个是这么实现的?想了一下有这么一个思路:普通情况下这个是一个divp元素,点击之后变成一个input元素,鼠标离开则变回原元素。代码(含详细注释版)如下:

window.onload = function () {
  // 页面加载完给id为click-to-add的元素增加onclick方法
  document.getElementById("click-to-add").onclick = function () {
    // this在这个函数中就是id为click-to-add的元素,将其保存到变量non_input_type
    var non_input_type = this;
    // 新建一个input,保存到变量input_type
    var input_type = document.createElement("input");
    // 给input添加class和placeholder,这里我发现class对bootstrap有效
    input_type.setAttribute("placeholder", "添加待办事项");
    input_type.className = "form-control";
    // 获取父元素,然后父元素替换Child
    this.parentNode.replaceChild(input_type, non_input_type);
    // 设置焦点到input框中
    input_type.focus();
    // 当input失去焦点,即鼠标点到了别的地方
    input_type.onblur = function () {
    // 且input中没有输入内容时
    if (input_type.value.length === 0){
      // 再替换回原来的对象
      input_type.parentNode.replaceChild(non_input_type, input_type);
      }
    }
  }
};

对应的html代码则很简单:

<div>
    <p id="click-to-add">
      <span>+</span>
      <span>添加待办事项</span>
    </p>
  </div>

那么input怎么响应回车呢?html自带的onkeyup可以很容易做到,在此不演示,可以自行搜索。而在Angular中,可以给input增加ng-keyup来实现,这个本来也很简单,但在现在的这个问题中,input不是一开始就有的,而是新生成的,直接使用ng-keyup并不起作用,Angular只会监听在页面加载完时的ng方法,新增的则无效,要使新增的DOM也能响应Angular方法,需要对其使用$compile方法,在前文this.parentNode.replaceChild(input_type, non_input_type);这句代码之前增加以下两行:

// 增加ng-keyup事件,对应执行send($event)这个函数
input_type.setAttribute("ng-keyup", "send($event)");
// 对input_type使用$compile方法
$compile(input_type)($scope);

接下来还要编写send方法,如下:

$scope.send = function (e) {
  // 不同浏览器获取按键代码不一样,有的是e.keyCode,有的是e.which
  var keycode = window.event?e.keyCode:e.which;
  // 回车对应13
  if (keycode === 13){
    // e.targe就是对应的DOM,这里获取到value就按自己的需求去处理了
    alert("Add ToDo: " + e.target.value);
    e.target.value = "";
  }
}

演示如下,普通情况下是这样的:

AngularJS对动态增加的DOM实现ng-keyup事件示例

点击后变成输入框:

AngularJS对动态增加的DOM实现ng-keyup事件示例

有内容时,失去焦点也不会变,无内容时则回到普通状态,按下回车时,则alert内容:

AngularJS对动态增加的DOM实现ng-keyup事件示例

后来我又想了一下,只使用input就可以了,可以修改placeholder的颜色……

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JavaScript中String和StringBuffer的速度之争
Apr 01 Javascript
给jqGrid数据行添加修改和删除操作链接(之一)
Nov 04 Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 Javascript
jQuery中的通配符选择器使用总结
May 30 Javascript
JS中用三种方式实现导航菜单中的二级下拉菜单
Oct 31 Javascript
AngularJS Phonecat实例讲解
Nov 21 Javascript
jQuery中hover方法搭配css的hover选择器,实现选中元素突出显示方法
May 08 jQuery
微信小程序开发之实现自定义Toast弹框
Jun 08 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
Aug 15 Javascript
浅谈es6语法 (Proxy和Reflect的对比)
Oct 24 Javascript
jQuery中复合选择器简单用法示例
Mar 31 jQuery
ES6 解构赋值的原理及运用
May 25 Javascript
vue路由懒加载的实现方法
Mar 12 #Javascript
vue移动UI框架滑动加载数据的方法
Mar 12 #Javascript
详解vuex的简单使用
Mar 12 #Javascript
js提取中文拼音首字母的封装工具类
Mar 12 #Javascript
基于express中路由规则及获取请求参数的方法
Mar 12 #Javascript
Node.JS段点续传:Nginx配置文件分段下载功能的实现方法
Mar 12 #Javascript
javascript变量提升和闭包理解
Mar 12 #Javascript
You might like
PHP文件下载类
2006/12/06 PHP
php使用CURL伪造IP和来源实例详解
2015/01/15 PHP
php header函数的常用http头设置
2015/06/25 PHP
微信支付开发动态链接Native支付
2016/07/12 PHP
PHP读取、解析eml文件及生成网页的方法示例
2017/09/04 PHP
JavaScript页面刷新与弹出窗口问题的解决方法
2010/03/02 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
js 获取、清空input type=&quot;file&quot;的值示例代码
2014/02/19 Javascript
Internet Explorer 11 浏览器介绍:别叫我IE
2014/09/28 Javascript
JavaScript使用Max函数返回两个数字中较大数的方法
2015/04/06 Javascript
异步JavaScript编程中的Promise使用方法
2015/07/28 Javascript
jQuery实现的漂亮表单效果代码
2015/08/18 Javascript
JS获取复选框的值,并传递到后台的实现方法
2016/05/30 Javascript
浅谈jquery页面初始化的4种方式
2016/11/27 Javascript
解析AngularJS中get请求URL出现的跨域问题
2016/12/01 Javascript
使用jquery给新生的th绑定hover事件的实例
2017/02/10 Javascript
Nodejs--post的公式详解
2017/04/29 NodeJs
JavaScript中双向数据绑定详解
2017/05/03 Javascript
js动态添加表格逐行添加、删除、遍历取值的实例代码
2018/01/25 Javascript
解决elementUI 切换tab后 el_table 固定列下方多了一条线问题
2020/07/19 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
[44:22]完美世界DOTA2联赛循环赛 FTD vs PXG BO2第一场 11.01
2020/11/02 DOTA
深入浅析python定时杀进程
2016/06/06 Python
python使用pil库实现图片合成实例代码
2018/01/20 Python
使用k8s部署Django项目的方法步骤
2019/01/14 Python
python 用for循环实现1~n求和的实例
2019/02/01 Python
Numpy数组array和矩阵matrix转换方法
2019/08/05 Python
python制作英语翻译小工具代码实例
2019/09/09 Python
使用Python实现牛顿法求极值
2020/02/10 Python
html5读取本地文件示例代码
2014/04/22 HTML / CSS
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
Linden Leaves官网:新西兰纯净护肤品
2020/12/20 全球购物
一套中级Java程序员笔试题
2015/01/14 面试题
2015年保送生自荐信
2015/03/24 职场文书
2016大学生暑期三下乡心得体会
2016/01/23 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书