DOM学习第四天

DOM学习_第四天

回顾上节

  1. 节点:页面中所有的内容都是节点(标签,属性,文本:文字,空格,换行)
    文档:document—页面中的顶级对象
    元素:页面中所有的标签, 标签—元素–对象(通过DOM的方式来获取这个标签,得到了这个对象,此时这个对象叫DOM对象)

  2. 节点的属性:作用:为了将来获取很多节点,得到节点中的标签(元素),识别节点中的标签元素

  3. 节点的类型:1标签节点,2属性节点,3文本节点
    nodeType:节点的类型,1—标签节点,2—-属性节点,3—文本节点
    nodeName:标签节点–大写的标签名字,属性节点—小写的属性名字,文本节点—#text
    nodeValue:标签—null,属性—属性的值,文本—文本内容

  4. 获取节点及元素:12行代码
//获取当前节点的父级节点
    console.log(my$("uu").parentNode);
    //获取当前节点的父级元素
    console.log(my$("uu").parentElement);
    //获取当前节点的子级节点
    console.log(my$("uu").childNodes);
    //获取当前节点的子级元素
    console.log(my$("uu").children);


    //获取当前节点的第一个子级节点
    console.log(my$("uu").firstChild);
    //获取当前节点的第一个子级元素
    console.log(my$("uu").firstElementChild);
    //获取当前节点的最后一个子级节点
    console.log(my$("uu").lastChild);
    //获取当前节点的最后一个子级元素
    console.log(my$("uu").lastElementChild);
    //获取当前节点的前一个兄弟节点
    console.log(my$("uu").previousSibling);
    //获取当前节点的前一个兄弟元素
    console.log(my$("uu").previousElementSibling);
    //获取当前节点的后一个兄弟节点
    console.log(my$("uu").nextSibling);
    //获取当前节点的后一个兄弟元素
    console.log(my$("uu").nextElementSibling);
  1. 三种元素创建的方式

    1. document.write(“标签代码及内容”); 如果在页面加载完毕后创建元素.页面中的内容会被干掉
    2. 父级对象.innerHTML=”标签代码及内容”;
    3. document.createElement(“标签名字”);得到的是一个对象,

    父级元素.appendChild(子级元素对象);
    父级元素.inerstBefore(新的子级对象,参照的子级对象);
    移除子元素
    父级元素.removeChild(要干掉的子级元素对象);

    事件的绑定:为同一个元素绑定多个相同的事件

    1. 对象.on事件名字=事件处理函数 如果是多个相同事件注册用这种方式,最后一个执行,之前的被覆盖了
      my$("btn").onclick=function(){};
 2. 对象.addEventListener("没有on的事件名字",事件处理函数,false);
    my$("btn").addEventListener("click",function(){},false);
 3. 对象.attachEvent("有on的事件名字",事件处理函数);
    my$("btn").attachEvent("onclick",function(){});

为任意一个元素绑定任意一个事件

 //为任意的一个元素,绑定任意的一个事件
    function addEventListener(element,type,fn) {
      if(element.addEventListener){
        element.addEventListener(type,fn,false);
      }else if(element.attachEvent){
        element.attachEvent("on"+type,fn);
      }else{
        element["on"+type]=fn;
      }
    }

今日主要内容

  1. 绑定事件的区别
  2. 移除绑定事件的方式及区别和兼容代码
  3. 事件的三个阶段
  4. 事件冒泡
  5. 为同一个元素绑定多个不同的事件,指向的是同一个事件处理函数
  6. 百度的大项目

总结绑定事件的区别:
addEventListener();
attachEvent()
相同点: 都可以为元素绑定事件
不同点:
1.方法名不一样
2.参数个数不一样addEventListener三个参数,attachEvent两个参数
3.addEventListener 谷歌,火狐,IE11支持,IE8不支持
attachEvent 谷歌火狐不支持,IE11不支持,IE8支持
4.this不同,addEventListener 中的this是当前绑定事件的对象
attachEvent中的this是window
5.addEventListener中事件的类型(事件的名字)没有on
attachEvent中的事件的类型(事件的名字)有on
01_为元素解绑

<body>
<input type="button" value="小苏" id="btn"/>
<input type="button" value="干掉第一个按钮的事件" id="btn2"/>
<script src="common.js"></script>
<script>
  //1 对象.on事件名字=事件处理函数----绑定事件
 my$("btn").onclick=function () {
   console.log("我猥琐");
 };
 my$("btn2").onclick=function () {
   //1.解绑事件
   my$("btn").onclick=null;
 };

 function f1() {
   console.log("第一个");
 }
 function f2() {
   console.log("第二个");
 }
 my$("btn").addEventListener("click",f1,false);
 my$("btn").addEventListener("click",f2,false);
