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 相关文章推荐
禁止F5等快捷键的JS代码
Mar 06 Javascript
javascript对象的property和prototype是这样一种关系
Mar 24 Javascript
用js实现下载远程文件并保存在本地的脚本
May 06 Javascript
Javascript select下拉框操作常用方法
Nov 09 Javascript
查看源码的工具 学习jQuery源码不错的工具
Dec 26 Javascript
深入理解JavaScript系列(44):设计模式之桥接模式详解
Mar 04 Javascript
js运动应用实例解析
Dec 28 Javascript
jQuery简单实现点击文本框复制内容到剪贴板上的方法
Aug 01 Javascript
浅谈javascript中的Function和Arguments
Aug 30 Javascript
把json格式的字符串转换成javascript对象或数组的方法总结
Nov 03 Javascript
详解Vue 事件修饰符capture 的使用
Dec 29 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
Apr 16 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 自写函数代码 获取关键字 去超链接
2010/02/08 PHP
PHP实现的汉字拼音转换和公历农历转换类及使用示例
2014/07/01 PHP
PHP获取一年中每个星期的开始和结束日期的方法
2015/02/12 PHP
PHP中ltrim与rtrim去除左右空格及特殊字符实例
2016/01/07 PHP
thinkphp表单上传文件并将文件路径保存到数据库中
2016/07/28 PHP
php+javascript实现的动态显示服务器运行程序进度条功能示例
2017/08/07 PHP
PHP抽象类基本用法示例
2018/12/28 PHP
建议大家看下JavaScript重要知识更新
2007/07/08 Javascript
JS 按钮点击触发(兼容IE、火狐)
2013/08/07 Javascript
JQuery EasyUI 日期控件如何控制日期选择区间
2014/05/05 Javascript
每天一篇javascript学习小结(Date对象)
2015/11/13 Javascript
Jquery揭秘系列:ajax原生js实现详解(推荐)
2016/06/08 Javascript
ionic实现可滑动的tab选项卡切换效果
2020/04/15 Javascript
JavaScript数组去重的几种方法效率测试
2016/10/23 Javascript
jQuery表格的维护和删除操作
2017/02/03 Javascript
详谈js中数组(array)和对象(object)的区别
2017/02/27 Javascript
ES6新特性之函数的扩展实例详解
2017/04/01 Javascript
JS实现图片预加载之无序预加载功能代码
2017/05/12 Javascript
es7学习教程之fetch解决异步嵌套问题的方法示例
2017/07/21 Javascript
微信小程序使用Socket的实例
2017/09/19 Javascript
JavaScript实现动态添加、移除元素或属性的方法分析
2019/01/03 Javascript
vue打开其他项目页面并传入数据详解
2020/11/25 Vue.js
[01:40]2014DOTA2国际邀请赛 三冰SOLO赛后采访恶搞
2014/07/09 DOTA
详解Django框架中的视图级缓存
2015/07/23 Python
python实现红包裂变算法
2016/02/16 Python
Python中调用其他程序的方式详解
2019/08/06 Python
python小技巧——将变量保存在本地及读取
2020/11/13 Python
numba提升python运行速度的实例方法
2021/01/25 Python
CSS3实现swap交换动画
2016/01/19 HTML / CSS
H&M美国官网:欧洲最大的服饰零售商
2016/09/07 全球购物
荷兰在线钓鱼商店:Raven
2019/06/26 全球购物
python re模块和正则表达式
2021/03/24 Python
精彩的大学生自我评价
2013/11/17 职场文书
招商业务员岗位职责
2013/12/16 职场文书
考试作弊被抓检讨书
2014/10/02 职场文书
Python采集壁纸并实现炫轮播
2022/04/30 Python