DOM、事件

1. dom对象的innerTextinnerHTML有什么区别?
  • innerText用于获取元素内的文本内容;
  • innerHTML用于获取元素内的HTML结构。
2. elem.childrenelem.childNodes的区别?
  • elem.children属性返回一个动态的HTMLCollection集合,由当前节点所有的Element子节点组成;
  • elem.childNodes属性返回一个NodeList对象(类数组对象),包括但不限于Element节点,还包括Text节点(换行,空格)和
    注释节点。
3. 查询元素有几种常见的方法?
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task22</title>
    <style type="text/css">

    </style>
  </head>
  <body>
    <div id="div1" class="wrap">
      <a href="#" name="link1">jirengu</a>
    </div>
    <div id="div2" class="wrap">
      <a href="#" name="link2">hello <span>world</span></a>
    </div>

    <script type="text/javascript">
      var byId = document.getElementById('div1');                 // 1
      var byCls = document.getElementsByClassName('wrap');        // 2
      var byTgName = document.getElementByTagName('span');        // 3
      var byName = document.getElementByName('link1');            // 4
      var getEl = document.querySelector('#div1');                // 5
      var getEls = document.querySelectorAll('.wrap');            // 6

    </script>
  </body>
</html>
4. 如何创建一个元素?如何给元素设置属性?
  • 可以通过createElement()方法创建新的HTML元素节点;通过setAttribute()方法设置元素属性。
var newDiv = document.createElement('div');
newDiv.setArrribute('class','wrap');
5. 元素的添加、删除?
  • 使用appendChild方法在元素内的最后位置添加新元素节点;通过removeChild方法删除元素。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task22</title>
    <style type="text/css">
      #purchases .sale {
        color:red;
      }
    </style>
  </head>
  <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>
</html>
Paste_Image.png
6. DOM0 事件和DOM2级在事件监听使用方式上有什么区别?
  • DOM0事件是将时间作为元素的一个属性,当需要对事件进行监听时,只要将需要执行的函数赋值给这个属性即可,需要删除该事件监听是只需将该属性的值改为null即可;该方法操作直观简便,兼容性最好,但一个事件只能绑定一个函数。
  // HTML
  var btn = document.querySelector('#btn');
  // JS
  btn.onclick = function() {
    console.log('DOM0');
  }
  • DOM2级事件是使用元素的addEventListenerremoveEventListener方法对事件进行监听,事件类型和处理函数做为上述方法的参数,其中addEventListener方法只能通过removeEventListener取消。该方法可以为一个事件绑定多个函数。
  // HTML
  var btn = document.querySelector('#btn');
  // JS
  btn.addEventListener('click', function(){
    console.log('DOM2');
  })
7. attachEventaddEventListener的区别?
  • addEventListener对IE8 及之前的版本不兼容,只能用attachEvent对事件进行监听,同时,监听事件的取消也只能用detachEvent实现而不能使用removeEventListener
Paste_Image.png
  • attachEvent添加的事件处理程序只能发生在事件冒泡过程中,而addEventListener的第三个参数可以决定事件处理程序是在捕获阶段还是在冒泡阶段处理,一般浏览器默认发生在冒泡阶段(即第三个参数默认为false);
  • addEventListener方法第一个参数是事件类型(如clickload),而attachEvent的第一个参数是事件名称(如onclickonload);
  • 二者事件处理程序的作用域不同。addEventListener事件的作用域是元素本身,而attachEvent的事件处理程序会在全局作用域内运行;
  • 为一个事件添加多个事件处理程序时,执行顺序不同。addEventListener会按照处理程序添加的顺序执行,而attachEvent执行多个事件处理程序的顺序没有规律。
8. 解释IE事件冒泡和DOM2事件传播机制?
  • IE事件冒泡机制中事件最开始是由最具体的元素接收,然后向其祖先元素进行传播,其祖先元素可以在此过程中接收事件并引发事件处理程序;
  • DOM2事件传播在根节点到事件发生的具体元素过程中提供了截取事件的机会,然后则是冒泡机制。
