1.利用冒泡和不利用冒泡的差别

答案:

1.绑定位置不同:不利用冒泡绑定在目标元素上,利用冒泡绑定在父元素上.

2.监听对象的个数不同:不利用冒泡会反复创建多个监听,利用冒泡始终只有

一个监听.

3.动态生成元素:不利用冒泡无法自动获得事件处理函数,必须反复绑定

利用冒泡可让动态添加的子元素自动获得父元素的处理函数,无需反复绑定.

2.按HTML查找和按选择器查找的差别

答案:

1.返回值不同:按HTML查找返回动态集合,按选择器查找返回非动态集合

2.效率不同:按HTML查找效率高,按选择器查找效率低

3.易用性不同:当条件复杂时,按HTML查找繁琐,而按选择器查找简单

3.列举DOM中常用优化

答案:

1.查找时,如果只用一个条件就可查询出结果时,优先选择易用的按选择器查找.

2.添加时,尽量减少操作DOM树的次数,减少重排重绘。如果同时添加父元素和子元素,

应先将子元素添加到父元素,最后再将父元素添加到DOM树。如果添加多个平级子元素,

则应先将子元素添加到文档片段,最后,再将文档片段添加到DOM树.

3.修改时,尽量减少重排重绘。如果同时修改多个元素的内容和样式。应使用class批量修改样式.

4.事件绑定时,应尽量利用冒泡减少事件监听的个数.

4.如何鉴别浏览器的名称和版本号

答案:

var browser,version,ua=navigator.userAgent;

if(ua.indexOf("IE")!=-1)       browser="IE"

else if(ua.indexOf("Edge")!=-1)     browser="Edge"

else if(ua.indexOf("Firefox")!=-1)  browser="Firefox"

else if(ua.indexOf("OPR")!=-1)      browser="OPR"

else if(ua.indexOf("Chrome")!=-1)   browser="Chrome"

else if(ua.indexOf("Safari")!=-1)   browser="Safari"

else if(ua.indexOf("Trident")!=-1)  browser="IE",version=11;

document.write(`<h1>${browser}</h1>`);

if(version===undefined){

//截取: 从浏览器名称所在位置,再跳过浏览器名称长度+1 之后的3位

var i=ua.indexOf(browser);

i+=browser.length+1;

version=parseFloat(ua.slice(i,i+3))

}

document.write(`<h1>${version}</h1>`);

5.为按钮绑定事件,实现事件节流:

答案:

//节流

var  canClick=true;

btn.onclick=function(){

if(canClick){

canClick=false;

consoe.log("发送ajax请求,加载更多...");

setTimeout(function(){

console.log("请求完成!");

canClick=true;

},3000)

}

}

6.为页面绑定滚动事件,实现事件防抖:

答案:

//防抖

var  timer1;

window.onscroll=function(){

if(timer1!==undefined){

clearTimeout(timer1);

}

timer1=setTimeout(function(){

console.log("发送ajax请求,加载更多");

timer1=undefined;

},200)

}

7.DOM元素e的e.getAttribute(propName)和e.propName有什么区别和联系?

答案:

e.getAttribute(),是标准DOM操作文档元素属性的方法,具有通用性可在任意

文档上使用,返回元素在源文件中设置的属性

e.propName通常是在HTML文档中访问特定元素的特性,浏览器解析元素后生成

对应对象(如 a标签生成HTMLAnchorElement),这些对象的特性会根据特定规则

结合属性设置得到,对于对应特性的属性,只能使用getAtrribute进行访问

-   e.getAttribute()返回值是源文件中设置的值,类型是字符串或者 null(有的实现返回"")

-   e.propName 返回值可能是字符串、布尔值、对象、undefined 等

-   大部分 attribute 与 property 是一一对应关系,修改其中一个会影响另一个,如 id,title 等属性

-   一些布尔属性`<input hidden/>`的检测设置需要 hasAttribute 和 removeAttribute 来完成,或者设置对应 property

-   像`<a href="../index.html">link</a>`中 href 属性,转换成 property 的时候需要通过转换得到完整 URL

-   一些 attribute 和 property 不是一一对应如:form 控件中`<input value="hello"/>`对应的是 defaultValue,修改或设置 value property 修改的是控件当前值,setAttribute 修改 value 属性不会改变 value property

8.如何最小化重绘(repaint)和回流(reflow)?

答案:

-   需要对元素进行复杂擦欧洲哦时,可以先隐藏(display:"none"),操作完成后再显示.

-   需要创建多个DOM节点时,使用DocumentFragment创建完之后一次性的加入documnet

-   缓存Layout属性值,如:var  left =elem.offsetLeft;

这样,多次使用left产生一次回流

-   尽量避免用table布局(table元素一旦触发回流就会导致table里所有的其他元素回流)

-  避免使用css表达式(expression),因为每次调用都会重新计算值(包括加载页面)

-  尽量使用css属性简写,如:用border代替border-width,border-style,border-color

-  批量修改元素样式:elem.style.xxx

9.描述一下DOM事件模型:

答案:捕获、目标触发、冒泡

捕获阶段:由外向内,依次记录各级父元素上的事件处理函数。

只记录,暂不触发。

目标触发:优先触发目标元素上的事件处理函数。

冒泡:由内向外,依次触发各级父元素上的事件处理函数.

10.谈谈事件委托/代理:

答案:事件委托是指将事件绑定目标元素的父元素上,利用冒泡机制触发该事件.

优点:

-  可以减少事件注册,节省大量内存占用

-  可以将事件应用于动态添加的子元素上

缺点:使用不当会造成事件在不应该触发时触发

