任务22-Dom、事件(进阶8,进阶9,进阶10)

问答题

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

    答:
    innerText和innerHTML都是返回元素内容。
    区别:innerText返回的是元素文本内容,innerHTML返回的内容包含HTML标签和文本内容。

        <ul id="inner">
        <li>A tin of beans</li>
        <li>Cheese</li>
        <li>Milk</li>
    </ul>
    <script type="text/javascript">
    
        var n = document.getElementById("inner");
        console.log(n.innerText);
        console.log(n.innerHTML);
    
    </script>
    
Paste_Image.png
  • elem.children和elem.childNodes的区别?

    答:
    elem.children:获取指定元素的子元素列表,包含HTML元素节点。
    elem.childNodes:获取指定元素的子元素列表,包含HTML元素节、文本节点、注释节点。

        <ul id="inner">
        <li>A tin of beans</li>
        <li>Cheese</li>
        <li>Milk</li>
    </ul>
    <script type="text/javascript">
        var n = document.getElementById("inner");
        console.log(n.children);
        console.log(n.childNodes);
    </script>
    
Paste_Image.png

如果节点是元素节点,则 nodeType 属性将返回 1。
如果节点是文本节点,则 nodeType 属性将返回 3。

  • 查询元素有几种常见的方法?
    答:

    1. getElementById()
      返回匹配指定id属性的元素节点。如果没有找到匹配的节 点返回null。
     ```
      <ul id="inner">
      <li>A tin of beans</li>
      <li>Cheese</li>
      <li>Milk</li>
      </ul>
      <script type="text/javascript">
      var n = document.getElementById("inner");
      console.log(n.children);
      console.log(n.childNodes);
      </script>
     ```
    
    Paste_Image.png
    1. getElementsByClassName()
      返回一个类似数组的HTMLCollection对象,包括了所有class名字符合指定条件的元素,找不到返回一个空的类数组对象,还可以查找带有多个类名的元素,要指定多个类名,只要在参数中用空格分隔类名即可,这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。
        <ul id="inner">
        <li>A tin of beans</li>
        <li>Cheese</li>◊
        <li class="abc">Milk</li>
    </ul>
    <ol>
        <li class="list">1</li>
        <li class="list">2</li>
        <li class="list">3</li>
    </ol>
    <div class="box box-1">abc</div>
    <script type="text/javascript">
    var n = document.getElementsByClassName("list");
    console.log(n);
    var m = document.getElementsByClassName("list1");
    console.log(m);
    var x = document.getElementsByClassName("box box-1");
    console.log(x);
    var i = document.getElementById("inner");
    var k = i.getElementsByClassName("abc");
    console.log(k);
    </script>
    
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-8177d99a489594c0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

     3. getElementsByTagName()
返回一个类似数组的HTMLCollection对象,包括所有指定标签的元素,找不到返回一个空的类数组对象,这个方法不仅可以在document对象上调用,也可以在任何元素节点上调用。
 
    ```
    <ul id="inner">
        <li>A tin of beans</li>
        <li>Cheese</li>◊
        <li>Milk</li>
    </ul>
    <ol>
        <li class="list">1</li>
        <li class="list">2</li>
        <li class="list">3</li>
    </ol>
    <div class="box box-1">abc</div>
    <script type="text/javascript">
    var n = document.getElementsByTagName("li");
    console.log(n);
    var m = document.getElementsByTagName("p");
    console.log(m);
    var i = document.getElementById("inner");
    var k = i.getElementsByTagName("li");
    console.log(k);
    </script>
Paste_Image.png
 4.  getElementsByName()
    用于选择拥有name属性的HTML元素,返回一个类数组的对象(NodeList),找不到返回一个空的类数组对象。方法与 getElementById() 方法相似,但是它查询元素的 name 属性,而不是 id 属性。
    
    ```
    <form action="xxx" method="get">
    <input type="text" name="username">
    <input type="text" name="username">
    <input type="text" name="username">
