zoukankan      html  css  js  c++  java
  • javascript之事件详解

    绑定事件处理
    1.ele.onxxxx = function() {}
    兼容性很好,但是一个元素上同一事件只能绑定一次处理函数
    等同于写在HTML的行间上
    this指向dom

    2.ele.addEventListener(type, fn, false)
    IE9以下不兼容,可以在一个事件上绑定多个处理函数
    this指向dom

    3.ele.attachEvent('on' + type, fn)
    IE独有,一个事件可以绑定多个处理函数
    this指向window

    封装兼容性的addEvent(elem, type, handle)

    function addEvent(elem, type, handle) {
      if(elem.addEventListener) {
        elem.addEventListener(type, handle, false)
      }else if(elem.attachEvent) {
        elem.attachEvent('on' + type, function() {
          handle.call(elem)
        })
      }else {
        elem['on' + type] = handle
      }
    }

    解除事件绑定
    1.elem.onxxx = false/''/null

    2.elem.removeEventListener(type, fn, false)

    3.elem.detachEvent('on' + type, fn)

    若绑定匿名函数无法解除

    事件处理模型
    1.冒泡
    结构上(非视觉上),同一事件,子元素会冒泡向父元素(自底向上)

    2.捕获
    结构上(非视觉上),同一事件,父元素会捕获向子元素(事件源元素)(自上向底)
    ele.addEventListener(type, fn, true)

    IE上没有捕获

    触发顺序,先捕获,后冒泡,同一事件源按注册顺序来

    focus blur change submit reset select等事件不能冒泡

    取消冒泡和阻止默认事件

    取消冒泡
    W3C标准 event.stopPropagation(),但不支持IE9以下
    IE独有 event.cancelBubble = true
    封装取消冒泡函数 stopBubble(event)

    function stopBubble(event) {
      if(event.stopPropagation) {
        event.stopPropagation()
      }else {
        event.cancelBubble = true    
      }
    }

    阻止默认事件
    默认事件--表单提交,a标签跳转,右键菜单等
    1.return false; 以对象属性的方式注册的事件才生效
    2.event.preventDefault(); W3C标准,IE9以下不兼容
    3.event.returnValue = false; 兼容IE
    封装阻止默认事件函数 cancelHandler(event)

    function cancelHandler(event) {
      if(event.preventDefault) {
        event.preventDefault();
      }else {
        event.returnValue = false
      }
    }

    事件源对象
    event || window.event 用于IE
    事件源对象
    event.target 火狐只有这个
    event.srcElement IE只有这个
    这俩chrome都有

    兼容性写法
    var event = event || window.event
    var target = event.target || event.srcElement

    事件委托
    利用事件冒泡,和事件源对象进行处理
    优点
    1.性能。不需要循环所有的元素进行一个一个绑定事件
    2.灵活。当有新的子元素时不需要重新绑定事件

    请看下面例子

    <ul>
      <li>1</li>
      <li>2</li>
      <li>3</li>
      <li>4</li>
      <li>5</li>
      <li>6</li>
      <li>7</li>
      <li>8</li>
      <li>9</li>
      <li>10</li>
    </ul>
    <script type="text/javascript">
      var ul = document.getElementsByTagName('ul')[0]
      ul.onclick = function(e) {
        var event = event || window.event
        var target = event.target || event.srcElement
        console.log(target.innerText)
      }
      //即点击li是会事件冒泡到ul上,处理ul的点击事件,来获得li的内容,这样就是事件委托
    </script>

    事件分类
    click, mousedown, mousemove, mouseup, contextmenu, mouseover, mouseout, mouseenter, mouseleave(H5标准)
    用button来区分鼠标的按键 0/1/2
    e.button == 2 'right' e.button == 0 'left'
    DOM3标准规定:click事件只能监听左键,只能通过mousedown和mouseup来判断鼠标按键
    如何解决click和mousedown点击冲突 (设置mousedown和mouseup之间的时间差来区分click)

    键盘事件
    onkeypress onkeydown onkeyup
    keydown > keypress > keyup
    keydown和keypress区别
    keydown可以响应任何键盘按键,keypress只可响应字符类键盘按键
    keypress返回Ascall码,可以转换相应字符

    文本类事件
    input focus blur

    事件分类
    窗体操作类(windows上的事件)
    scroll load(无意义)

    end !!!

  • 相关阅读:
    Office365激活(无需密钥,无需下载软件)
    java垃圾回收及其优化
    Kafka副本机制
    sdn的相关学习系列之一mininet的安装
    javascript day 02
    关于javaScript
    html-day06
    盒子模型
    html-day04
    html--笔记day03
  • 原文地址:https://www.cnblogs.com/lyjfight/p/13830418.html
Copyright © 2011-2022 走看看