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() 时,选择器匹配的元素会附加一个事件 ...
随机推荐
- Java开源博客My-Blog(SpringBoot+Docker)系列文章
My Blog 1.Docker+SpringBoot+Mybatis+thymeleaf的Java博客系统开源啦 2.My-Blog搭建过程:如何让一个网站从零到可以上线访问 3.将数据的初始化放到 ...
- MyBatis 框架的搭建和配置
MyBatis是支持定制化SQL.存储过程以及高级映射的优秀持久层框架.MyBatis 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集.MyBatis可以对配置和原生Map使用简单的xml或 ...
- Hibernate学习之一对多关联
注意事项: 1.单向一对多 只需在“一”放进行配置2.双向一对多 需要在关联双方都加以配置,而且需要在一的一方设置inverse=true 首先是实体类: TAddress.java(多的一方) ...
- .NET CORE——Console中使用依赖注入
我们都知道,在 ASP.NET CORE 中通过依赖注入的方式来使用服务十分的简单,而在 Console 中,其实也只是稍微绕了个小弯子而已.不管是内置 DI 组件或者第三方的 DI 组件(如Auto ...
- 【CSS】整屏大背景
1. 利用div的层次,设置底层div充满屏幕,并给div设置背景图 <div id="Layer1" style="position:absolute;top:0 ...
- Golang使用pprof和qcachegrind进行性能监控
Golang为我们提供了非常方便的性能测试工具pprof,使用pprof可以非常方便地对Go程序的运行效率进行监测.本文讲述如何使用pprof对Go程序进行性能测试,并使用qcachegrind查看性 ...
- 关于bootstrap的一些想法
老实说,作为一个前端人员,我不怎么会去用bootstrap,但是我会去看,会去了解. 首先,bootstrap其实是给后台以及前端新人用来快速完成一个页面的简单布局,不是按照设计稿psd格式给定做的那 ...
- Openresty使用Thrift安装步骤
最新想用Golang与Openresty相互通讯调用,使用RPC协议来实现,后来研究最终选择了Thrift:主要还是FB实现了支持Lua和Go模块,直接编译就可以成功嵌套使用,非常方便:研究了两天最后 ...
- 30. leetcode 121. Best Time to Buy and Sell Stock
121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...
- nessus重置密码
许久不用的nessus密码居然忘记了,查了下: cmd下进入到nessus的安装目录 提升为管理员,登录系统 如果想用之前的账号,可以直接在系统内重置密码.