9. 如何阻止事件冒泡? 如何阻止默认事件?
  • 通过stopPropagation()方法可以阻止事件冒泡;
  • 通过preventDefault()可以阻止默认事件。
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task22</title>
    <style type="text/css">
      .wrap {
        height:100px;
        width:100px;
        background-color:red;
        margin:50px;
      }
      .main {
        height:70px;
        width:70px;
        background-color:yellow;
      }
    </style>
  </head>
  <body>
    <div class="wrap">
      <div class="main">
        <a class="link" href="http://jirengu.com/">饥人谷</a>
      </div>
    </div>
    <script type="text/javascript">
      var wrap = document.querySelector('.wrap');
      var main = document.querySelector('.main');
      var link = document.querySelector('.link');
      wrap.addEventListener('click', function(){
        console.log('wrap');
      })
      main.addEventListener('click', function(){
        console.log('main');
      })
      link.addEventListener('click', function(e){
        e.preventDefault();
        console.log('link');
        e.stopPropagation();
      })
    </script>
  </body>
</html>

单击链接,实现如下效果:


Paste_Image.png

代码题

1. 有如下代码,要求当点击每一个元素li时控制台展示该元素的文本内容。不考虑兼容

实现效果

  <ul class="ct">
    <li>这里是</li>
    <li>饥人谷</li>
    <li>前端9班</li>
  </ul>
  <script>
    function $(str) {
      return document.querySelector(str);
    }
    function $$(str) {
      return document.querySelectorAll(str);
    }
    var ul = $('.ct');
    ul.addEventListener('click', function(e){
      console.log(e.target.innerText);
    })
  </script>
2. 补全代码,要求:
  • 当点击按钮开头添加时在<li>这里是</li>元素前添加一个新元素,内容为用户输入的非空字符串;当点击结尾添加时在<li>前端6班</li>后添加用户输入的非空字符串.
  • 当点击每一个元素li时控制台展示该元素的文本内容。
    实现效果
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task22-2</title>
  </head>
  <body>
    <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>
      function $(str){
        return document.querySelector(str);
      }
      function $$(str){
        return document.querySelectorAll(str);
      }
      var ul = $('.ct');
      var ipt = $('.ipt-add-content');
      var btnAddStart = $('#btn-add-start');
      var btnAddEnd = $('#btn-add-end');
      // 当文本框内容发生改变时获取文本框value值并添加至新建的li标签内
      ipt.addEventListener('change', function(){
        newLi = document.createElement('li');
        newLi.innerText = ipt.value
      })
      // 定义两个按钮的单击事件
      btnAddStart.addEventListener('click', function() {
        ul.insertBefore(newLi,ul.firstChild);
        ipt.value = '';
      })
      btnAddEnd.addEventListener('click', function() {
        ul.appendChild(newLi);
        ipt.value = '';
      })
      ul.addEventListener('click', function(e){
        if(e.target.tagName.toLowerCase() === 'li') {
          console.log(e.target.innerText);
        }
      })
    </script>
  </body>
