JS高级语法与JS选择器

 


元素(element)和节点(node)#

childNode属性和children属性的区别#

childNodes属性返回的是NodeList数组,是属于节点(也包括元素)的属性,而children属性返回的是子元素,是属于元素的属性

而在Nodelist数组里面也有元素存在,证明了元素也是节点的一种,即元素节点。

W3C中的解释是:

1
2
3
4
5
6
7
在 HTML DOM (文档对象模型)中,每个部分都是节点
 
文档本身是文档节点
所有 HTML 元素是元素节点
所有 HTML 属性是属性节点
HTML 元素内的文本是文本节点 (包括回车符,空格,空白字符也是属于文本节点)
注释是注释节点

Element 对象可以拥有类型为元素节点、文本节点、注释节点的子节点。

NodeList 对象表示节点列表,比如 HTML 元素的子节点集合。

元素也可以拥有属性。属性是属性节点。
总结:元素是元素节点,是节点中的一种,但元素节点中可以包含很多的节点

nodeName(纯大写) 属性含有某个节点的名称#

1
2
3
4
5
6
7
8
元素节点的nodeName 是标签名称
属性节点的nodeName 是属性名称
文本节点的nodeName 永远是 #text
文档节点的nodeName 永远是 #document
<br>nodeValue
对于文本节点,nodeValue 属性包含文本。
对于属性节点,nodeValue 属性包含属性值<br>
nodeValue 属性对于文档节点和元素节点是不可用的 

nodeType 属性可返回节点的类型#

添加和删除节点(HTML 元素)#

创建新的 HTML 元素#

如需向 HTML DOM 添加新元素,您必须首先创建该元素(元素节点),然后向一个已存在的元素追加该元素

删除已有的 HTML 元素#

如需删除 HTML 元素,您必须首先获得该元素的父元素

常用节点操作#

事件#

on事件绑定方式#

1
2
3
document.onclick = function() {
console.log("文档点击");
}

on事件只能绑定一个方法,重复绑定保留最后一次绑定的方法

1
2
3
document.onclick = function() {
console.log("文档点击");
}

事件的移除

1
document.onclick = null;

非on事件绑定方式#

1
2
3
4
5
6
document.addEventListener('click', function() {
console.log("点击1");
})<br>
document.addEventListener('click', function() {
console.log("点击2");
})

非on事件可以同时绑定多个方法,被绑定的方法依次被执行
addEventListener第三个参数(true|false)决定冒泡的方式

1
2
function fn () {}
document.addEventListener('click', fn);

事件的移除
document.removeEventListener('click', fn,false);

事件的三种绑定方式的思考#

实例运用一#

实例运用二#

事件参数event#

存放事件信息的回调参数

在触发DOM上某个事件时,会产生一个事件对象event,这个对象包含着所有事件有关的信息(导致事件的元素、事件的类型、与特定事件相关的信息)
所有浏览器都支持Event对象,但支持方式不同
IE中的事件对象:window.event

事件注意点#

处理冒泡与默认事件#

事件的冒泡:父子都具有点击事件,不处理的话,点击子级也会出发父级的点击事件

1
2
3
4
5
6
如果提供了事件对象,则这是一个非IE浏览器
if ( e && e.stopPropagation )
因此它支持W3C的stopPropagation()方法
e.stopPropagation();
else
否则,我们需要使用IE的方式来取消事件冒泡 <br>window.event.cancelBubble = true;<br>return false;

处理冒泡实例

事件默认行为:当一个事件发生时浏览器自己会做的事情

处理默认事件实例

再补充一些

默认操作 具体指的是什么呢?
(1)把单击事件处理程序注册到一个锚元素,而不是一个外层的<div>上,那么就要面对另外一个问题:当用户单击链接时,浏览器会加载一个新页面。

(2)当用户在编辑完表单后按下回车键时,会触发表单的submit事件,在此事件发生后,表单提交才会真正发生。
这种行为与我们讨论的事件处理程序不是同一个概念,它是单击标签元素的默认操作。

如果我们不希望执行这种默认操作,那么在事件对象上调用.stopPropagation()方法也无济于事,因为默认操作不是在正常的事件传播流中发生的
在这种情况下,处理方法有:

常见事件#

鼠标事件#

