zoukankan      html  css  js  c++  java
  • jQuery基础(4)- 位置信息、事件流、事件对象、事件代理、jquery事件

    一、jQuery的位置信息

    jQuery的位置信是JS的client系列、offset系列、scroll系列封装好的一些简便api。

    1、宽度和高度

           a、获取宽度和高度,例如:      

      .width()  // 获取匹配元素集合中的第一个元素的宽度值,内容宽度,不含padding
      .height()  // 获取匹配元素集合中的第一个元素的高度值,内容高度,不含padding

           注意:这个方法不接受任何参数。.css(‘width’)(或.css(‘height’))和 .width()(或.height())之间的区别是后者返回一个没有单位的数值(例如,400),前者是返回带有完整单位的字符串(例如,400px)。当一个元素的宽度(或高度)需要数学计算的时候推荐使用.width()(或.height()) 方法。

           b、设置宽度和高度,例如:  

      .width(value)  // 给每个匹配的元素设置宽度,value为数字,不带单位
      .height(value)  //给每个匹配的元素设置高度,value为数字,不带单位

    2、innerWidth()和innerHeight()

           a、获取内部宽和高,例如: 

      .innerWidth()  // 获取匹配元素集合中第一个元素的宽度值,含padding,不含border
      .innerHeight()  // 获取匹配元素集合中第一个元素的高度值,含padding,不含border

           注意:这种方法不适用于window 和 document对象,对于这些对象可以使用.width()和.height()代替。

           b、设置内部宽和高,例如:

        .innerWidth(value)  // 给每个匹配的元素设置内部宽度,value为数字,不带单位
        .innerHeight(value)  //给每个匹配的元素设置内部高度,value为数字,不带单位

    3、outerWidth()和outerHeight()

           a、获取外部宽和高

      // 获取匹配元素集合中第一个元素的外部宽度(包括padding,border和可选的margin)
      .outerWidth([includeMargin])
      // 获取匹配元素集合中第一个元素的外部高度(包括padding,border和可选的margin)
      .outerHeight([includeMargin])

                  参数includeMargin:类型是布尔值,默认为false,表示不包含margin值。

                  注意:这个方法不适用于window 和 document对象,对于这些对象可以使用.width()和.height()代替。

           b、设置外部宽和高

      .outerWidth(value)  // 给每个匹配的元素设置内部宽度,value为数字,不带单位
      .outerHeight(value)  //给每个匹配的元素设置内部高度,value为数字,不带单位

    4、偏移

           a、获取偏移量,例如:

      .offset()  // 返回一个包含top和left属性的Object对象

           描述:在匹配的元素集合中,获取的第一个元素的当前坐标,坐标相对于文档,与父相子绝无关。

           注意:jQuery不支持获取通过display:none隐藏元素的偏移坐标。同样的,也无法取得隐藏元素的 border, margin, 或 padding 信息。若元素的属性设置的是 visibility:hidden,那么我们依然可以取得它的坐标。

           b、设置偏移量,例如: 

      .offset({ top: 10, left: 30});  // 设置匹配的元素集合中每一个元素的坐标,坐标相对于文档

    5、元素坐标

      .position()  // 返回一个包含top和left属性的Object对象

           描述:描述获取匹配元素中第一个元素的当前坐标,相对于offset parent的坐标 (offset parent指离该元素最近的而且被定位过的祖先元素 )。

           注意:当把一个新元素放在同一个容器里面另一个元素附近时,用.position()更好用。

    6、滚动距离

           a、获取水平方向滚动距离和垂直方向滚动距离,例如:

      .scrollLeft() // 获取匹配元素集合中第一个元素的当前水平滚动条的位置(页面卷走的宽度)
      .scrollTop() // 获取匹配的元素集合中第一个元素的当前迟滞滚动条的位置(页面卷走的高度)

           b、设置水平方向滚动距离和垂直方向滚动距离,例如:

      .scrollLeft(value)  // 设置每个匹配元素的水平方向滚动条位置
      .scrollLeft(value)  // 设置每个匹配元素的垂直方向滚动条位置

    二、JS的事件流的概念

    1、事件的概念

           HTML中与javascript交互是通过事件驱动来实现的,例如鼠标点击事件onclick、页面的滚动事件onscroll等等,可以向文档或者文档中的元素添加事件侦听器来预订事件。想要知道这些事件是在什么时候进行调用的,就需要了解一下“事件流”的概念。

    2、什么是事件流

           事件流描述的是从页面中接收事件的顺序。

    3、事件流的由来(了解)

           由于微软和网景乱搞,后来必须要为事件传播机制,制定一个标准,因为事件捕获是网景公司开发出来的,而事件冒泡是由微软公司开发出来的,它们都想要自己的技术成为标准,所以导致这两个公司老是干架,制定标准的人为了不让它们干架,所以研发了事件流。

    4、”DOM2级事件”规定的事件流包括三个阶段:

      ①事件捕获阶段:事件捕获和事件冒泡是相反的,也就是说,当用户触发了一个事件的时候,这个事件是从DOM树的最上层开始触发一直到捕获到事件源;

      ②处于目标阶段:事件在目标元素上发生并处理,但是事件处理会被看成是冒泡阶段的一部分;

      ③事件冒泡阶段:官方的定义就是从最特定的事件目标到最不特定的事件目标,意思就是说,加入用户单击了一个元素,,该元素拥有一个click事件,那么同样的事件也将会被它的祖先触发,这个事件从该元素开始一直冒泡到DOM树的最上层,这一过程称为事件冒泡;

    5、事件流的写法以及实现方式

           a、标准实现方式是使用关键词addEventListener,假如你想给某元素添加/删除事件,可以这样写: 

      element.addEventListener(eventType, fn, false);
      element.removeEventListener(eventType, fn, false);

      参数解释:

        eventType:表示要使用哪种事件类型,比如click;

        fn:回调函数,里面写触发此事件你要做什么事情;

        false:事件机制,分为冒泡和捕获,false表示事件冒泡,true表示事件捕获;

           b、既然有标准的实现方式,那么肯定也存在着非标准的写法,如下:

      element.attachEvent(eventType, fn);   // 这种写法兼容IE, IE没有实现事件捕获
      element.detachEvent(eventType, fn);

      参数解释:

        eventType:事件类型;

        fn:回调函数;

           c、冒泡和捕获的示例,如下:

               
      <button id="btn">按钮</button>
      <script>
        window.onload = function(){
          var oBtn = document.getElementById('btn');
    
              document.addEventListener('click',function(){
                console.log('document处于事件捕获阶段');
              }, true);
    
              document.documentElement.addEventListener('click',function(){
                  console.log('html处于事件捕获阶段');
              }, true);
    
              document.body.addEventListener('click',function(){
                  console.log('body处于事件捕获阶段');
              }, true);
    
              oBtn.addEventListener('click',function(){
                  console.log('btn处于事件捕获阶段');
              }, true);
    
              oBtn.addEventListener('click',function(){
                  console.log('btn处于事件冒泡阶段');
              }, false);
    
              document.body.addEventListener('click',function(){
                  console.log('body处于事件冒泡阶段');
              }, false);
    
              document.documentElement.addEventListener('click',function(){
                  console.log('html处于事件冒泡阶段');
              }, false);
    
              document.addEventListener('click',function(){
                  console.log('document处于事件冒泡阶段');
              }, false);
          };
        </script>
        <!--
        控制台输出结果如下:
        document处于事件捕获阶段
        html处于事件捕获阶段
        body处于事件捕获阶段
        btn处于事件捕获阶段
        btn处于事件冒泡阶段
        body处于事件冒泡阶段
        html处于事件冒泡阶段
        document处于事件冒泡阶段
        -->

    三、事件对象

           什么是事件对象?在触发DOM上的事件时都会产生一个对象。

    1、认识事件对象

           事件在浏览器中是以对象的形式存在的,即event。触发一个事件,就会产生一个事件对象event,该对象包含着所有与事件有关的信息。包括导致事件的元素、事件的类型以及其他与特定事件相关的信息。

           例如:鼠标操作产生的event中会包含鼠标位置的信息;键盘操作产生的event中会包含与按下的键有关的信息。

           所有浏览器都支持event对象,但支持方式不同,在DOM中event对象必须作为唯一的参数传给事件处理函数,在IE中event是window对象的一个属性。

    2、什么时候产生事件对象?

           当触发某个事件的时候,这个事件的回调函数的形参会默认接收一个event事件对象。

    3、DOM中的事件对象

           DOM0级和DOM2级事件处理程序都会把event作为参数传入。

           根据习惯:可以用e,或者ev或者event。

           DOM中事件对象重要属性和方法:

    属性

    描述

    type

    用于获取事件类型

    target

    用于获取事件目标,即事件加在哪个元素上

          

    方法

    描述

    stopPropagation()

    用于阻止事件冒泡

    preventDefault()

    阻止事件的默认行为(移动端用的多)

    4、IE中的事件对象

           第一种情况: 通过DOM0级方法添加事件处理程序时,event对象作为window对象的一个属性存在。

           第二种情况:通过attachEvent()添加的事件处理程序,event对象作为参数传入。

           IE中事件对象重要属性和方法:

    属性

    描述

    type

    用于获取事件类型

    srcElement

    用于获取事件目标,即事件加在哪个元素上

    cancelBubble

    用于阻止事件冒泡,是属性(true表示阻止)

    returnValue

    用于阻止事件的默认行为,是属性(false表示阻止)

    5、Event对象的一些兼容性写法(了解)

           a、获得event对象兼容性写法,如下:

        event || (event = window.event);

           b、获得target兼容型写法,如下:

        event.target||event.srcElement;

           d、阻止冒泡兼容性写法,如下:

        event.stopPropagation ? event.stopPropagation() : (event.cancelBubble =true);

           c、阻止浏览器默认行为兼容性写法,如下:

        event.preventDefault ? event.preventDefault() : (event.returnValue = false);

    四、事件委托(事件代理)

           通俗的讲,onclick、onmouseover、onmouseout等就是事件,委托,就是让别人来做,这个事件本来是加在某些元素上的,然而我们可以加到别人身上,来完成这个事件。

    1、原理

           利用冒泡的原理,把事件加到父级上,触发执行效果。

    2、作用

           a、性能要好;

           b、针对新创建的元素,直接可以拥有事件;

    3、事件源

           跟this作用一样(他不用看指向问题,谁操作的就是谁),event对象下的。

    4、使用情景

           a、为DOM中的很多元素绑定相同事件;

           b、为DOM中尚不存在的元素绑定事件;

    5、语法:.on( events [, selector ] [, data ], handler(eventObject))

      参数解释:

        events:String类型,一个或多个空格分隔的事件类型;

        selector:String类型,选择器字符串,用于过滤出被选中的元素中能触发事件的后代元素;

        data:任意类型,当一个事件被触发时,要传递给事件处理函数的event.data;

        handler(eventObject):Function类型,事件被触发时,执行的函数;

      描述:在选定的元素上绑定一个或多个事件处理函数。

      示例:

      <ul>
            <li>第一项</li>
            <li>第二项</li>
        </ul>
    
        <script>
            $(function () {
                // 现有的li和未来添加的li都能做事件操作
                $('ul').on('click','li',function () {
                  alert(this.innerText);
              });
              $('ul').append('<li>第三项</li>');
           })
        </script>

    五、jquery常用的事件

           jquery常用的事件,大家一定要熟记在心,如下:

    事件

    描述

    click()

    鼠标单击触发事件

    dblclick()

    鼠标双击触发事件

    mousedown()/mouseup()

    鼠标按下/弹起触发事件

    mousemove()

    鼠标移动

    mouseover()/mouseout()

    鼠标移入/移出触发(包含被选元素和其子元素)

    mouseenter()/mouseleave()

    鼠标移入/移出触发(只在穿过/离开被选元素时触发)

    hover()

    hover(fn1,fn2)分别当鼠标指针进入和离开元素时执行

    focus()/blur()

    表单控件聚焦/失去焦点时触发

    keydown()/keyup()

    键盘按下/弹起时触发

    change()

    表单元素发生改变时触发

    select()

    文本元素发生改变时触发事件

    submit()

    表单提交时触发

    六、解决单双击冲突问题

           知识铺垫:两次点击间隔小于300ms为双击,所以考虑利用定时器解决,如下:

      <button>按钮</button>
    
      <script>
            var timer = null;
            $('button').click(function () {
                clearTimeout(timer);  // 开定时器之前先关定时器
                timer = setTimeout(function () {
                    console.log('单击了');
                },300)
            });
    
            $('button').dblclick(function () {
                clearTimeout(timer);
                console.log('双击了');
            });
      </script>

    七、应用:回到顶部代码示例:

      <div class="fixTop">回到顶部</div>
    
      <script>
            $(function () {
                $('.fixTop').click(function(event) {
                    $('html,body').animate({
                        'scrollTop':0
                    },1000)
                });
            });
      </script>
  • 相关阅读:
    多重背包POJ1276不要求恰好装满 poj1014多重背包恰好装满
    哈理工1053完全背包
    求最小公倍数与最大公约数的函数
    Bus Pass ZOJ 2913 BFS 最大中取最小的
    POJ 3624 charm bracelet 01背包 不要求装满
    HavelHakimi定理(判断一个序列是否可图)
    z0j1008Gnome Tetravex
    ZOJ 1136 Multiple BFS 取模 POJ 1465
    01背包 擎天柱 恰好装满 zjut(浙江工业大学OJ) 1355
    zoj 2412 水田灌溉,求连通分支个数
  • 原文地址:https://www.cnblogs.com/li-li/p/9756913.html
Copyright © 2011-2022 走看看