//
//  //点击第二个按钮把第一个按钮的第一个点击事件解绑
 my$("btn2").onclick=function () {
   //解绑事件的时候,需要在绑定事件的时候,使用命名函数
   my$("btn").removeEventListener("click",f1,false);
 };
  function f1() {
    console.log("第一个");
  }
  function f2() {
    console.log("第二个");
  }
  my$("btn").attachEvent("onclick",f1);
  my$("btn").attachEvent("onclick",f2);

  my$("btn2").onclick=function () {
      my$("btn").detachEvent("onclick",f1);
  };
  //解绑事件:
  /*
  * 注意:用什么方式绑定事件,就应该用对应的方式解绑事件
  * 1.解绑事件
  * 对象.on事件名字=事件处理函数--->绑定事件
  * 对象.on事件名字=null;
  * 2.解绑事件
  * 对象.addEventListener("没有on的事件类型",命名函数,false);---绑定事件
  * 对象.removeEventListener("没有on的事件类型",函数名字,false);
  * 3.解绑事件
  * 对象.attachEvent("on事件类型",命名函数);---绑定事件
  * 对象.detachEvent("on事件类型",函数名字);
  * */
</script>
</body>

02_绑定事件的兼容和解绑事件的兼容

<body>
<input type="button" value="按钮" id="btn1"/>
<input type="button" value="干掉第一个按钮的事件" id="btn2"/>
<script src="common.js"></script>
<script>
  //绑定事件的兼容
  function addEventListener(element,type,fn) {
    if(element.addEventListener){
      element.addEventListener(type,fn,false);
    }else if(element.attachEvent){
      element.attachEvent("on"+type,fn);
    }else{
      element["on"+type]=fn;
    }
  }
  //解绑事件的兼容
  //为任意的一个元素,解绑对应的事件
  function removeEventListener(element,type,fnName) {
    if(element.removeEventListener){
      element.removeEventListener(type,fnName,false);
    }else if(element.detachEvent){
      element.detachEvent("on"+type,fnName);
    }else{
      element["on"+type]=null;
    }
  }
  function f1() {
    console.log("第一个");
  }
  function f2() {
    console.log("第二个");
  }
  addEventListener(my$("btn1"),"click",f1);
  addEventListener(my$("btn1"),"click",f2);
  my$("btn2").onclick=function () {
    removeEventListener(my$("btn1"),"click",f1);
  };
</script>
</body>

03_事件冒泡

<style>
    #dv1{
      width: 300px;
      height: 200px;
      background-color: red;
    }
    #dv2{
      width: 250px;
      height: 150px;
      background-color: green;
    }
    #dv3{
      width: 200px;
      height: 100px;
      background-color: blue;
    }
  </style>
  <script>
    //事件冒泡:多个元素嵌套,有层次关系,这些元素都注册了相同的事件,如果里面的元素的事件触发了,外面的元素的该事件自动的触发了
  </script>
</head>
<body>
<div id="dv1">
  <div id="dv2">
    <div id="dv3"></div>
  </div>
</div>
<script src="common.js"></script>
<script>
  //事件冒泡,阻止事件冒泡,
  //如何阻止事件冒泡: window.event.cancelBubble=true; IE特有的,谷歌支持,火狐不支持
  // e.stopPropagation(); 谷歌和火狐支持,
  my$("dv1").onclick=function () {
    console.log(this.id);
  };
  my$("dv2").onclick=function () {
    console.log(this.id);
    //window.event.cancelBubble=true;
  };
  //事件处理参数对象
  my$("dv3").onclick=function (e) {
    console.log(this.id);
    //阻止事件冒泡
    //e.stopPropagation();

    console.log(e);
  };
//  document.body.onclick=function () {
//      console.log("颤抖吧,你们这些愚蠢的标签");
//  };
</script>
</body>

04_事件阶段

<style>
    #dv1 {
      width: 300px;
      height: 200px;
      background-color: red;
    }
    #dv2 {
      width: 250px;
      height: 150px;
      background-color: green;
    }
    #dv3 {
      width: 200px;
      height: 100px;
      background-color: blue;
    }
  </style>
  <script>
    //事件有三个阶段:
     //  1.事件捕获阶段  :从外向内
     //  2.事件目标阶段  :最开始选择的那个
     //  3.事件冒泡阶段  : 从里向外
     //  为元素绑定事件
     //  addEventListener("没有on的事件类型",事件处理函数,控制事件阶段的)
     //  事件触发的过程中,可能会出现事件冒泡的效果,为了阻止事件冒泡--->
      // window.event.cancelBubble=true;谷歌,IE8支持,火狐不支持
     //  window.event就是一个对象,是IE中的标准
     //  e.stopPropagation();阻止事件冒泡---->谷歌和火狐支持
     //  window.event和e都是事件参数对象,一个是IE的标准,一个是火狐的标准
     // * 事件参数e在IE8的浏览器中是不存在,此时用window.event来代替
     //  addEventListener中第三个参数是控制事件阶段的
     //  事件的阶段有三个:
     //  通过e.eventPhase这个属性可以知道当前的事件是什么阶段你的
     //  如果这个属性的值是:
     //  1---->捕获阶段
     //  2---->目标阶段
     //  3---->冒泡
     //  一般默认都是冒泡阶段,很少用捕获阶段
     //  冒泡阶段:从里向外
     //  捕获阶段:从外向内

  </script>