</form>
<script type="text/javascript">
var n = document.getElementsByName("username");
console.log(n);
var m = document.getElementsByName("hobby");
console.log(m);
</script>
``` 
Paste_Image.png
 5. querySelector()

    返回匹配指定的CSS选择器的元素节点。如果有多个节点满足匹配条件,则返回第一个匹配的节点。如果没有发现匹配的节点,则返回null。
    
   ```
  <ul id="list">
  <li class="number">1</li>
  <li>2</li>
  <li>3</li>
   </ul>
   <p class="number">5</p>
   <script type="text/javascript">
   var n = document.querySelector("#list");
   console.log(n);
   var m = document.querySelector(".number");
   console.log(m);
   var x = document.querySelector("#header");
   console.log(x);
   </script>
   ```
Paste_Image.png
 6. querySelectorAll()

    返回匹配指定的CSS选择器的所有节点,返回的是类数组的对象(NodeList),querySelectorAll方法的参数,可以是逗号分隔的多个CSS选择器,返回所有匹配其中一个选择器的元素,找不到返回一个空的类数组对象。
    
    ```
        <ul id="list">
        <li class="number">1</li>
        <li>2</li>
        <li>3</li>
    </ul>
    <p class="number">5</p>
    <div class="main"></div>
    <h1 class="header"></h1>
    <script type="text/javascript">
    var n = document.querySelectorAll("#list");
    console.log(n);
    var m = document.querySelectorAll(".number");
    console.log(m);
    var x = document.querySelectorAll("#header");
    console.log(x);
    var k = document.querySelectorAll(".main,.header");
    console.log(k);
    </script>
    ```
Paste_Image.png
 7. elementFromPoint()
 方法返回位于页面指定位置的元素。如果该元素不可返回(比如文本框的滚动条),则返回它的父元素(比如文本框)。如果坐标值无意义(比如负值),则返回null。
 
 ```
 <script type="text/javascript">
    var n = document.elementFromPoint(0,0);
    console.log(n);
    var m = document.elementFromPoint(-10,-10);
    console.log(m);
</script>
```
Paste_Image.png
  • 如何创建一个元素?如何给元素设置属性?
    答:
    创建元素:document.createElement('Tagname')
    设置属性:setAttribute(‘属性名’, ‘属性值’)

    var link = document.createElement('a');
    link.setAttribute('href','#');
    
  • 元素的添加、删除?

    答:
    元素添加:
    father.appendChild(new); 是在父元素节点的最后添加。

<div>
<p>
123
<span>456</span>
</p>
</div>
<script>
var p = document.querySelector('p');
var link = document.createElement('a');
link.setAttribute('href','#');
p.appendChild(link);
</script>
```


Paste_Image.png
father.insertBefore(new,tag); 是在父元素中的目标节点前添加。

```

<div>
<p>
123
<span>456</span>
</p>
</div>
<script>
var p = document.querySelector('p');
var link = document.createElement('a');
var div = document.querySelector('div');
link.setAttribute('href', '#');
div.insertBefore(link, p);
</script>
```


Paste_Image.png
元素删除:father.removeChild(tag); 在父元素中删除指定的目标节点元素。

