Dom、事件


问答


  • dom对象的innerText和innerHTML有什么区别?

innerHTML:
  从对象的起始位置到终止位置的全部内容,包括Html标签。
 “<span style="color:red">test1</span> test2 ”
test.innerText:
  从起始位置到终止位置的内容, 但它去除Html标签
  上例中的text.innerTest的值也就是“test1 test2”, 其中span标签去除了。


  • elem.children和elem.childNodes的区别?

elem.children
属性返回一个动态的HTMLCollection集合,由当前节点所有的Element子节点组成;
elem.childNodes
返回一个NodeList对象(类数组对象),包括但不限于Element节点,还包括Text节点(换行,空格)和
注释节点。


  • 查询元素有几种常见的方法?
  • 1.getElementById()
    getElementById方法返回匹配指定ID属性的元素节点。如果没有发现匹配的节点,则返回null。这也是获取一个元素最快的方法
    var elem = document.getElementById("test");

  • getElementsByClassName()
    getElementsByClassName方法返回一个类似数组的对象(HTMLCollection类型的对象),包括了所有class名字符合指定条件的元素(搜索范围包括本身),元素的变化实时反映在返回结果中。这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。

  • var elements = document.getElementsByClassName(names);
    getElementsByClassName方法的参数,可以是多个空格分隔的class名字,返回同时具有这些节点的元素。

  • getElementsByTagName()
    getElementsByTagName方法返回所有指定标签的元素(搜索范围包括本身)。返回值是一个HTMLCollection对象,也就是说,搜索结果是一个动态集合,任何元素的变化都会实时反映在返回的集合中。这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。

  • var paras = document.getElementsByTagName("p");
    上面代码返回当前文档的所有p元素节点。注意,getElementsByTagName方法会将参数转为小写后,再进行搜索。

  • getElementsByName()
    getElementsByName方法用于选择拥有name属性的HTML元素,比如form、img、frame、embed和object,返回一个NodeList格式的对象,不会实时反映元素的变化。

  • // 假定有一个表单是<form name="x"></form> var forms = document.getElementsByName("x"); forms[0].tagName // "FORM"
    注意,在IE浏览器使用这个方法,会将没有name属性、但有同名id属性的元素也返回,所以name和id属性最好设为不一样的值。

  • querySelector()
    querySelector方法返回匹配指定的CSS选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。如果没有发现匹配的节点,则返回null。