</html>
3. 补全代码,要求:当鼠标放置在li元素上,会在````img-preview里展示当前li元素的data-img```对应的图片.

实现效果

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task22-3</title>
  </head>
  <body>
    <ul class="ct">
        <li data-img="images/task22-3-1.jpg">鼠标放置查看图片1</li>
        <li data-img="images/task22-3-2.jpg">鼠标放置查看图片2</li>
        <li data-img="images/task22-3-3.jpg">鼠标放置查看图片3</li>
        <li data-img="images/task22-3-4.jpg">鼠标放置查看图片4</li>
    </ul>
    <div class="img-preview"></div>
    <script>
      var ul = document.querySelector('.ct');
      var div = document.querySelector('.img-preview');
      var newImg = document.createElement('img');
      ul.addEventListener('mouseover', function(e){
        if(e.target.tagName.toLowerCase() === 'li'){
          var src = e.target.getAttribute('data-img');
          newImg.src = src;
          div.appendChild(newImg);
        }
      })
    </script>
  </body>
</html>
4. 实现如下图Tab切换的功能

图片地址
实现效果
代码:

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task22-4</title>
    <style type="text/css">
      #tab {
        border-collapse: collapse;    /* 合并边框 */
        width: 500px;
        border: 1px solid #888;
        border-spacing: 0;
      }
      #tab td {
        border: 1px solid #888;
        padding: 0;
      }
      .tabs td {
        text-align: center;
        line-height: 30px;
        cursor: pointer;
      }
      .tabs .active {
        background-color: #ccc;
      }
      #tab .main {
        height: 100px;
      }
      #tab .main td li {
        list-style: none;
        padding: 10px;
        display: none;
      }
      #tab .main .active {
        display: block;
      }
    </style>
  </head>
  <body>
    <table id="tab">
      <tr class="tabs">
        <td>tab1</td>
        <td>tab2</td>
        <td>tab3</td>
      </tr>
      <tr class="main">
        <td colspan="3">
          <ul>
            <li class="active">内容一</li>
            <li>内容二</li>
            <li>内容三</li>
          </ul>
        </td>
      </tr>
    </table>
    <script type="text/javascript">
      var tabs = $('.tabs')
      var tabArr = $$('.tabs>td');
      var mainArr = $$('.main li');
      tabs.addEventListener('click', function(e){             // 在tabs上加时间监听
        var clickNode = e.target;
        if (clickNode.tagName.toLowerCase() === 'td') {       // tabs的点击效果
          for (var i=0; i<tabArr.length; i++){
            tabArr[i].classList.remove('active');
          }
          clickNode.classList.add('active');
        }
        var index = [].indexOf.call(tabArr,clickNode);        // 利用index将tabs和mainList联系起来
        for (var i=0; i<mainArr.length; i++){
          mainArr[i].classList.remove('active');
        }
        mainArr[index].classList.add('active');
      })

      function $(str) {
        return document.querySelector(str);
      }
      function $$(str) {
        return document.querySelectorAll(str);
      }
    </script>
  </body>
</html>
5. 实现下图的模态框功能

图片地址
实现效果
代码:

  • HTML
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8">
    <title>task22-5</title>
    <link rel="stylesheet" href="task22-5.css">
  </head>
  <body>
    <div class="btn-wrap">
      <button type="button" id="btn-boss">点我</button>
    </div>
    <div class="modal">
      <div class="dialog-box">
        <div class="header">
          <h1>我是标题</h1>
          <a class="close icon-close" href="#"></a>
        </div>
        <div class="contents">
          <p>我是内容1</p>
          <p>我是内容2</p>
        </div>
        <div class="footer">
          <a class="btn confirm" href="#">确定</a>
          <a class="btn cancel" href="#">取消</a>
        </div>
      </div>

    </div>
    <script type="text/javascript" src="task22-5.js"></script>
  </body>
</html>
  • CSS
div,p,h1,h2,h3,h4,h5,h6,a,button{
  margin: 0;
  padding: 0;
  font-size: 16px
}
@font-face {font-family: "iconfont";
  src: url('iconfont.eot?t=1471481907'); /* IE9*/
  src: url('iconfont.eot?t=1471481907#iefix') format('embedded-opentype'), /* IE6-IE8 */
  url('iconfont.woff?t=1471481907') format('woff'), /* chrome, firefox */
  url('iconfont.ttf?t=1471481907') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
  url('iconfont.svg?t=1471481907#iconfont') format('svg'); /* iOS 4.1- */
}
.icon-close {
  font-family:"iconfont" ;
  font-size:16px;
  font-style:normal;
  -webkit-font-smoothing: antialiased;
  -webkit-text-stroke-width: 0.2px;
  -moz-osx-font-smoothing: grayscale;
}
.icon-close:before { content: "\e62d"; }
a {
  text-decoration: none;
  color: #333;
}
.modal {
  display: none;
  position: fixed;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  background-color: rgba(0,0,0,0.3)
}
.dialog-box {
  width: 400px;
  border: 1px solid #ccc;
  border-radius: 4px;
  background-color: #fff;
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  -webkit-transform: translate(-50%, -50%);
}
.dialog-box .header {
  border-bottom: 1px solid #aaa;
}
.dialog-box .header h1 {
  line-height: 40px;
  display: inline-block;
  margin-left: 15px;
}
.dialog-box .header .close {
  display: table-cell;
  float: right;
  line-height: 40px;
  margin-right: 15px;
}
.dialog-box .contents {
  padding:15px;
  border-bottom: 1px solid #ccc;
}
.dialog-box .contents p {
  line-height: 30px;
}
.dialog-box .footer .btn {
  line-height: 40px;
  float: right;
  margin-right: 15px;
}
  • JS
function $(str) {
    return document.querySelector(str);
}
function $$(str) {
    return document.querySelectorAll(str);
}
var btnBoss = $('#btn-boss');
var modal = $('.modal');
var dialogBox = $('.dialog-box');
function hasClass(ele, cls) {
    var reg = new RegExp('\\b' + cls + '\\b','ig');
    return reg.test(ele.className)
}
btnBoss.addEventListener('click', function(){
    modal.style.display = 'block';
})
dialogBox.addEventListener('click', function(e){
    e.stopPropagation();
    if (hasClass(e.target, 'close') || hasClass(e.target, 'cancel')) {
        modal.style.display = 'none';
    }
})
modal.addEventListener('click', function(e){
    modal.style.display = 'none';
})

本教程版权归本人和饥人谷所有,转载请注明来源。

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

推荐阅读更多精彩内容