【前端面试】二、DOM和BOM

目录

DOM和BOM

1. BOM属性对象方法

2. 事件流

3. 事件委托

4. 事件监听

5. mouseover和mouseenter的区别


DOM和BOM

文档对象模型(DocumentObjectModel,简称DOM),是W3C组织推荐的处理可扩展标志语言的标准编程接口。在网页上,组织页面(或文档)的对象被组织在一个树形结构中,用来表示文档中对象的标准模型就称为DOM。关于dom的api有什么参考回答:节点创建型api,页面修改型API,节点查询型API,节点关系型api,元素属性型api,元素样式型api等

1. BOM属性对象方法

location对象:

  • location.href--返回或设置当前文档的URL
  • location.search--返回URL中的查询字符串部分。例如http://www.dreamdu.com/dreamdu.php?id=5&name=dreamdu返回包括(?)后面的内容?id=5&name=dreamdu
  • location.hash--返回URL#后面的内容,如果没有#,返回空
  • location.host--返回URL中的域名部分,例如www.dreamdu.com
  • location.hostname--返回URL中的主域名部分,例如dreamdu.com
  • location.pathname--返回URL的域名后的部分。例如http://www.dreamdu.com/xhtml/返回/xhtml/
  • location.port--返回URL中的端口部分。
  • location.protocol--返回URL中的协议部分。
  • http:location.assign--设置当前文档的URL
  • location.replace()--设置当前文档的URL,并且在history对象的地址列表中移除这URLlocation.replace(url);
  • location.reload()--重载当前页面

history对象:

  • history.go()--前进或后退指定的页面数history.go(num);
  • history.back()--后退一页
  • history.forward()--前进一页

Navigator对象:

  • navigator.userAgent--返回用户代理头的字符串表示(就是包括浏览器版本信息等的字符串)
  • navigator.cookieEnabled--返回浏览器是否支持(启用)cookie

参考文献:DOM的三个级别_一只小废物变小怪物的博客-CSDN博客

2. 事件流

事件流:HTML与js交互是通过事件驱动实现,事件流描述的是从页面中接收事件的顺序

事件发生的三个阶段:

  • 事件捕获:事件从Document节点自上而下向目标节点传播的阶段
  • 目标阶段:真正的目标节点正在处理事件的阶段
  • 冒泡阶段:事件从目标节点自下而上向Document节点传播的阶段 ;浏览器默认冒泡,focus/blur不支持冒泡,可根据event.bubbles判断事件是否支持冒泡

事件模型常用方法:

event.stopPropagation:阻止捕获和冒泡阶段中当前事件的进一步传播

event.stopImmediatePropagation:阻止调用相同事件的其他侦听器,阻止冒泡

event.preventDefault:取消该事件而不停止事件的进一步传播,阻止事件的默认行为

event.target:指向事件触发的元素,在事件冒泡过程中这个值不变

event.currentTarget:指向事件绑定的元素

事件执行顺序:

DOM标准事件模型中,先捕获后冒泡

如果DOM节点同时绑定了两个事件监听函数,一个用于捕获,一个用于冒泡,绑定在被点击元素的事件是按照代码添加顺序执行的

要实现先冒泡后捕获,对于同一个事件监听捕获和冒泡,分别对应相应的处理函数,监听到捕获事件先暂缓执行,直到冒泡事件被捕获后再执行捕获事件

阻止冒泡:

let sonEl = document.querySelector('.son')
let fatherEl = document.querySelector('.father')
sonEl.addEventListener("click", (event) => {
    console.log('son事件');
    // event.stopPropagation() // 阻止事件冒泡,'father事件'将不会打印
}, true) // true在事件捕获执行,false在事件冒泡执行
fatherEl.addEventListener("click", () => {
    console.log('father事件');
})

3. 事件委托

原理:将当前节点上的事件绑定在父节点上进行事件监听,通过事件冒泡处理子事件,event.target.nodeName判断事件触发元素。减少事件绑定和内存消耗,提高程序性能,尤其在动态添加子元素的时候。

应用场景:大量同级元素添加同一类事件,动态绑定事件。比如需要为动态列表的每个列表项都添加点击事件,ul 上绑定事件来监听 li

事件代理在捕获阶段的实际应用:在父元素阻止事件向子元素传播,也可代替子元素执行某些操作

// 通过event.target获取点击的哪一个li
let ul = document.querySelector('ul');
ul.onclick = (event) => {
    event = event || window.event;
    if(event.target.nodeName == 'LI') {
        alert(event.target.innerHTML)
    }
}

let btn =document.querySelector('#btn');
btn.onclick = () => {
    let li = document.createElement('li');
    li.textContent = ul.children.length;
    ul.appendChild(li)
}

4. 事件监听

addEventListener(event,function,useCapture):event指定事件名;function指定事件触发时执行的函数;useCapture指定事件是否在捕获(true)或冒泡(false)阶段执行

5. mouseover和mouseenter的区别

mouseover:当鼠标移入元素或子元素都会触发事件,会冒泡,对应mouseout

mouseenter:当鼠标移入元素本身(不含元素子元素)触发事件,不会冒泡,对应mouseleave

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值