JavaScript学习DAY12

DAY12

一、绑定事件的方式
1、事件属性 :

​ 把事件写在标签的属性里面

<input type="button" onclick="alertMessage()" value="按钮"/>
2、事件绑定
dv.onclick = function(){
	conloge.log('我是第一个事件')
}
dv.onclick = function(){
	conloge.log('我是第二个事件')
}
//当你点击的时候,只会执行第二个,第一个就没有了
3、事件监听:

1、addEventListener

添加事件监听 事件监听可以有多个 IE9+ 支持 绑定相同的事件,两个都会存在

​ 第一个参数是事件类型
​ 第二个参数是事件处理函数

 dv.addEventListener('click', function(){
            console.log(123)
        })

dv.addEventListener('click', function(){
        	console.log(456)
    	})
 dv.addEventListener ? console.log('123') : console.log('456')
//当你点击的时候,两个函数都会执行,并且按照注册顺序执行

2、attachEvent

​ 第一个参数是 on + 事件类型
​ 第二个参数 是事件处理函数

 dv.attachEvent('onclick', function(){
            console.log(123)
        })
dv.attachEvent('onclick', function(){
            console.log(456)
        })
二、事件传播机制

​ 事件传播: 事件会传播
​ 传播方向: 由内向外 -> 事件冒泡
​ 由外向内 -> 事件捕获

​ 事件由外向内传,
​ 事件监听写法
​ 语法: 元素.addEventListener(‘事件类型’,事件处理函数, 冒泡|捕获)
​ 冒泡|捕获 => false|true
​ 默认冒泡
​ 事件捕获: true
​ 事件冒泡: false(默认)

 div.addEventListener('click',function(){
            alert('事件a')
        },true)
三、绑定事件

绑定相同的事件,只会存在最后一个事件

​ @param {ele} 要绑定事件的元素
​ @param {type} 事件类型
​ @param {fn} 事件处理函数

        on(dv,'click', function(){
            console.log(123)
        })
        on(dv,'onclick', function(){
            console.log(456)
        })
        
    function on(ele, type, fn) {
        // 先判断浏览器是否支持
        if (ele.addEventListener) {
            // 支持
            // 判断传的事件类型有没有带 on 
            if(type.indexOf('on') === 0){
                type = type.slice(2)
            }
            ele.addEventListener(type,fn)
        }else{
            // 不支持
            // 判断传的事件类型有没有带 on 
            if(type.indexOf('on') !== 0){
                type = 'on' + type
            }
            ele.attachEvent(type,fn)
        }
    }
四、解除函数绑定事件
  dv.attachEvent('onclick', fun)
        // detachEvent('on'+事件类型,事件处理函数) 
        // 解绑的事件处理函数必须和绑定的时候是同一个事件处理函数

  btn.onclick = function () {
        dv.detachEvent('onclick', fun)
    }

    function fun() {
        console.log(123)
   }
五、获取元素函数封装

获取元素
@params {selector} 选择器
@params {context} 元素范围
@return 获取到的元素或者元素集合

    function my$(selector,context){
        // 给 context 一个默认值
        context = context || document
        // 判断是 # 还是 . 开头还是其他的
        if(selector.indexOf('#') === 0){
            // 获取到元素 返回出去
            return document.getElementById(selector.slice(1))
        }else if(selector.indexOf('.') === 0){
            return context.getElementsByClassName(selector.slice(1))
        }else{
            // 如果都不是 我就返回一个元素集合
            return context.querySelectorAll(selector)
        }
    }
六、阻止冒泡

e.stopPropagation() 阻止冒泡 IE9 及以上

e.cancelBubble = true IE8及以下

兼容性写法
            if(e.stopPropagation){
                    e.stopPropagation() // 阻止事件传播 标准浏览器
            }else{
                e.cancelBubble = true //IE 低版本
            }
七、阻止默认事件
阻止默认行为
           默认行为: 表单提交  
                      当执行完表单提交事件submit后 默认会执行 action动作
                      onsubmit -> action
                    a标签
                      <a href="http://www.baidu.com" onclick="alert()">百度</a>
                      onclick -> href跳转