over | out   VS   enter | leave#

键盘事件#

表单事件#

1
2
3
4
5
6
onfocus:获取焦点
onblur:失去焦点
onselect:文本被选中
oninput:值改变
onchange:值改变,且需要在失去焦点后才能触发
onsubmit:表单默认提交事件

文档事件#

1
2
3
文档事件由window调用
onload:页面加载完毕触发
onbeforeunload:页面退出或刷新警告,需要设置回调函数返回值,返回值随意

图片事件 #

1
onerror:图片加载失败

页面事件#

1
2
3
onscroll:页面滚动
onresize:页面尺寸调整
window.scrollY:页面下滚距离

文档页面事件运用实例#

JS选择器#

getElement系列#

通过id名获取唯一满足条件的页面元素

通过class名获取所有满足条件的页面元素

通过name属性获取元素

通过tag名获取所有满足条件的页面元素

querySelect系列#

获取第一个匹配到的页面元素

1
2
document.querySelector('css语法选择器');
该方法可以由document及任意页面对象调用 

获取所有匹配到的页面元素

1
2
3
4
document.querySelectorAll('css语法选择器');
该方法可以由document及任意页面对象调用
返回值为NodeList (一个类数组结果的对象,使用方式同数组)
没有匹配到任何结果返回空NodeList对象 ([])

id名#

可以通过id名直接获取对应的页面元素对象,但是不建议使用

js选择器运用实例

选择器分类#

闭包#

闭包目的:不允许提升变量作用域时,该函数的局部变量需要被其他函数使用
闭包本质:函数的嵌套,内层函数称之为闭包
闭包的解决案例:①影响局部变量的生命周期,持久化局部变量;②解决变量污染

循环绑定#

.html文件

1
2
3
4
5
<ul>
<li>列表项</li>
<li>列表项</li>
<li>列表项</li>
</ul>

.js文件

1
2
3
4
5
6
7
var lis = document.querySelector('li');
for (var i = 0; i < lis.length; i++) {
lis[i].onclick = function () {
// 打印列表项的索引
console.log(i);
}
}

会发生变量污染

解决方法

1 获取局部作用域解决   2  闭包解决  3  对象属性解决

面向对象JS#

属性与方法#

1
var obj = {}; | var obj = new Object();

属性

1
obj.prop = "";

方法

1
obj.func = function () {}

删除属性与方法

1
2
delete obj.prop
delete obj.func

属性和方法实际使用

JS中中括号([ ])与 .#

1
2
3
4
中括号运算符总是能代替点运算符。但点运算符却不一定能全部代替中括号运算符
中括号运算符可以用字符串变量的内容作为属性名。点运算符不能
中括号运算符可以用纯数字为属性名。点运算符不能
中括号运算符可以用js的关键字和保留字作为属性名。点运算符不能

下面的例子中,a.b表示对象a的属性b,既可以设置也可以读取

1
object[key]=>key为常量时,object[key]等价于object.key,例如:a.b == a['b']

特殊的,object[key] 中key为变量时,只能用中括号形式

标识符是否合法对两种用法的影响

总结:常量用点,变量就用中括号

运算符左侧应当是一个表达式,它返回一个对象。
对于点(.)来说,右侧必须是一个以属性名称命名的简单标识符。
对于方括号([])来说,方括号里必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字

当通过点运算符(.)方法对象属性时,属性名用一个标识符来表示。标识符必须直接出现在js程序中,它们不是数据类型,因此程序无法修改它们。
反过来讲,当通过[]来方式对象的属性时,属性名通过字符串表示。字符串是js的数据类型,在程序运行时可以修改和创建它们

1
2
3
4
5
6
<script type="text/javascript">
var addr = "";
for(i=0;i<4;i++){
addr += cutomer["address" + i] + "\n";
}
</script>

这段代码读取customer对象的address0,adddress1,address2,adddress3属性,并将他们连接起来

类字典结构使用#

结构

1
var dict = {name: "zero", age: 18}

拓展

1
var dict = {"my-name": "zero", fn: function () {}, fun () {}}

使用

1
dict.name | dict["my-name"] | dict.fn()

构造函数(ES5)#

类及继承(ES6)#

 

posted @   鲸鱼的海老大  阅读(2050)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
CONTENTS