js事件(2)

js事件(2)

    • 如何获取事件对象:

      事件对象e是事件处理函数的参数。IE8不兼容。

      也可以直接在事件处理函数中使用event, 但是FF低版本不兼容。

    • 所以兼容的写法是:

      box.onclick = function(e) {
          e = e || window.event;
      }

    关于事件目标:

    currentTarget: 返回监听节点。即ele.onclick=xxx, 返回的是ele。始终与this相同。

    target: 返回事件的实际目标对象。就是即使ele.onclick=xxx, 返回的有可能是ele的子对象。

    srcElement和target性质相同。

    浏览器兼容性:IE8不支持target. 火狐不支持srcElement.

    兼容的写法:

    box.onclick = function(e) {
        e = e || window.event;
        target = e.target || e.srcElement;
        target.style.xxx = xxx;
    }
  • 关于事件代理:

    又叫事件委托。比如一个ul下有5个li, 每个li上的点击事件,都会通过事件冒泡冒到ul, 所以可以把li上的事件委托给ul处理。

  • 事件代理的优点:提高性能,降低了代码复杂性。尤其是相对于给每个li都添加事件处理函数,可以更好的兼容动态添加li节点的场景。

    关于事件冒泡:

    bubbles, cancenBubble, stopPropagation(), stopImmediatePropagation().

    bubbles: 返回一个布尔值,表示当前事件是否会冒泡,只读。大部分事件都会冒泡,但是focus, scroll, blur等事件不会冒泡。

    stopPropagation(): 表示取消事件的进一步冒泡,无返回值。但是无法阻止同一事件的其他监听函数被调用。(dom2的多个addEventLinstener, 不能同时阻止)

      <script>
      window.onload = function () {
      var btn = document.getElementById('btn')
      btn.addEventListener('click', function (e) {
      e = e || window.event;
      btn.style.backgroundColor = 'red'
      e.stopPropagation()
      });
      btn.addEventListener('click', function (e) {
      e = e || window.event;
      btn.innerHTML = '点击了';
      });
      document.body.addEventListener('click', function (e) {
      e = e || window.event;
      console.log('点击了body')
      });
      }
      </script>

      stopImmediatePropagation(): 既阻止冒泡,又阻止其他监听器。

      cancelBubble: 阻止冒泡,可读写,默认为false, 如果设置为true, 可以取消事件的冒泡。全浏览器支持。stopPropagation/stopImmediatePropagation在IE8中不兼容。

      兼容写法:

      var handler = function(e) {
          e = e || window.event;
          if (e.stopPropagation {
              e.stopPropagation();
          } else {
              e.cancelBubble = true;
          }
      }

      事件流阶段:

      e.eventPhase: 0 事件未发生 1 事件捕获阶段 2 目标阶段 3. 冒泡阶段

      取消默认事件:

      <a href=’javascript:void(0);’>test</a>

      <a href=’javascript:;’>test</a>

      js中有两种方式取消默认行为,preventDefault和returnValue

      1. 1. preventDefault:
    1. btn.onclike = function(e) {
          e = e || window.event;
          e.preventDefault();
          this.innerHTML = 'changed';
      }
    2. 2. returnValue

    3. btn.onclike = function(e) {
          e = e || window.event;
          e.returnValue = false;
          this.innerHTML = 'changed';
      }

      3. 兼容性写法

      btn.onclike = function(e) {
          e = e || window.event;
          if (e.preventDefault) { //非IE8及以下
              e.preventDefault();
          } else {
              e.returnValue = false; // IE8及以下
          }
          this.innerHTML = 'changed';
      }

      最后,return false, 全浏览器兼容。

      事件对象的坐标位置:

      clientX/Y, x/y, offsetX/Y, screenX/Y,pageX/Y

      clientX/Y 和x/y: 相对于浏览器有效区域的x轴/y轴的距离

      offsetX/Y: 相对于事件源的左上角的x轴/y轴的距离

      screenX/Y: 相对于显示器屏幕的x轴和y轴的距离

      pageX/Y: 相对于页面左上角的x轴/y轴的距离,在出现滚动条的时候跟clientX/Y不同

      发表回复

      *您的电子邮件地址不会被公开。必填项已标记为 。

      *
      *