详解如何在Angular中快速定位DOM元素


Posted in Javascript onMay 17, 2017

在使用Angular2+中,经常会想快速的去选择DOM上的某个元素,如果是刚上手Angular,有可能直接就使用原生DOM操作或者导入jQuery再进行DOM操作,既然都使用了Angular了,有没有更好的方法呢?答案是肯定的。

通过ElementRef

先上代码:

import {Component, ElementRef, OnInit} from '@angular/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
 color:string;
 title = 'button !';
 constructor(private el:ElementRef){}
 setHeight(){
  this.el.nativeElement.querySelector('.btn1').style.height = '300px';
 }
 ngOnInit(){
  this.setHeight();
 }
}
<h1>
 {{title}}
</h1>
<div>
<button myHighlight class="btn btn1">按钮一</button>
<button myHighlight class="btn">按钮二</button>
<button myHighlight class="btn">按钮三</button>
</div>

效果是这样:

详解如何在Angular中快速定位DOM元素

上述代码中的nativeElement其实包含的是组件中所有的DOM元素,如下图所示:

详解如何在Angular中快速定位DOM元素

通过调用querySelectorAPI就能获取页面元素,需要注意的是querySelector只返回第一个元素,当你需要选择多个元素的时候可以使用querySelectorAll

通过@viewChild

<h1>
 {{title}}
</h1>
<div>
<button myHighlight class="btn btn1">按钮一</button>
<button myHighlight class="btn" #btn>按钮二</button> <!--增加一个变量-->
<button myHighlight class="btn">按钮三</button>
</div>
import {Component, ElementRef, OnInit, ViewChild} from '@angular/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
 @ViewChild('btn') btn:ElementRef;//通过@ViewChild获取元素
 color:string;
 title = 'button !';
 constructor(private el:ElementRef){}
 setHeight(){
  this.el.nativeElement.querySelector('.btn1').style.height = '300px';
 }
 setWidth(){
  this.btn.nativeElement.style.width = '200px';//定义宽度
 }
 ngOnInit(){
  this.setHeight();
  this.setWidth();
 }
}

效果如下:

详解如何在Angular中快速定位DOM元素

如果多个HTML元素都定义了相同的变量,使用@viewChild时只能选择到第一个元素。

更好的方法是配合renderer2对象提供的API去实现同样的效果,这样减少应用层与渲染层之间强耦合关系:

import {Component, ElementRef, OnInit, Renderer2, ViewChild} from '@angular/core';
@Component({
 selector: 'app-root',
 templateUrl: './app.component.html',
 styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit{
 @ViewChild('btn') btn:ElementRef;
 color:string;
 title = 'button !';
  //初始化renderer2
 constructor(private el:ElementRef,private renderer2: Renderer2){}
 setHeight(){
  this.el.nativeElement.querySelector('.btn1').style.height = '300px';
 }
 setWidth(){
  // this.btn.nativeElement.style.width = '200px';
  
  //使用renderer2的setStyle方法设置宽度
  this.renderer2.setStyle(this.btn.nativeElement,'width','200px')
 }
 ngOnInit(){
  this.setHeight();
  this.setWidth();
 }
}

参考文章中都提到了@viewChild配合renderer选择元素,但是在Angular4renderer已经废弃掉了,变成了renderer2

renderer2API中还有其他的一些方法可以用来进行一些DOM操作:

class Renderer2 {
 data : {[key: string]: any}
 destroy() : void
 createElement(name: string, namespace?: string) : any
 createComment(value: string) : any
 createText(value: string) : any
 destroyNode : (node: any) => void |
 appendChild(parent: any, newChild: any) : void
 insertBefore(parent: any, newChild: any, refChild: any) : void
 removeChild(parent: any, oldChild: any) : void
 selectRootElement(selectorOrNode: string|any) : any
 parentNode(node: any) : any
 nextSibling(node: any) : any
 setAttribute(el: any, name: string, value: string, namespace?: string) : void
 removeAttribute(el: any, name: string, namespace?: string) : void
 addClass(el: any, name: string) : void
 removeClass(el: any, name: string) : void
 setStyle(el: any, style: string, value: any, flags?: RendererStyleFlags2) : void
 removeStyle(el: any, style: string, flags?: RendererStyleFlags2) : void
 setProperty(el: any, name: string, value: any) : void
 setValue(node: any, value: string) : void
 listen(target: 'window'|'document'|'body'|any, eventName: string, callback: (event: any) => boolean | void) : () => void
}

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

Javascript 相关文章推荐
JavaScript Event学习第四章 传统的事件注册模型
Feb 07 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
基于JQuery和CSS3实现仿Apple TV海报背景视觉差特效源码分享
Sep 21 Javascript
深入理解JavaScript内置函数
Jun 03 Javascript
深入理解JS正则表达式---分组
Jul 18 Javascript
基于AngularJS实现iOS8自带的计算器
Sep 12 Javascript
vue子父组件通信的实现代码
Jul 09 Javascript
jQuery Easyui Treegrid实现显示checkbox功能
Aug 08 jQuery
axios发送post请求springMVC接收不到参数的解决方法
Mar 05 Javascript
countup.js实现数字动态叠加效果
Oct 17 Javascript
js实现旋转木马轮播图效果
Jan 10 Javascript
详解webpack的文件监听实现(热更新)
Sep 11 Javascript
vue2.0中goods选购栏滚动算法的实现代码
May 17 #Javascript
AngularJS自定义指令实现面包屑功能完整实例
May 17 #Javascript
jQuery Validate 无法验证 chosen-select元素的解决方法
May 17 #jQuery
AngularJS使用拦截器实现的loading功能完整实例
May 17 #Javascript
微信小程序城市定位的实现实例(获取当前所在国家城市信息)
May 17 #Javascript
微信小程序如何获知用户运行小程序的场景教程
May 17 #Javascript
bootstrap轮播图示例代码分享
May 17 #Javascript
You might like
php+ajax实现图片文件上传功能实例
2014/06/17 PHP
CodeIgniter模板引擎使用实例
2014/07/15 PHP
Laravel中服务提供者和门面模式的入门介绍
2017/11/06 PHP
简单的JS多重继承示例
2008/03/13 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
40款非常棒的jQuery 插件和制作教程(系列二)
2011/11/02 Javascript
基于jquery的时间段实现代码
2012/08/02 Javascript
javascript如何动态加载表格与动态添加表格行
2013/11/27 Javascript
js动态添加onclick事件可传参数与不传参数
2014/07/29 Javascript
jquery 实现输入邮箱时自动补全下拉提示功能
2015/10/04 Javascript
jQuery+formdata实现上传进度特效遇到的问题
2016/02/24 Javascript
在web中js实现类似excel的表格控件
2016/09/01 Javascript
微信小程序开发之实现选项卡(窗口顶部TabBar)页面切换
2016/11/25 Javascript
JavaScript实现图片本地预览功能【不用上传至服务器】
2017/09/20 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
使用vue实现一个电子签名组件的示例代码
2020/01/06 Javascript
jQuery冲突问题解决方法
2021/01/19 jQuery
python实现在每个独立进程中运行一个函数的方法
2015/04/23 Python
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
Python fileinput模块使用实例
2015/06/03 Python
Python升级导致yum、pip报错的解决方法
2017/09/06 Python
Python动态语言与鸭子类型详解
2019/07/01 Python
Python面向对象之私有属性和私有方法应用案例分析
2019/12/31 Python
浅谈在django中使用redirect重定向数据传输的问题
2020/03/13 Python
python 多线程中join()的作用
2020/10/29 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
HMV日本官网:全球知名的音乐、DVD和电脑游戏零售巨头
2016/08/13 全球购物
茵宝(Umbro)英国官方商店:英国足球服装生产商
2016/12/29 全球购物
美国最大的在线寄售和旧货店:Swap.com
2018/08/27 全球购物
Nike瑞士官网:Nike CH
2021/01/18 全球购物
学生自我鉴定模板
2013/12/30 职场文书
工程招投标邀请书
2014/01/26 职场文书
升职自荐信怎么写
2015/03/05 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
vue-cli4.5.x快速搭建项目
2021/05/30 Vue.js
关于springboot配置druid数据源不生效问题(踩坑记)
2021/09/25 Java/Android