</head>
<body>
<div id="dv1">
  <div id="dv2">
    <div id="dv3"></div>
  </div>
</div>
<script src="common.js"></script>
<script>
  //事件冒泡:是从里向外

  //同时注册点击事件
  var objs = [my$("dv3"), my$("dv2"), my$("dv1")];
  //遍历注册事件
  objs.forEach(function (ele) {
    //为每个元素绑定事件
    ele.addEventListener("click", function (e) {
      console.log(this.id+"====>"+e.eventPhase);

    }, true);

  });
  //该属性在事件参数对象中存在
</script>
</body>

05_为同一个元素绑定多个不同的事件,指向相同的事件处理函数

<body>
<input type="button" value="小苏" id="btn"/>
<script src="common.js"></script>
<script>
  //为同一个元素绑定多个不同的事件,指向相同的事件处理函数
  my$("btn").onclick = f1;
  my$("btn").onmouseover = f1;
  my$("btn").onmouseout = f1;
  function f1(e) {
    switch (e.type) {
      case "click":
        alert("好帅哦");
        break;
      case "mouseover":
        this.style.backgroundColor = "red";
        break;
      case "mouseout":
        this.style.backgroundColor = "green";
        break;
    }
  }
  //  my$("btn").onmouseover=function (e) {
  //    console.log(e);
  //  };
</script>
</body>

06_模拟百度搜索

 <style>
    #box {
      width: 450px;
      margin: 200px auto;
    }
    #txt {
      width: 350px;
    }
    #pop {
      width: 350px;
      border: 1px solid red;
    }
    #pop ul {
      margin: 10px;
      padding: 0px;
      width: 200px;
      list-style-type: none;
    }
    #pop ul li {
    }
  </style>
</head>
<body>
<div id="box">
  <input type="text" id="txt" value="">
  <input type="button" value="搜索" id="btn">
</div>
<script src="common.js"></script>
<script>
  var keyWords = ["小杨才是最纯洁的", "小杨才是最帅的", "小段是最猥琐的", "小超是最龌龊的", "传智播客是一个培训机构", "传说在传智有个很帅很纯洁的小杨", "苹果好吃", "苹果此次召回还是没有中国"];
  //获取文本框注册键盘抬起事件
  my$("txt").onkeyup = function () {
    //每一次的键盘抬起都判断页面中有没有这个div
    if(my$("dv")){
      //删除一次
      my$("box").removeChild(my$("dv"));
    }
    //获取文本框输入的内容
    var text = this.value;
    //临时数组--空数组------->存放对应上的数据
    var tempArr = [];
    //把文本框输入的内容和数组中的每个数据对比
    for (var i = 0; i < keyWords.length; i++) {
      //是否是最开始出现的
      if (keyWords[i].indexOf(text) == 0) {
        tempArr.push(keyWords[i]);//追加
      }
    }
    //如果文本框是空的,临时数组是空的,不用创建div
    if (this.value.length == 0 || tempArr.length == 0) {
      //如果页面中有这个div,删除这个div
      if (my$("dv")) {
        my$("box").removeChild(my$("dv"));
      }
      return;
    }
    //创建div,把div加入id为box的div中
    var dvObj = document.createElement("div");
    my$("box").appendChild(dvObj);
    dvObj.id = "dv";
    dvObj.style.width = "350px";
    //dvObj.style.height="100px";//肯定是不需要的------
    dvObj.style.border = "1px solid green";
    //循环遍历临时数组,创建对应的p标签
    for (var i = 0; i < tempArr.length; i++) {
      //创建p标签
      var pObj = document.createElement("p");
      //把p加到div中
      dvObj.appendChild(pObj);
      setInnerText(pObj, tempArr[i]);
      pObj.style.margin = 0;
      pObj.style.padding = 0;
      pObj.style.cursor = "pointer";
      pObj.style.marginTop = "5px";
      pObj.style.marginLeft = "5px";
      //鼠标进入
      pObj.onmouseover = function () {
        this.style.backgroundColor = "yellow";
      };
      //鼠标离开
      pObj.onmouseout = function () {
        this.style.backgroundColor = "";
      };
    }
  };
</script>
</body>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值