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>
  • 相关阅读:
    CCF|学生排队|Java
    CCF|分蛋糕|Java
    CCF|公共钥匙盒|Java
    CCF|打酱油|Java
    CCF|游戏|Java
    CCF|最小差值|Java
    CCF|路径解析|Java
    CCF|碰撞的小球
    CCF|跳一跳
    Win10 1803更新UWP无法安装的解决办法|错误代码0x80073D0D
  • 原文地址:https://www.cnblogs.com/xihuanniya/p/9985467.html
Copyright © 2011-2022 走看看