示例:

js

url.addEventListener('click',function(e){

var  target =event.target ||  event.srcElement;

if(!!target  && target.nodeName.toUpperCase() === "LI"){

console.log(target.innerHTML);

}

},false);

11.IE的事件处理和W3C的事件处理有哪些区别?

答:

绑定事件

-   W3C: targetEl.addEventListener('click', handler, false);

-   IE: targetEl.attachEvent('onclick', handler);

删除事件

-   W3C: targetEl.removeEventListener('click', handler, false);

-   IE: targetEl.detachEvent(event, handler);

事件对象

-   W3C: var e = arguments.callee.caller.arguments[0]

-   IE: window.event

事件目标

-   W3C: e.target

-  IE:window.event.srcElement

阻止事件默认行为

-  W3C:e.preventDefault()

-   IE:window.event.returnValue =false

阻止事件传播

-   W3C:e.stopPropagation()

-   IE:window.event.cancelBubble = true

12.前端优化的方法:

答案:

1.减少dom操作

2.部署前,图片压缩,代码压缩

3.优化js代码结构,减少冗余代码

4.减少HTTP请求,合理设置HTTP缓存

5.使用内容分发cdn加速

6.静态资源缓存

7.图片延迟加载

DOM面试题的更多相关文章

  1. DOM+面向对象面试题

    1.dom常见的节点类型---------------------------解彬1510-B 1.nodeType------节点类型,元素节点是1,文本节点是3. 2.firstChild---- ...

  2. JavaScript与DOM常见面试题

    1. JavaScript 1.1.简要描述 JavaScript的数据类型? 参考答案: Java Sc ri pt 的数据类型可以分为原始类型和对象类型.原始类型包括 string. number ...

  3. JS中 【“逻辑运算”,“面试题:作用域问题”,“dom对象”】这些问题的意见见解

    1.逻辑运算 ||  &&  ! ||:遇到第一个为true的值就中止并返回 &&:遇到第一个为false的值就中止并返回,如果没有false值,就返回最后一个不是fa ...

  4. 经典面试题:一张表区别DOM解析和SAX解析XML

                                                                                 ============DOM解析    vs ...

  5. DOM、事件面试题

    1.DOM 事件级别有哪些? DOM0 a. 通过定义执行函数 element.onclick = function (){ } b. 直接在标签中添加执行语句 Onclick = '语句' 优点:很 ...

  6. 从八道面试题看JavaScript DOM事件机制

    As we all know,事件机制其实很简单,无非冒泡和捕获这两点,笔者不再赘述,网上相关文章一大堆,下面让我们直接看面试题 题目一到七,统一设置css .test2 { height: 50px ...

  7. JavaScript,DOM经典基础面试题

    JavaScript的数据类型 JavaScript的数据类型可以分为原始类型和对象类型 原始类型包括string,number和Boolean三种,其中字符串是使用一对单引号或者一堆双引号括起来的任 ...

  8. [Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)

    如若转载请注明出处: http://www.cnblogs.com/wang-meng/p/5898837.html   谢谢.上一篇发了一个找工作的面经, 找工作不宜, 希望这一篇的内容能够帮助到大 ...

  9. 也许你需要点实用的-Web前端笔试题

    之前发的一篇博客里没有附上答案,现在有空整理了下发出来,希望能帮助到正在找工作的你,还是那句话:技术只有自己真正理解了才是自己的东西,共勉. Web前端笔试题 Html+css 1.对WEB标准以及w ...

随机推荐

  1. sql注入notebook

    内容来自: https://ca0y1h.top/ 联合查询注入 使用场景 页面上有显示位 什么是显示位:在一个在一个网站的正常页面,服务端执行SQL语句查询数据库中的数据,客户端将数据展示在页面中, ...

  2. QIntValidator没有最小值的限制,继承然后写个新类来控制最小值

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/firecityplans/article ...

  3. Synchronous and Asynchronous I/O [Windows]

    There are two types of input/output (I/O) synchronization: synchronous I/O and asynchronous I/O. Asy ...

  4. Spring boot自定义parent POM

    文章目录 概述 不使用Parent POM来引入Spring boot 覆盖依赖项版本 概述 在之前的Spring Boot例子中,我们都会用到这样的parent POM. <parent> ...

  5. 事件总线功能库,Reface.EventBus 详细使用教程

    Reface.AppStarter 中的事件总线功能是通过 Reface.EventBus 提供的. 参考文章 : Reface.AppStarter 框架初探 使用 Reface.EventBus ...

  6. 使用sys模块写一个软件安装进度条

    import sys,time for i in range(50): sys.stdout.write('#') sys.stdout.flush() #强制刷新将内存中的文件写一条,输出一条. t ...

  7. docker中安装nginx,部署前端代码

    最近在学习docker,初次接触,难免遇到磕磕碰碰,遂将其整理成博客,以便日后查看. 1.拉取nginx镜像 直接从官方镜像库拉取简单粗暴: docker pull nginx 2.运行 docker ...

  8. mpvue开发微信小程序之时间+日期选择器

    最近在做微信小程序,技术栈为mpvue+iview weapp组件库. 因项目需求,要用到日期+时间选择器,iview组件库目前还未提供时间日期选择器的组件,小程序官方组件日期时间也是分开的,在简书上 ...

  9. 算法竞赛进阶指南--在单调递增序列a中查找小于等于x的数中最大的一个(即x或x的前驱)

    在单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱) while (l < r) { int mid = (l + r + 1) / 2; if (a[mid] <= x) ...

  10. POJ1088 滑雪题解+HDU 1078(记忆化搜索DP)

    Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...