javascript中Doom操作方法总结
1:Doom组成 (节点篇)
doom是由节点组成,元素标签,它只是节点一中
节点类型
节点一共分为12种类型
常用节点
1:元素类型 3:文本类型 8:注释类型 9:文档类型
节点属性
nodeType: 标记的是节点的类型
nodeName: 标记的是节点的名称
nodeValue: 标记的是节点的值
<div id="box"><div class="one"></div>你好, 明天<!-- 我是一个注释 -->
</div>执行代码:
// 获取元素
var box = document.getElementById("box");// 获取box的所有子节点
var box_children = getChildNodes(box);//这里封装的函数是在高级浏览器中测试 去掉空白符
function getChildNodes(dom) {/*** 步骤:* 1: 循环查看dom的所有子节点, 查看有没有文本类型* 2: 如果有文本类型, 定义正则表达式去匹配* 3: 定义一个数组,存储不是空白符的节点* 4: 将不是空白符的节点存储起来* 5: 返回该数组**/// 定义数组var arr = [];for (var i = 0; i < dom.childNodes.length; i++) {// 查看子节点中有没有文本类型// console.log(dom.childNodes[i].nodeType);// 判断是否是文本节点if (dom.childNodes[i].nodeType == 3) {// 是文本类型// 定义正则表达式去匹配var reg = /^\s+$/;// 验证if (reg.test(dom.childNodes[i].data)) {// 说明是纯空白console.log("第" + i + "项是纯空白");} else {// 说明不是空白符, 进入到数组中arr.push(dom.childNodes[i]);}} else {// 不是文本类型 可以直接进入数组中arr.push(dom.childNodes[i]);}}// 循环完毕之后,返回数组return arr;
}for (var i = 0; i < box_children.length; i++) {// nodeType属性标记的是该节点的类型console.log(box_children[i].nodeType);// nodeName属性标记的是该节点的名称console.log(box_children[i].nodeName);// nodeValue属性标记的是该节点的值console.log(box_children[i].nodeValue);
}// 输出文档类型 文档类型的值
console.log(document, document.nodeValue);
节点关系
父子:.
father.childNodes // 获取所有的子节点
father. firstChild // 获取第一个子节点
father.lastChild // 获取最后一个子节点
子父:
.child.parentNode // 获取父节点
兄弟
node.nextSibling // 下一个兄弟节点
node.previousSibling // 上一个兄弟节点
<div><ul><li>1</li><li>2</li><li>3</li><li>4</li><ul>
</div>var box = document.getElementById("box");var ul = box.childNodes[0];// 获取第一个子节点
var first = ul.firstChild;
// console.log(first); 1// 获取最后一个子节点
var last = ul.lastChild;
// console.log(last); 4// 中间的这些元素没有办法直接获取, 但是可以通过childNodes[1 | 2 | 3]来获取// 父节点
var father1 = first.parentNode;
var father2 = last.parentNode;// console.log(father1 === father2); true// 兄弟之间的关系
var li3 = ul.childNodes[1];// 下一个兄弟节点
var li4 = li3.nextSibling;
console.log(li4); 3
创建元素 上树 下数
使用方式:
document.createElement(type)
type: 字符串, 元素的类型
返回值: 创建出来的元素
<div id=“box”> <div>
<button id=“btn1”>1</buttom>
<button id=“btn2”>2<button>// 获取元素
var box = document.getElementById("box");var btn1 = document.getElementById("btn1");var btn2 = document.getElementById("btn2");// 创建一个p元素
var p = document.createElement("p");// 给btn1注册点击事件
btn1.onclick = function() {// 追加子元素box.appendChild(p);
}// 当点击btn2的时候, 移除子元素
btn2.onclick = function() {box.removeChild(p);
}
插入节点
father.insertBefore(newChild, oldChild)
newChild: 要插入的元素
oldChild: 参照元素
返回值: newChild
最终效果:newChild作为oldChild的兄弟节点存在
<div><ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li> <li>9</li><li>10</li><ul>
</div>// 获取元素
var ul = document.getElementsByTagName("ul")[0];// 获取ul中所有子节点
var ul_children = getChildNodes(ul);// 创建一个元素
var li = document.createElement("li");
// 设置li元素的内部文本
li.innerHTML = 11;// insertBefore接收两个参数, 第一个参数是要追加的新的元素, 第二个参数可以是null
// ul.insertBefore(li, null); // 此时, 该方法的效果等价于appendChild方法// 我们要将创建出来的li元素追加到li5的前面
ul.insertBefore(li, ul_children[4]);
替换
father.replaceChild(newChild, oldChild)
newChild: 替换上的元素
oldChild: 替换下的元素
返回值: oldChild
<div><ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li> <li>9</li><li>10</li><ul>
</div>// 获取元素
var ul = document.getElementsByTagName("ul")[0];// 获取所有的li元素
var lis = document.getElementsByTagName("li");// 创建一个元素
var li = document.createElement("li");
// 设置内部文本
li.innerHTML = 1111;//延时器
setTimeout(function() {// 替换掉li5ul.replaceChild(li, lis[4]);
}, 3000)
克隆
使用方式:
node.cloneNode(bool)
接收一个参数是布尔值, 默认是false, 表示只复制自身, 如果传递的true, 表示连同子节点一起复制
<div><ul><li>1</li><li>2</li><li>3</li><li>4</li><li>5</li><li>6</li><li>7</li><li>8</li> <li>9</li><li>10</li><ul>
</div>// 获取元素
var ul = document.getElementsByTagName("ul")[0];// 克隆
var newUl = ul.cloneNode();// 传递true
var newUl2 = ul.cloneNode(true);
2:Doom组成 (绑定篇)
window.οnlοad=function(){ } 页面加载执行
innerHTML: 获取元素内部文本。
直接查找绑定
document.getElementById("id名"); 获取节点中id值
getElementsByTagName()[0] 表示从整个文档内进行标签查找。常用先获取id在通过id获取id下所有的标签
document.getElementsByClassName 根据class属性获取
getAttribute 读取自定义属性或者自带属性data- 与.语法用法相同
setAttribute() :自定义设置元素属性值
第一个参数属性名 第二个参数属性值
返回值:undefined
<div id="box" data-xi="xixi">盒子</div>//这里必须获取id值才行 如果只设置自定义属性不设置id会报错 因为你下面的变量获取的上面的id值的节点
var oBox = document.getElementById("box");// 通过点语法不能读取元素自定义属性值
// getAttribute()
oBox.getAttribute("data-xi"); // 设置属性值set将xixi属性值改为haha 没有返回值
console.log(oBox.setAttribute("data-xi","haha"));
常用Windows 方法:
window.innerHeight 浏览器窗口的内部窗口高度
window.innerWidth 浏览器窗口的内部宽度
window.open() 打开新窗口
window.close() 关闭当前窗口
location 对象
window.location 对象用于获得当前页面的地址(URL),并把浏览器重定向到新的页面
常用属性和方法
location.href 获取url
location.href='url' //跳转到指定页面
location.reload() 重新加载页面
计时相关
setTimeout()延时器
语法: var t = setTimeout('函数','时间')
setTimeout() 方法会返回某个值,在上面的语句中,值被储存在名为t的变量中。假如你希望取消这个setTimeout(),你可以使用这个变量名来指定它。
setTimeout() 的地各参数是含有JavaScript 语句的字符串。这个语句可能诸如 'alert('5 seconds!')' 或者对函数的调用,诸如 alertMsg()
第二个参数指示从当前起多少毫秒后执行第一个参数(1000毫秒等于一秒)
clearTimeout()清除延时器
语法: clearTimeout(setTimeout_variable)
// 在指定时间之后执行一次相应函数var timer = setTimeout(function(){alert(123)},3000)// 取消setTimeout设置clearTimeout(timer)
setInterval()定时器
setInterval() 方法可按照指定的周期(以毫秒计)来调用函数或计算表达式
setInterval() 方法会 不停的 调用函数,直到clearInterval() 被调用或窗口被关闭。 由setInterval() 返回的ID值可用作clearInterval()方法的参数
语法: setInterval('js语句',时间间隔)
返回值
一个可以传递给 Windows.clearInterval()从而取消对code的周期性执行的值。
clearInterval()取消定时器
clearInterval() 方法可取消由setInterval() 设置的timeout。
clearInterval(setinter返回的id值)
// 每隔一段时间就执行一次相应函数
var timer = setInterval(function(){console.log(123);},3000)//取消setInterval设置
clearInterval(timer);
3:Doom组成 (事件篇)
Doom 0级事件绑定
事件监听:
绑定数量:只可以给一个元素的一个事件绑定一个函数
执行顺序:是按照代码的绑定顺序
是否可以和 2级事件绑定同时存在: 是
this指向:都指向触发事件的对象
onclick 单击
ondblclick 双击
onmouseenter 鼠标进入
onmouseleave 鼠标离开
onmousedown 鼠标按下
onmouseup 鼠标弹起
onload 加载完毕之后
onfocus 元素获得焦点 通常和表单搭配使用 通过value获取焦点 练习:输入框
onblur 元素失去焦点 应用场景:用于表单验证,用户离开某个输入框时,代表已经输入完了,我们可以对它进行验证
onchange 域的内容被改变。 应用场景:通常用于表单元素,当元素内容被改变时触发, (select联动)
onkeydown 某个键盘按键被按下。 应用场景: 当用户在最后一个输入框按下回车按键时,表单提交.
onkeypress 某个键盘按键被按下并松开。
onkeyup 某个键盘按键被松开。
onmouseout 鼠标从某元素移开。
onmouseover 鼠标移到某元素之上。
scrollTop 页面卷动值指的是视口上面看不到的部分(被卷起来) 获取页面卷动值的方式:
在新版本的chrome、火狐,IE中都支持: document.documentElement.scrollTop
在旧版本的chrmoe,其它浏览器中支持: document.body.scrollTop
鼠标滚轮事件 onmousewheel 当滚动鼠标滚轮的时候会触发该事件
该事件存在兼容性问题:
在火狐中不支持onmousewheel事件, 支持DOMMouseScroll事件
在非火狐中(chrome、IE)指示鼠标滚轮方向的属性: e.wheelDelta
如果是向下滚动是-120的倍数
如果是向上滚动是120的倍数
在火狐中,指示鼠标滚轮方向的属性: e.detail
如果是向下滚动:3的倍数
如果是向上滚动: -3的倍数
// document绑定onmousewheel事件document.onmousewheel = function(e) {// 兼容IEvar e = e || window.event;// console.log(e);// 指示滚轮滚动方向的属性是: e.wheelDeltaconsole.log(e.wheelDelta);}// 火狐中的滚轮事件document.addEventListener("DOMMouseScroll", function(e) {// console.log(e);// 指示鼠标滚轮方向的属性: e.detailconsole.log(e.detail);})
DOM2级绑定方式
事件监听:
绑定数量:可以给一个元素绑定多个函数
执行顺序:是按照代码的绑定顺序
是否可以和 2级事件绑定同时存在: 是
this指向:都指向触发事件的对象
语法:
dom.addEventListener(type, fn, bool)
type: 事件的类型, 是一个字符串, 注意: 不带on, 比如: click、 mousedown、mouseup
fn: 事件处理函数
bool: 是一个布尔值, 默认是false,表示绑定到冒泡阶段, 如果是true表示绑定到捕获阶段
// 获取元素
var box = document.getElementById("box"); 最外层
var box1 = document.getElementById("box1"); 中间层
var box2 = document.getElementById("box2"); 最里层// 使用DOM2级绑定方式
box.addEventListener("click", function() {console.log("box 冒泡");
}, false)box1.addEventListener("click", function() {console.log("box1 冒泡");
}, false)box2.addEventListener("click", function() {console.log("box2 冒泡");
}, false)// 绑定到捕获阶段
box.addEventListener("click", function() {console.log("box 捕获");
}, true)box1.addEventListener("click", function() {console.log("box1 捕获");
}, true)box2.addEventListener("click", function() {console.log("box2 捕获");
}, true)捕获: 事件从最顶层元素开始执行, 一层一层往下, 直到最精确的元素冒泡: 事件从最精确的元素开始执行, 一层一层往上,直到最顶层的元素事件绑定实现的是先捕获在冒泡// box捕获 box1捕获 bo2 冒泡 box2 捕获 box1 冒泡 box 冒泡
ie中元素绑定多个事件
绑定数量:可以给一个元素的一个事件绑定多个函数
执行顺序:优先执行dom0级, 再逆序执行attachEvent事件
是否可以和 0级事件绑定同时存在: 是
this指向:attachEvent指向window
事件的移除方式
二级事件绑定移除事件名称: removeEventListener
该方法用于移除addEventListener绑定的事件
使用方式:
dom.removeEventListener(type, fn, bool)
type: 事件类型
fn: 执行的函数
bool: 决定要移除的是捕获阶段还是冒泡阶段
<div id="box"></div>
<button id="btn"></button>// 提取到外部并且是声明函数
function click() {console.log("事件执行了");
}
// 使用DOM2级绑定方式
box.addEventListener("click", click);// 当点击btn的时候移除事件
btn.onclick = function() {box.removeEventListener("click", click)
}
IE中的移除方式
事件名称: detachEvent
该方法用于移除attachEvent绑定的事件
使用方式与addEventListener是一致的,只不过没有了第三个参数而已
<div id="box"></div>
<button id="btn"></button>// 获取元素
var box = document.getElementById("box");
var btn = document.getElementById("btn");// 提取到外部并且是声明函数
function click() {console.log("事件执行了");
}
// 使用DOM2级绑定方式
box.attachEvent("onclick", click);// 当点击btn的时候移除事件
btn.onclick = function() {box.detachEvent("onclick", click);
}
阻止冒泡
总结:
在高级浏览器中阻止冒泡的方式: e.stopPropagation()
在IE中阻止冒泡的方式: e.cancelBubble = true
<div id="box"><div id="box1"><div id="box2"></div></div>
</div>// 我们希望当点击box2的时候,不要继续往上执行了(不要冒泡)
box2.onclick = function(e) {// 兼容方式 ie中获取不到这个evar e = e || window.event;console.log("box2");// 在高级浏览器中阻止冒泡的方式// console.log(e);// e.stopPropagation();// 在IE中阻止冒泡的方式e.cancelBubble = true;
}
阻止默认事件
当点击某些标签的时候, 会发生一些默认的行为、事件
比如:
submit会默认提交表单
a标签,如果有href属性,默认跳转页面
当页面出现滚动条的时候, 此时滚动鼠标滚轮的时候, 会默认改变滚动条的位置,这些都是默认行为、事件
<a href="www.baidu.com"></a>// 获取元素
var a = document.getElementsByTagName("a")[0];// 给a元素添加点击事件
// a.onclick = function(e) {// 兼容方式var e = e || window.event;// 我们希望当点击的时候不要跳转页面// 在高级浏览器中阻止默认事件的方式e.preventDefault();// 在IE中阻止默认事件的方式e.returnValue = false;// 如果是dom0级事件,可以使用return false
// return false;
// }// DOM2级事件
// 在DOM2级事件中, 不能使用return false 进行阻止默认事件a.addEventListener("click", function(e) {// return false;e.preventDefault();})// attachEvent IE中
a.attachEvent("onclick", function(e) {return false;
})
总结:
在高级浏览器中阻止默认事件的方式: e.preventDefault()
在IE中阻止默认事件的方式: e.returnValue = false
如果是DOM0级事件绑定方式, 还可以使用return false
4:Doom组成 (事件对象与属性篇)
当事件执行的时候,会产生一系列的信息,浏览器将这些信息封装起来并传递到事件函数中 通过函数function中调用参数e获取
offsetX、 offsetY
是鼠标位于元素内部的距离, 会受到子元素的影响
clientX、 clientY
鼠标位于视口中的位置 首屏
pageX、 pageY
鼠标位于页面中的位置
screenX、 screenY
鼠标位于屏幕中的位置
IE中的事件对象
经过测试, 在IE中事件对象没有传递到事件函数中
其实在window.event身上
由于在IE中不能够打开列表, 所以我们是用for in进行遍历
兼容方式:
var e = e || window.event
总结:
在DOM0级事件中
在IE中没有将事件对象传递到事件函数中
在高级浏览器中,可以将事件对象传递到事件函数中
this指向触发事件对象
在DOM2级事件绑定方式中:
事件对象可以传递到事件函数中
this指向触发事件的对象
在attachEvent事件中:
事件对象可以传递到事件函数中
this指向window
快捷尺寸
clientWidth、 clientHeight
总结:
clientWidth、clientHeight包含的是: content + padding
#box{width:560px;heigth:300px;padding:10px;border:10px soild blue;}<div id="box"></div>// 添加onload事件
window.onload = function() {console.log("clinetWidth的值是:", box.clientWidth);console.log("clientHeight的值是:", box.clientHeight);
}
offsetWidth、offsetHeight
总结:
clientWidth、clientHeight包含的是: content + padding+border
#box{width:560px;heigth:300px;padding:10px;border:10px soild blue;}<div id="box"></div>// 添加onload事件
window.onload = function() {console.log("offsetWidth的值是:", box.offsetWidth);console.log("offsetHeight的值是:", box.offsetHeight);
}
clientLeft、 clientTop 边框厚度
#box{width:560px;heigth:300px;padding:10px;border:10px soild blue;}<div id="box"></div>// 添加onload事件
window.onload = function() {console.log("clientLeft的值是:", box.clientLeft);console.log("clientTop的值是:", box.clientTop);
}
定位父元素offsetParent与定位值
指向子绝父相中的“父”
它不一定是该元素parentNode
<div id="box"><span>box</span><div id="box1"><span>box1</span><!-- 此时, box2是相对于box进行定位,该元素的parentNode是box1--><div id="box2"><span>box2</span></div></div>
</div>
定位值: offsetLeft offsetTop
元素的定位值也是经常要使用的值,所以在DOM中也提供了相应的属性用于快速获取
该属性存在兼容性的问题:
在高级浏览器中, 是从子元素的边框外到父元素的边框内
在IE中,从子元素的边框外到父元素的边框外
javascript中Doom操作方法总结相关推荐
- JavaScript中 DOM操作方法
DM是(Document Object Model)的简称. 一.找元素 document.getElementById() 根据id选择器找,最多找一个: document.getElemen ...
- set集合判断集合中是否有无元素_一文了解 JavaScript 中的 Set(集合)- 对 Set 的扩展...
阅读全文需要 4 分钟.主要介绍对 ES6 中的 Set 集合方法的扩展.阅读本文后,你能创建出对 Set 方法扩展,并且结合下期内容,将其发布到 NPM 中. 往期回顾 一文了解 JavaScrip ...
- 详解Javascript中的Array对象
本文地址:http://luopq.com/2016/04/01/Array-in-Javascript/,转载请注明 在上一篇文章中,我们详细介绍了Object对象.在这一篇文章中,我们来说说Arr ...
- JavaScript 中 Property 和 Attribute 的区别
转自:http://www.cnblogs.com/elcarim5efil/p/4698980.html property 和 attribute非常容易混淆,两个单词的中文翻译也都非常相近(pro ...
- javascript中sessionStorage 、localStorage 和 Cookie
javascript中sessionStorage .localStorage 和 Cookie 欢迎访问我的博客,祝码农同胞们早日走上人生巅峰,迎娶白富美~~~ 参考文章:JS 详解 Cookie. ...
- JavaScript中string与number
JavaScript中string与number string字符串 将一个值使用'单引号或者"双引号,引用起来就是字符串. ES6提供了反引号定义一个字符串,可以支持多行,还支持插值. l ...
- php中setinterval,javascript中setInterval的用法
javascript中的setInterval的函数主要是在制作动画或其他间隔性渲染(操作)效果时,对操作方法按照一定时间间隔进行调用的函数. setInterval的表达式格式主要有: setInt ...
- 浅析 JavaScript 中的 函数 uncurrying 反柯里化
柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果. 因此柯里化的过程是 ...
- JavaScript中,this的绑定规则
对于 JavaScript 新手来说,this 是非常基础同时也难以理解的知识点. 比如下面的代码,this 指向就有三种方式. 在<你不知道的 JavaScript>一书中,我总算比较清 ...
最新文章
- sql server登录名、服务器角色、数据库用户、数据库角色、架构区别联系
- 用Python构建网页抓取器
- Atitit.png 图片不能显示 php环境下
- NYOJ 837 Wythoff Game
- docker 上关于hyper-v和wsl2的一些要点
- android data binding jetpack III 绑定一个方法
- 集中式 vs 分布式 版本控制
- [转载] Python之Numpy模块中的方法详解
- 第一个Java程序示例——Hello World!【转】
- 基于bert的阅读理解脚本(run_squad)原理梳理(从举例的角度说明)
- HitPaw Screen Recorder(电脑屏幕录制软件)官方中文版V2.0.1.6 | 含直播和微课制作功能 | 电脑屏幕录制软件哪个好用?
- 微pe怎么装linux系统,微PE工具箱增加安装Linux系统菜单
- 主板检测卡c5_计算机主板检测卡检测显示C5是哪的問題?
- 重新认识JavaScript面向对象: 从ES5到ES6
- 长连接如何转换为短连接格式呢?
- matlab自学入门
- codeblocks20版本无法找到编译器的解决方法!
- PLC控制技术与组态技术实训装置
- pickle.load()和pickle.dump()
- stm32f105同时使用can1和can2问题