```
<body>
<ul>
    <li>1</li>
    <li>2</li>
    <li>3</li>
</ul>
<script type="text/javascript">
var a = document.getElementsByTagName("ul")[0];
a.removeChild(a.children[1])
</script>

</body>

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-f33325ce7e29cb07.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



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

    答:
    1. DOM0 事件监听器无法处理多个事件(当在同一个元素上再添加一个监听事件时会覆盖之前的事件方法),DOM2 级事件监听器可以处理多个事件(事件列表)。
    2. DOM2 级 (addEventListener()) : 可以选择在捕获阶段触发事件或者在冒泡阶段触发事件。DOM0 无法选择。
    3. DOM0 不存在兼容性问题,DOM2 在 IE8 之前不支持。( IE 使用attachEvent(‘click’, func) )

* attachEvent与addEventListener的区别?

    答:
    * attachEvent是老版本IE浏览器上监听事件的方法,接受两个参数,第一个参数是事件类型,格式为”on+type”(onclick),第二个参数是事件处理程序函数。事件处理程序只能发生在冒泡阶段。
    * addEventListener是现代大多数逐渐主流浏览器(Chrome,firefox,safari)监听事件的方法,接受三个参数,第一个参数时事件类型,格式为”type”(click),第二个参数是事件处理程序函数,第三个参数是布尔值,默认为false(冒泡事件),true为捕获阶段事件。


* 解释IE事件冒泡和DOM2事件传播机制?

    答:
    * IE事件冒泡:事件发生后先从具体的接收元素,然后逐步向上传播到不具体的元素。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-b1c4fb664e77853f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    * DOM2事件传播机制:DOM2级事件规定事件流包括三个阶段,事件捕获阶段,处于目标阶段,事件冒泡阶段,首先发生的是事件捕获,为截取事件提供机会,然后是实际目标接收事件,最后是冒泡阶段。
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-18f8396c9d5fbcd8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)



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

    答:
    * 如何阻止事件冒泡:

        ```
        function stopPropagation(e) {
        if (e.stopPropagation)
        e.stopPropagation();
        else
        e.cancelBubble = true;//兼容IE浏览器
        }
        ```
        
        ```
        //没有阻止事件冒泡
        <body>
    <div id="box">
            <button id="btn">点我</button>
    </div>
    <script type="text/javascript">
        var box = document.querySelector("#box");
        var fun = function(){
            console.log(this.id);
        }
        var btn = document.querySelector("#btn");
        var fun1 = function(e){
            console.log('hello');
        }
        box.addEventListener('click',fun,false);
        btn.addEventListener('click',fun1,false);
    </script>
</body>
        ```
![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-4a71f54829bb1929.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

         ```
  <body>
      <div id="box">
              <button id="btn">点我</button>
      </div>
      <script type="text/javascript">
          var box = document.querySelector("#box");
          var fun = function(){
              console.log(this.id);
          }
          var btn = document.querySelector("#btn");
          var fun1 = function(e){
              console.log('hello');
              e.stopPropagation();
          }
          box.addEventListener('click',fun,false);
          btn.addEventListener('click',fun1,false);
      </script>
  </body>
         ```
  ![Paste_Image.png](http://upload-images.jianshu.io/upload_images/2858982-a6781952a43d7069.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

    * 阻止默认事件

        ```
    function preventDefault(e) {
    if (e.preventDefault)
       e.preventDefault();
    else
       e.returnValue = false;//兼容IE浏览器
    }
    ```

#代码题
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 单例模式 适用场景:可能会在场景中使用到对象,但只有一个实例,加载时并不主动创建,需要时才创建 最常见的单例模式,...
    Obeing阅读 2,112评论 1 10
  • 工厂模式类似于现实生活中的工厂可以产生大量相似的商品,去做同样的事情,实现同样的效果;这时候需要使用工厂模式。简单...
    舟渔行舟阅读 7,895评论 2 17
  • 问答 一、dom对象的innerText和innerHTML有什么区别? innerTextinnerText是一...
    婷楼沐熙阅读 427评论 0 0
  • 前情提要 早上刚来公司,先试试在模拟器上安装谷歌地图,新建了个arm的模拟器。初始化的时候突然停电,瞬间悲剧。 出...
    hongjay阅读 793评论 0 2
  • 如梦令·忆登泰山 文/书虫脉望 常记初登岱柱, 行进攀爬晌午。 绝顶看日出, 拂晓云淹齐鲁。 何故?何故? 元君欲...
    书虫脉望阅读 768评论 0 0