window对象

135 阅读6分钟

事件对象

<div>
    你好!!!
</div>
<script>
    var div = document.querySelector("div")
    div.onclick = function(e) {
    //上方这个点击事件,它的事件对象可以用e来代表,e是一个形参,有一定的属性。
    //需要兼容其他浏览器可加:
        var e = e || window.event;
        console.log(e)
         // 鼠标的x y轴坐标
        console.log(e.clientX)
        console.log(e.clientY)
        console.log(e.target) // target 目标
    }
    e 是event缩写
    它只有事件存在,才会存在的。系统传递个过来的,不是自己定义的!!
    事件对象包含了一系列相关数据的集合 (事件相关的!!!
    
    案例:
    //关于 e.target鼠标点击对象
    
     <ul>
    <li>
        张世豪
    </li>
    <li>
        李嘉诚
    </li>
    <li>
        马云
    </li>
</ul>
<script>
    var ul = document.querySelector("ul")
    // 当点击li的时候,ul绑定的click事件也会执行,因为有冒泡事件!!!
    ul.addEventListener("click", function(e) {
        // 谁产生了事件就是谁!!!e.target 是事件源!!!
        console.log(e.target)
        // 谁绑定这个函数,this就是谁!!!
        console.log(this) // ul

        // 当前事件绑定的元素
        console.log(e.currentTarget) // ul current 当前
    })
</script>

阻止冒泡事件

 1方式1 :阻止冒泡
 e.stopPropagation()  // Propagation: 传播
 
 2.方式2
 e.cancelBubble = true; // cancel:取消  bubble:冒泡
 
 例:
  <div class="grandfather">
    <div class="father">
        <div class="son"></div>
    </div>
</div>
<script>
    var grandfather = document.querySelector(".grandfather")
    var father = document.querySelector(".father")
    var son = document.querySelector(".son")

    grandfather.addEventListener("click", function() {
        console.log("grandfather捕获阶段")
    }, true)
    grandfather.addEventListener("click", function() {
        console.log("grandfather冒泡阶段")
    }, false)

    father.addEventListener("click", function() {
        console.log("father捕获阶段")
    }, true)
    father.addEventListener("click", function() {
        console.log("father冒泡阶段")
    }, false)

    son.addEventListener("click", function() {
        console.log("son捕获阶段")
    }, true)
    son.addEventListener("click", function(e) {
        console.log("son冒泡阶段")
        // 1方式1 :阻止冒泡
        // e.stopPropagation()  // Propagation: 传播
        // 2.方式2
        e.cancelBubble = true; // cancel:取消  bubble:冒泡
    }, false)
</script>

阻止默认事件

  <a href="http://www.baidu.com">点击一下</a>
<script>
    var a = document.querySelector("a")
    a.onclick = function(e) {
       alert ("这是一个测试!!!")
        // e.preventDefault(); // prevent: 阻止  default:默认
        //return false;
    }
  通常情况下会先 1.弹出alert 2.跳转到了百度、、、 
  这里 href是一个浏览器的默认事件
阻止默认事件
   方法:1.将href中的链接改为  javascript:void(0)
         2. 添加 e.preventDefault() 如上
         3. 添加 return false; 如上
</script>

事件委托

 // 委托事件!!!  委托 利用的就是冒泡事件的原理!!!
  <ul>
    <li>
        刘德华
    </li>
    <li>
        古巨基
    </li>
    <li>
        渣渣辉
    </li>
</ul>
<script>
    var ul = document.querySelector("ul")
    // 相当于给每个li上增加的了一个事件!!! 但是比给每一个li增加事件的效率会高的多!!!
    ul.addEventListener("click", function(e) {
        e.target.style.backgroundColor = "red"
    })
</script>

鼠标事件

   <div>这是神秘的一段话</div>
<script>
    document.addEventListener("contextmenu", function(e) {
        alert("111") //鼠标右键点击时,显示alert内容
        e.preventDefault()// 阻止默认事件
    })

    document.addEventListener("selectstart", function(e) {
        e.preventDefault()
    })//这可以禁止选中文字
</script>


案例:
  鼠标跟随事件
  
   <img src="./1.jpg" alt="">
   //注意:这里要让图片脱离正常文档流
   
<script>
    var img = document.querySelector("img")
    document.addEventListener("mouseover", function(e) {
        // clientX   代表可视区域的X 
        // pageX     代表文本文档中的X
        // screeX    代表在电脑屏幕中X
        // 1.获取鼠标的位置
        var x = e.pageX;
        var y = e.pageY;

        img.style.left = x - 50 + "px"
        img.style.top = y - 50 + "px"
    })
</script>

键盘事件

    keydown  键盘按下
    keyup    键盘抬起
<input type="text">
<script>
    var input = document.querySelector("input")
     键盘抬起
     input.onkeyup = function(e) {
         console.log(e)
     }

     input.onkeydown = function(e) {
         console.log(e)
     }
     press 也有按下的意思但 不能识别ctrl shift 左右箭头...
     input.onkeypress = function() {
     }
</script>

ascii 码 "keyCode"

 <input type="text">
<script>
    var input = document.querySelector("input")
    input.onkeyup = function(e){
      //keyCode值就是ascii 码
        console.log(e.keyCode)
    }
</script>
例:
 <input type="text">
<script>
    var input = document.querySelector("input")
    document.addEventListener("keyup", function(e) {
        console.log(e.keyCode)
        if(e.keyCode == 79) { //当按下ascii 码为79的键时,文本框聚焦
            // input上面都有一个默认的函数,focus(); 代表聚焦,注意大小写。
            input.focus();
        }
    })

    // (DOM)、window对象(BOM) 、setTimeout、setInterval、this问题、location
</script>

window对象(BOM)

<script>
    var num = 10;
    console.log(num) // num是一个全局变量
    console.log(window.num) // window对象就是全局对象!!!所以这两个结果一样

    function demo() {
        console.log("1`131323")
    }
    console.log(window.demo)
</script>

window.onload 加载

     浏览器对于html解析,是从上而下。
     当执行到这里的时候,div还没有进行渲染!!!
    var box = document.querySelector(".box")
    console.log(box) // 所以这里打印的是null
    所以在外面添加一个window.onload函数,改为:
     window.onload = function() {
         var box = document.querySelector(".box")
         console.log(box) 
     }
     但需要等待包括 dom元素 图片 flash css 等等 加载完毕后。
     
     下方这个函数与window.onload一样,但只需加载DOM完毕之后,不需要非得加载完毕图片 flash css等等,更快速
    document.addEventListener("DOMContentLoaded", function() {
        console.log("222")
    })

窗口变化事件

 例:
    <style>
    div {
        width: 200px;
        height: 200px;
    }
</style>
</head>
<body>
<script>
    window.addEventListener('load', function() {
        var div = document.querySelector("div")
        // resize 是监听窗口变化!!!这个监听,一旦窗口发生变化,就执行函数!!!
        window.addEventListener('resize', function() {
            // 窗口的宽度
            console.log(window.innerWidth)
            if(window.innerWidth >= 600) {
                div.style.background = "red"
            }else {
                div.style.background = "blue"
            }
        })
    })
</script>

setTimeout定时器

  1.setTimeout  == window.setTimeout
  2.setTimeout是一个函数
  
   <script>
 setTimeout(function(){
    console.log("这是我第一个定时器")
 },1000)
 //参数说明: 第一个参数为函数 第二个参数为时间,单位为毫秒
 </script>
 
 setTimeout有返回值,所以可写为:
 <script>
    var f1 = function() {
        console.log("这是我的第一个定时器")
    }
    var timer = setTimeout(f1, 5000)
    
     取消定时器!!!!
    clearTimeout(timer)
    
</script>

例:
  广告消失
  
  <img src="https://ns-strategy.cdn.bcebos.com/ns-strategy/upload/fc_big_pic/part-00527-3086.jpg" alt="">
<script>
    var img = document.querySelector("img")
    setTimeout(function() {
        img.style.display = "none"
    },3000)
</script>

setInterval定时器

 <script>
   
    结构:   setInterval(function(){}, 1000)
    参数说明: 第一个参数为函数,第二个参数为时间(单位为毫秒)

    // 每隔1000ms执行一次function
    setInterval(function() {
        console.log("输出!!!")
    }, 1000)
</script>

例:倒计时

  <div>
    <p>距离4月4日还有</p>
    <span class="day"></span>天
    <span class="hour"></span>小时
    <span class="minute"></span>分
    <span class="second"></span>秒
</div>
<script>
    var day = document.querySelector(".day")
    var hour = document.querySelector(".hour")
    var minute = document.querySelector(".minute")
    var second = document.querySelector(".second")


    function cutDown() {
        var nowTime = +new Date();
        var endTime = +new Date("2020-4-04 00:00:00")
        var offsetTime = (endTime - nowTime)/1000;
        var h = parseInt(offsetTime / 60 / 60 % 24);
        var m = parseInt(offsetTime / 60 % 60)
        var s = parseInt(offsetTime % 60);
       
        h = h < 10 ? '0' + h : h;
        m = m < 10 ? '0' + m : m;
        s = s < 10 ? '0' + s : s;

        // 需要把值放入dom元素中去
        day.innerText = d
        hour.innerText = h;
        minute.innerText = m;
        second.innerText = s;
    }
    // 每隔1000ms就会执行cutDown函数!!!
    var timer = setInterval(cutDown, 1000)
    // clearInterval(timer) 清除定时器
</script>

例2:发送验证码

 手机号: <input type="number"> <button>发送验证码</button>
<script>
    // 
    var btn = document.querySelector("button")
    var time = 5;
    var timer = null;
    btn.addEventListener("click", function() {
        timer = setInterval(function() {
            if(time == 0) {
                clearInterval(timer);
                btn.innerText = "重新发送验证码"
                btn.disabled = false
                time = 5;
            }else {
                btn.disabled = true
                btn.innerHTML = "(" + time + ")"
                time--;
            }
            
        }, 1000)
    })
</script>

location对象

    console.log(location)
     location.href = "http://www.baidu.com"        // 重新跳转到href地址!!!
例1:
<button>点击跳转</button>
<script>
    var btn = document.querySelector("button")
    btn.onclick = function() {
        setTimeout(function() {
            location.href = "http://www.baidu.com"
        }, 5000)
    }
</script>

例2:
<button>点击</button>
<script>
    var btn = document.querySelector("button")
    btn.onclick = function() {
        // 能够记录浏览器的浏览历史可以实现后退功能!!
        location.assign("http://www.baidu.com")
        // 不能够记录浏览历史,也不可以回退!!!
        location.replace("http://www.baidu.com")
        // 重新加载
        location.reload();
    }

</script>