阻止默认事件方式
1、return false //后面的代码不再执行
2、e.preventDefault() //非IE浏览器
3、e.returnValue = false // IE 浏览器

	<form action="http://www.baidu.com">
        <input type="submit" value="确定">
    </form>
    <script>
        //onsubmit事件 是那个元素的 form 表单
        var formEle = document.querySelector('form')
        formEle.addEventListener('submit',function(e){
            e = e || window.event //事件对象
            alert('表单提交')
            //阻止默认行为
            e.preventDefault()   // 非IE浏览器
            // e.returnValue = false // IE 浏览器
        })
    </script>
八、事件委托

问题:

​ + 问题描述:传统的绑定事件的方法,绑定的相同的事件,使用for循环实际上是绑定很多次,对于浏览器

​ 的性能有很大的消耗的。后面新创建的标记,事件是不会给你绑定上的

​ + 针对于这种问题有人提出,要是有一种方法只绑定一次事件,其他的元素都绑定了,该多好?

​ + 解决方案:使用事件委派 — 自己做的事情,让别人去做

​ + 事件委托(委派)指将事件统一绑定给元素的共同祖先元素,这样当后代元素上的事件触发时,

​ 会一直冒泡到祖先元素从而通过祖先元素的响应函数来处理事件。

一般用在页面上有动态追加进去的元素 绑定事件

事件委派是给父元素绑定事件 然后由父元素委派给子元素

九、获取方式:

​ 事件对象.target
​ 兼容IE
​ 事件对象.srcElement

​ 兼容性写法:
​ var target = e.target || e.srcElement

<ul>
        <li class="l1">元素一</li>
        <li class="l2">元素二</li>
        <li class="l3">元素三</li>
    </ul>
<script>
    	// 给所有li列表项设置点击事件
        // 1. 获取所有li元素, 分别给每个li设置点击事件
        var liEles = document.querySelectorAll('li')
        // 2. 循环遍历  用for循环
        for(var i = 0; i < liEles.length; i++){
            liEles[i].addEventListener('click',function(e){
                e = e || window.event // 事件对象
                var target = e.target || e.srcElement // 事件目标对象
                console.log(target)
                console.log(("收包裹")
            })
        }
                                       
        //事件委托
        //target  目标对象
      	//event   事件对象   =>   target是事件对象的一个属性
        //event.target  =>  目标对象
        var ulEle = document.querySelector('ul')
        ulEle.addEventListener('click',function(e){
            e = e || window.event // 事件对象
            var target = e.target || e.srcElement // 事件目标对象
            var classValue = target.getAttribute('class')
            if(classValue == 'l1'){
                console.log("收元素一 的包裹")
            }else if( classValue == 'l2'){
                console.log("收元素二 的包裹")
            }else if( classValue == 'l3'){
                console.log("收元素三 的包裹")
            }    
        })
    </script>
十、获取元素

获取元素
@params {selector} 选择器
@params {context} 元素范围
@return 获取到的元素或者元素集合

1、window.getComputedStyle(要获取样式的元素).你要获取的样式属性 IE9 及以上
2、元素.currentStyle.你要获取的样式属性 IE8 及以下

function my$(selector,context){
    context = context || document
    if(selector.indexOf('#') === 0){
        return document.getElementById(selector.slice(1))
    }else if(selector.indexOf('.') === 0){
        return context.getElementsByClassName(selector.slice(1))
    }else{
        return context.querySelectorAll(selector)
    }
}
/*
      兼容处理:
      \+ 事件
      \+ 函数(把函数作为参数给函数使用)
      \+ 需要给绑定的元素
    */
    function addEvent(ele, l, cb){
      if(ele.addEventListener){
        ele.addEventListener(l, cb, false);
      }else{
        //因为在IE低版本的浏览器下是没有事件捕获的
        ele.attachEvent('on'+l, cb);
      }
    }
    addEvent(btn, 'click', function(){
      alert(1);
    });
    addEvent(btn, 'click', function(){
      alert(2);
    });
十一、回调函数:

​ + 回调函数(callback、cb)

​ + 概念:如果把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指的函数时,我们就说这是回调函数。

​ + 理解:把一个函数作为参数给另一个函数使用,把这种情况称之为回调函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值