var el2 = document.querySelector('#myParent > [ng-click]');```
querySelector方法无法选中CSS伪元素。

  • querySelectorAll()
    querySelectorAll方法返回匹配指定的CSS选择器的所有节点,返回的是NodeList类型的对象。NodeList对象不是动态集合,所以元素节点的变化无法实时反映在返回结果中。

  • elementList = document.querySelectorAll(selectors);
    querySelectorAll方法的参数,可以是逗号分隔的多个CSS选择器,返回所有匹配其中一个选择器的元素。
    var matches = document.querySelectorAll("div.note, div.alert");
    上面代码返回class属性是note或alert的div元素。

  • elementFromPoint()
    elementFromPoint方法返回位于页面指定位置的元素。

  • var element = document.elementFromPoint(x, y);
    上面代码中,elementFromPoint方法的参数x和y,分别是相对于当前窗口左上角的横坐标和纵坐标,单位是CSS像素。
    elementFromPoint方法返回位于这个位置的DOM元素,如果该元素不可返回(比如文本框的滚动条),则返回它的父元素(比如文本框)。如果坐标值无意义(比如负值),则返回null。


  • 如何创建一个元素?如何给元素设置属性?

可以通过createElement()方法创建新的HTML元素节点;通过setAttribute()方法设置元素属性。
var newDiv=document.createElement('div'); newDiv.setArrribute('class','wrap');


  • 元素的添加、删除?
<body>
  <h1>What to buy</h1>
  <p>Don't forget to buy this stuff.</p>
  <ul id="purchases">
    <li>A tin of beans</li>
    <li class="sale">Cheese</li>
    <li class="sale important">Milk</li>
  </ul>
  <script type="text/javascript">
    var newLi = document.createElement('li');             // 创建新的 li 元素节点
    var oldLi = document.querySelector('.important');     // 获取需要删除的元素节点
    var newContent = document.createTextNode('Apple')     // 创建新的内容节点
    var ul = document.getElementById('purchases');        // 获取需要添加位置的父元素节点
    ul.removeChild(oldLi);                                // 从父节点上删除子节点
    newLi.appendChild(newContent);                        // 将内容节点添加到新的 li 节点上
    newLi.setAttribute('class','sale');                   // 给新的 li 节点添加 class 属性
    ul.appendChild(newLi);                                // 将 newLi 添加到 HTML 内
  </script>
</body>

  • DOM0 事件和DOM2级在事件监听使用方式上有什么区别?

  • DOM0事件是将时间作为元素的一个属性,当需要对事件进行监听时,只要将需要执行的函数赋值给这个属性即可,需要删除该事件监听是只需将该属性的值改为null即可;该方法操作直观简便,兼容性最好,但一个事件只能绑定一个函数。

// HTML
var btn = document.querySelector('#btn');
// JS
btn.onclick = function() {
  console.log('DOM0');
}
  • DOM2级事件是使用元素的addEventListener和removeEventListener方法对事件进行监听,事件类型和处理函数做为上述方法的参数,其中addEventListener方法只能通过removeEventListener取消。该方法可以为一个事件绑定多个函数。
// HTML
var btn = document.querySelector('#btn');
// JS
btn.addEventListener('click', function(){
  console.log('DOM2');
})

  • attachEvent与addEventListener的区别?
  • addEventListener对IE8 及之前的版本不兼容,只能用attachEvent对事件进行监听,同时,监听事件的取消也只能用detachEvent实现而不能使用removeEventListener。
  • attachEvent添加的事件处理程序只能发生在事件冒泡过程中,而addEventListener的第三个参数可以决定事件处理程序是在捕获阶段还是在冒泡阶段处理,一般浏览器默认发生在冒泡阶段(即第三个参数默认为false);
  • addEventListener方法第一个参数是事件类型(如click、load),而attachEvent的第一个参数是事件名称(如onclick、onload);
  • 二者事件处理程序的作用域不同。addEventListener事件的作用域是元素本身,而attachEvent的事件处理程序会在全局作用域内运行;
  • 为一个事件添加多个事件处理程序时,执行顺序不同。addEventListener会按照处理程序添加的顺序执行,而attachEvent执行多个事件处理程序的顺序没有规律。

  • 解释IE事件冒泡和DOM2事件传播机制?
  • IE事件冒泡机制中事件最开始是由最具体的元素接收,逐层往上向其祖先元素进行传播,其祖先元素可以在此过程中接收事件并引发事件处理程序;
  • DOM2事件传播在根节点到事件发生的具体元素过程中提供了截取事件的机会,然后则是冒泡机制。

  • 如何阻止事件冒泡? 如何阻止默认事件?

通过stopPropagation()方法可以阻止事件冒泡;
e.stopPropagation() IE e.cancelBubble = true;

通过preventDefault()可以阻止默认事件。
e.preventDefault() IE e.returnValue = false;


代码


  • 有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容
<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<script>
//todo ...
</script>

  • 补全代码,要求:
    • 当点击按钮开头添加时<li>这里是</li>元素前添加一个新元素,内容为用户输入的非空字符串;当点击结尾添加时在<li>前端6班</li>后添加用户输入的非空字符串.
    • 当点击每一个元素li时控制台展示该元素的文本内容。
<ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端6班</li>
</ul>
<input class="ipt-add-content" placeholder="添加内容"/>
<button id="btn-add-start">开头添加</button>
<button id="btn-add-end">结尾添加</button>
<script>
//todo ...
</script>
  • 补全代码,要求:当鼠标放置在li元素上,会在img-preview里展示当前li元素的data-img对应的图片。
<ul class="ct">
    <li data-img="1.png">鼠标放置查看图片1</li>
    <li data-img="2.png">鼠标放置查看图片2</li>
    <li data-img="3.png">鼠标放置查看图片3</li>
</ul>
<div class="img-preview"></div>
<script>
//todo ...
</script>
  • 实现如下图Tab切换的功能


  • 实现下图的模态框功能


代码预览:
代码1
代码2
代码3
代码4
代码5


              本文版权归作者饥人谷_Josh和饥人谷所有,转载请注明来源
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,104评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,816评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,697评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,836评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,851评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,441评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,992评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,899评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,457评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,529评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,664评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,346评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,025评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,511评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,611评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,081评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,675评论 2 359

推荐阅读更多精彩内容