DOM树节点和事件
一、前言:DOM树节点是JS的基础语句。通过节点,能够取到HTML代码中的任意标签,从而对其进行修改和添加各种视觉效果。
二、DOM树节点
DOM节点分为三大类: 元素节点,属性节点,文本节点
文本节点,属性节点属于元素节点的子节点。操作时,均需要先取到元素节点,再操作子节点;
可以使用getElement系列方法,取到元素节点 。
1、查看元素节点
getElementById: 通过ID取到唯一节点。如果id重名,则id只能取到第一个
getElemenstByName(): 通过name属性
getElemenstByTagName(): 通过标签名
getElementsByClassName(): 通过class名
》》获取元素节点时,一定要注意:获取节点的语句,必须在DOM渲染完成之后执行。可以有两者方式实现:
① 将代码写在body之后;
② 将代码写到Window.onload(){}函数之中。
》》后面的三个取到的是数组格式。不能直接添加各种属性,而应该取出数组的每一个单独操(即使数组中只有一个值)。
例如:getElemenstByName("name1")[0].onclik = fucntion(){}
2、 查看及设置属性节点
①查看属性节点:getAttribute("属性名");
②重新设置属性节点:setAttribute("属性名","新属性值");
》》查看和设置属性节点,必须先取到元素节点,才能使用。
》》setattribute();属性在IE浏览器中可能会存在兼容性问题。
比如在IE中不支持使用这个函数设置style/onclick等样式属性和事件属性
》》我们推荐使用点符号法代替上述函数:
eg:dom.style.color = " " dom.onclick=" " dom.src =" "
③移除属性:removeAttribute("属性名");
【总结-JS修改DOM节点的样式】
1.使用setAttribute 设置class和style属性,但是存在兼容性问题,不提倡
div.setAttribute ("class","class1");
2.使用.className直接设置class类:注意是className而不是.class:
div.className = "class1";
3.使用.style设置单个属性,注意属性名要使用驼峰命名法;
div.style.backgroudColor = "red";
4.使用.style或.style.cssText 设置多个样式属性
div.style = "backgroud-color:red;color : yellow";
div.style.cssText = "backgroud-color:red;color : yellow"; √
3、查看设置文本节点
.innerText: 取到或设置节点里面的文字内容(新设置的文字将代替原有的文字,原有文字将被抹掉);
.innerHTML: 取到或设置节点里面的HTML代码(包含里面的所有代码及文字);
.tagName : 取到当前节点的标签名。标签名全部大写显示。
4、根据层次获取节点
① .childNodes:获取元素的所有子节点,包含回车等文本节点
.children:获取当前元素的所有元素节点。(只获取标签)
② .firstChild:获取元素的第一个子节点。包括回车的文本节点
.firstElementChild:获取元素的第一个子节点。不包括回车等文本节点
.lastChild:获取元素的最后一个子节点。包括回车的文本节点
.lastElementChild:获取元素的最后一个子节点。不包括回车等文本节点
③ .parentNode:获取当前元素的父节点
④ .previousSibling:获取当前节点的前一个兄弟节点,包括回车等文本节点
.previousElementSibling:获取当前节点的前一个兄弟节点,不包括回车等文本节点
⑤ .nextSibling:获取当前节点的后一个兄弟节点,包括回车等文本节点
.nextElementSibling:获取当前节点的后一个兄弟节点,包括回车等文本节点
⑥ .getAttributes:获取当前节点的属性节点
5、创建并新增节点
①createElement("标签名");:创建节点 ;需配合setAttribute设置各种新的属性
②父节点.appendChild(新节点);:末尾追加方式插入节点
③.父节点.insertBefore(新节点,目标节点);:在指定节点前插入新节点
④.被克隆节点cloneNode(true/false);:克隆节点
>>true:克隆当前节点,以及当前节点的所有子节点
>>false或不传:只克隆当前节点,而不可隆子节点
6、删除或替换节点
①父节点.removeChild(被删节点);:删除父节点中的子节点
②.父节点.replaceChild(新节点,老节点);:使用新节点,替换掉老节点
7、表格对象
① .rows属性:返回表格中的所有行,是一个数组格式; //取到某行,rows[index]
② .insertRow(index);:在指定位置插入一行,index从0开始 //insertRow(table.rows.length-1):插到倒数第一行的前面
③ .deleteRow(index);:删除指定的一行,index从0开始;
7-1行对象
①.cells属性:返回这一行中的所有单元格,是一个数组形式
// 可用来取该行中的某个单元格 : cell1.innerText = cloneRow.cells[1].innerText;
②.rowIndex属性:返回这一行是表格中的第几行,从0开始;
③.insertCell(index) ;:在这一行指定位置,插入一个单元格,index从0开始
④.deleteCell(index);:删除这一行的指定单元格,index从0开始
7-2单元格对象
①cellIndex属性:返回这个单元格是本行的第几个, 从0开始
②innerText innerHTML align className
三、事件
1、 S中的事件分类
① 鼠标事件
clic、dblclick、onmouseover、onmouseout
② HTML事件
onload、onscroll、onsubmit、onchange、onfocus
③键盘事件
keydown: 键盘按下时触发
keypress: 键盘按下并松开的瞬间触发
keyup: 键盘抬起时触发
2、注意事项
1、执行顺序: keydown-> keypress->keyup
2、当长按时,会循环执行 keydown-> keypress
3、有keydown并不一定有keyup,当事件触发过程中,鼠标将光标移走,将导致没有keyup
4、kypress只能捕获键盘上的数字、字符、符号键,不能捕获各种功能键,而keydown和keyup可以
5、keypress区分大小写,keydown和keyup并不支持
3、确定触发的按键
① 再触发的函数中,传入一个参数e,表示键盘事件;
② 使用e.keyCode,取到按键的ASCII码值,进而确定触发按键;
③ 所有浏览器的兼容写法(一般并不需要):
var evn = e || event; var code = evn.keyCode || evn.which || evn.charCode;
4、JS 事件中的DOM0事件模型]//事件捕获
1、内联模型(行内绑定):直接将函数名作为HTML标签的某个事件属性的属性值
eg:<button onclick="func()"> DOM0内联模型</button>
优点:使用方便
缺点:违反了W3C关于HTML与JavaScript分离的基本原则
2、脚本模型(动态绑定):在JS较本中,取到某个节点,并添加事件属性;
eg:<button id="btn">DOM0脚本模型</button>
优点:实现了HTML与javaScript分离的基本原则
缺点:同一个节点只能绑定一个同类型事件。如果绑定多次,最后一个生效;
5、DOM2事件模型
1、添加事件绑定方式:
① IE8之前:btn2.attachEvent("onclick",函数名);
② 其他浏览器: btn2.addEventListener("click",函数名,true/false);
参数三:false(默认)表示事件冒泡 true:表示事件捕获
③ 兼容写法:
if(btn2.attachEvent) {
btn2.attachEvent();
}else{
btn2.addEventListener();
}
2、优点: ① 可以给同一节点,添加多个同类型事件
② 提供了可以取消事件绑定的函数;
3、取消DOM2事件绑定:
注意:如果要取消DOM2的事件绑定;那么在绑定事件时,处理函数必须要使用有名函数,而不能使用匿名函数。
btn2.removeEventListener("click",func2);
btn2.detachEvent("onclick",func2);
6、JS中的事件流
1、事件冒泡:当某DOM元素触发一种事件时,会从当前节点开始,逐级往上触发其祖先节点的同类型事件,直到DOM根节点;
》》什么情况下会产生事件冒泡
① DOM0模型绑定事件,全部都是冒泡
② IE8之前,使用attachEvent()绑定事件,全部都是冒泡
③ 其他浏览器,使用addEventListener()添加事件,当第三个参数省略或者为false时为事件冒泡;
2、事件捕获:当某DOM元素触发一种事件时,会从文档根节点开始,逐级向下触发其祖先节点的同类型事件,直到该节点自身;
》》什么情况下会产生事件捕获
① 使用addEventListener()添加事件,当第三个参数为true时,为事件冒泡;
↓ DOM根节点 ↑
↓ ↑
捕 爷爷节点 冒
↓ ↑
获 父节点 泡
↓ ↑
↓ 当前节点 ↑
3、阻止事件冒泡
在IE浏览器中,使用 window.event.cancelBubble = true;
在其他浏览器中,使用 window.event.stopPropagation();
兼容所有浏览器的写法:
function myParagraphEventHandler(e) {
e = e || window.event;
if (e.stopPropagation) {
e.stopPropagation(); //IE以外
} else {
e.cancelBubble = true; //IE
}
}
4、 取消事件默认行为:比如超链接a的跳转
在IE浏览器中,使用 window.event.returnValue = false;
在其他浏览器中,使用 window.event.preventDefault();
兼容所有浏览器的写法:
function eventHandler(e) {
e = e || window.event;
// 防止默认行为
if (e.preventDefault) {
e.preventDefault(); //IE以外
} else {
e.returnValue = false; //IE
}
}
DOM树节点和事件的更多相关文章
- DOM树节点关系
DOM是JS中专门操作HTML页面内容的 他的三种基本使用方法是: 1. document.getElementById(''): ——>选取html页面中带有Id的属性名: 2.docum ...
- AppBox中main树节点单击事件JS(还有叶子的节点的页面链接)
AppBox中main.aspx.csif (menu.IsTreeLeaf) { node.Leaf = true; ...
- 通过Ztree生成页面html元素Dom树,以及拖拽改变元素的位置
zTree 是一款依靠 jQuery 实现的多功能 "树插件",http://www.treejs.cn/v3/main.php#_zTreeInfo,功能强大,不多赘述. 下面我 ...
- JS的Dom树小结
一[DOM树节点] DOM节点分为三大类:元素节点.文本节点.属性节点 文本节点.属性节点,为元素节点的两个子节点: 通过getElement系列方法,可以去到元素节点. 二[查看节点] ...
- 随笔一个dom节点绑定事件
以下利用jquery说明: js中,给一个dom节点绑定事件再平常不过了.这里说下,如果dom经常发生变化的话,给这个dom绑定事件的情况. 比如代码如下: li的节点,绑定了事件:点击会打出来里头的 ...
- 如果dom节点是动态添加进页面的,在页面节点绑定事件如何解决的问题。
如果dom节点是动态添加进页面,想在节点绑定事件,传统的做法就是遍历节点,但会出现问题,也肯能有其他的办法,突然想到 可以依据事件冒泡,这样就不惧页面后添加节点而不响应事件的问题.比较结实.示例代码如 ...
- 从Chrome源码看浏览器如何构建DOM树
.aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } p { font-size: 1 ...
- 超全面的JavaWeb笔记day04<dom树等>
1.案例:在末尾添加节点(*****) 创建标签 createElement方法 创建文本 createTextNode方法 把文本添加到标签下面 appendChild方法 2.元素对象(了解) 如 ...
- 用live()方法给新增节点绑定事件
jQuery 给所有匹配的元素附加一个事件处理函数,即使这个元素是以后再添加进来的也有效. 这个方法是基本是的 .bind() 方法的一个变体.使用 .bind() 时,选择器匹配的元素会附加一个事件 ...
随机推荐
- spring AOP原理
spring 实现AOP是依赖JDK动态代理和CGLIB代理实现的.以下是JDK动态代理和CGLIB代理简单介绍 JDK动态代理:其代理对象必须是某个接口的实现,它是通过在运行期间创建一个接口的 ...
- (转)Linux命令unzip
场景:解压war包时候用到该命令,感觉很方便. 1 基本用法 unzip [选项] 压缩文件名.zip 1.2 完整语法 unzip [-cflptuvz] [-agCjLMnoqsVX] [-P & ...
- 【HTML】web语义化
一.解决的问题 & 评价标准 web语义化能解决如下问题: 1. 页面样式丢失 2. 有颜色或其他障碍的访客也能读懂页面 3. 移动设备访问页面 4. 程序(如爬虫)理解页面(换句话说SEO优 ...
- Java Web开发中Spring+MyBatis框架的简单搭建
这里使用的eclipse,首先创建一个动态web项目. 1.导入Spring IOC.AOP.DAO.dbcp.dbdrive.mybatis.jar . mybatis-spring.jar 本人 ...
- CentOS6.3 下安装codeblocks
本人用的系统是centos6.3(虚拟机) 需要预先安装gcc编译器(参考:http://www.cnblogs.com/magialmoon/archive/2013/05/05/3061108.h ...
- Presto向分区表快速插入数据时出现'target directory already exists'的原因
因为项目使用Presto作为ETL使用,需要将关系库中的数据导入到Hive中.目前关系库中的数据每天导入一次,在Hive中以天为间隔创建新的分区.思路是正确的,但是在使用的过程中,发现将少量关系库中的 ...
- nodejs01--什么是nodejs,nodejs的基本使用
nodejs使用范围 -直接在cmd命令行运行,在你的电脑上直接运行 -可以搭建一个web服务器(express,koa) -一些基本的使用 -modules是如何工作的 -npm管理modules ...
- 在webpack中使用Code Splitting--代码分割来实现vue中的懒加载
当Vue应用程序越来越大,使用Webpack的代码分割来懒加载组件,路由或者Vuex模块, 只有在需要时候才加载代码. 我们可以在Vue应用程序中在三个不同层级应用懒加载和代码分割: 组件,也称为异步 ...
- appach-maven-3.5.0配置与下载
今天需要搭建javaweb开发的环境,需要配置maven.弄了半天终于配置好了.蛋疼的一批.楼主用的是win10的系统.不知道Linux下的也是不是这么坑! 首先,需要把maven的包下载下来.进入h ...
- python进阶(5):组合,继承
前两天我们认识了面向对象也对面向对象有了初步的认识今天我们先会说一点组合的进阶,今天重点是继承. 一.组合 组合只有一个例子因为组合只作为上一章的补充内容 #老师 课程 生日 class Course ...