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 相关文章推荐
一个小型js框架myJSFrame附API使用帮助
Jun 28 Javascript
window.event.keyCode兼容IE和Firefox实现js代码
May 30 Javascript
简单的邮箱登陆的提示效果类似于yahoo邮箱
Feb 26 Javascript
JavaScript访问CSS属性的几种方式介绍
Jul 21 Javascript
js实现的星星评分功能函数
Dec 09 Javascript
javascript 跨域问题以及解决办法
Jul 17 Javascript
ES6与CommonJS中的模块处理的区别
Jun 13 Javascript
Echart折线图手柄触发事件示例详解
Dec 16 Javascript
Vue唯一可以更改vuex实例中state数据状态的属性对象Mutation的讲解
Jan 18 Javascript
JavaScript实现网页留言板功能
Nov 23 Javascript
详解template标签用法(含vue中的用法总结)
Jan 12 Vue.js
详解JS ES6编码规范
May 07 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
如何做到多笔资料的同步
2006/10/09 PHP
通过5个php实例细致说明传值与传引用的区别
2012/08/08 PHP
封装ThinkPHP的一个文件上传方法实例
2014/10/31 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
JavaScript中Array 对象相关的几个方法
2006/12/22 Javascript
bgsound 背景音乐 的一些常用方法及特殊用法小结
2010/05/11 Javascript
JS延迟加载(setTimeout) JS最后加载
2010/07/15 Javascript
js获得地址栏?问号后参数的方法
2013/08/08 Javascript
浅谈jQuery事件绑定原理
2015/01/02 Javascript
原生javascript实现隔行换色
2015/01/04 Javascript
director.js实现前端路由使用实例
2015/02/03 Javascript
JavaScript中Math.SQRT2属性的使用详解
2015/06/14 Javascript
jQuery简单实现提交数据出现loading进度条的方法
2016/03/29 Javascript
javascript创建cookie、读取cookie
2016/03/31 Javascript
浅析jQuery中使用$所引发的问题
2016/05/29 Javascript
JavaScript函数中关于valueOf和toString的理解
2016/06/14 Javascript
使用bootstrap validator的remote验证代码经验分享(推荐)
2016/09/21 Javascript
jQuery实现点击后高亮背景固定显示的菜单效果【附demo源码下载】
2016/09/21 Javascript
React之PureComponent的使用作用
2018/07/10 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
微信小程序获取地理位置及经纬度授权代码实例
2019/09/18 Javascript
Python中不同进制互相转换(二进制、八进制、十进制和十六进制)
2015/04/05 Python
详解python中的文件与目录操作
2017/07/11 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
解决.ui文件生成的.py文件运行不出现界面的方法
2019/06/19 Python
初次部署django+gunicorn+nginx的方法步骤
2019/09/11 Python
python中如何设置代码自动提示
2020/07/15 Python
纯css3制作网站后台管理面板
2014/12/30 HTML / CSS
通信工程专业个人找工作求职信范文
2013/09/21 职场文书
书法比赛获奖感言
2014/02/10 职场文书
2014年教研工作总结
2014/12/06 职场文书
2015年挂职锻炼工作总结
2014/12/12 职场文书
行政文员岗位职责
2015/02/04 职场文书
2015毕业设计工作总结
2015/07/24 职场文书
导游词之五台山
2019/10/11 职场文书
Windows Server 2016 配置 IIS 的详细步骤
2022/04/28 Servers