zoukankan      html  css  js  c++  java
  • jquery学习(五)-jquery中的事件

    参考锋利的jQuery第二版

    1.加载DOM

    1)执行时机

    若想为某个DOM元素绑定事件(或者是其他操作),这需要文档加载完成后才能进行绑定(或其他操作),否则会报错。所以对于这种情况,javascript提供了,window.onload方法;而jQuery提供了,$(document).ready()(简写为$())方法。

    虽然这两个方法有类似的功能,但是执行的时机方面还是有区别的。Window.onload方法是在网页所有的元素(包括元素的所有关联文件)完全加载到浏览器后才能执行,即javascript此时才能访问页面中的任何元素。而通过jQuery$(document).ready()方法注册事件处理程序,在DOM完全就绪时就可以调用,此时网页的所有元素对于jQuery来说都是可以访问的,但这并不意味着这些元素关联文件已经下载完成。

    例如有一个大型的图片库,为网页中的图片添加某些行为(点击图片显示和隐藏切换),如果使用window.onload方法,那么需要等到每一张图片都加载完成后才能进行操作。如果使用jQuery$(document).ready方法,则只需要DOM加载就绪就可以进行操作,无需等待所有图片都加载完毕。

    虽然使用使用jQuery$(document).ready方法能提供效率,但是有时候我们需要等待资源完全加载完成后在进行操作,这时jQuery提供了$(window).load()方法,这等价于原生javascriptwindow.onload方法。

    (2)多次使用

    Window.onload方法不能编写多个,如果存在多个,那么最后一个会覆盖前面的,代码如下:

    Function one(){

    Alert(“one”);

    }

    Function two(){

    Alert(“two”);

    }

    Window.onload=one;

    Window.onload=two;

    这里只会弹出“two”对话框。

    $(document).ready()方法能多次使用,每次调用$(document).ready()时,都会在现有的行为上追加新的行为,这些行为函数会根据注册的顺序依次执行。

    $(document).ready(function(){

    one();

    });

    $(document).ready(function(){

    two();

    });

    这里会先弹出“one”对话框,然后弹出“two”对话框。

    2.事件绑定

    bind( type [,data] ,fn)   type:事件类型;data可选参数,作为event.data属性值传递给事件对象的额外数据对象;fn事件处理函数。它和ready方法一样,可以多次调用。

    3.合成事件

    jQuery有两个合成事件,分别是hover()方法和toggle()方法。

    hover()方法的语法结构为:

    hover(enter ,leave)  第一个函数(enter),当光标移动到元素上面时触发;第二个函数(leave),当光标离开元素时触发。

    toggle()方法语法结构:

    toggle(fn1 ,fn2 ,fn3 ,....... ,fnn)该方法用于模拟鼠标连续点击事件。第一次点击元素时,触发fn1;第二次点击该元素时,触发fn2,;如果有更多函数,则依次调用,直到最后一个。之后每次点击都会对这几个函数轮番调用。

    4.事件冒泡

    说到事件冒泡,不得不先说同心圆的问题。说白了,就是说一个页面上面有n个同心圆,如果点击最里面的那个圆,那么实际上是点击了所有的圆。若是为每一个圆绑定了click事件,那么根据事件冒泡机制,就会依次触发所有的事件。如下图:

     

    会依次触发click1click2click3click4.等等。如果想要只触发当前点击元素的事件,则需要阻止事件冒泡行为(event.stopPropagation())。

    4.默认事件

    网页中的元素也有自己的默认行为,如单击超链接后会跳转,点击提交按钮后表单会被提交。有时候我们并不希望触发这些默认的行为,这是jQuery提供了event.preventDefault()方法类阻止元素的默认行为。(还可以通过return false来阻止默认事件和事件冒泡,推荐用这个)

    5.事件对象属性

    event.type

    获取事件的类型

    event.preventDefault()

    阻止默认事件

    event.stopPropagation()

    阻止事件冒泡

    event.target

    获取触发的元素

    event.pageX,event.pageY

    分别表示页面的xy坐标。当时IE浏览器是为event.x/event.y,FireFox下为event.pageX/event.pageY。通过jQuery封装统一为event.pageX,event.pageY

    event.which

    在鼠标的点击事件中,获取鼠标的左、中、右键。

    1-左键

    2-中键

    3-右键

    event.metaKey

    针对不同浏览器对键盘的ctrl键解释不同,jQuery进行封装,并规定event.metaKey为键盘事件中获取ctrl按键。

    6.移除事件

    unbind(type [,data]),type为参数类型,data为绑定的事件处理函数。

    (1)当没有参数是,则删除所有绑定的事件;

    (2)当只穿事件类型(type)参数时,则只删除该类型的绑定事件;

    (3)如果来那个参数都传,则只会删除该事件类型下所绑定的对于事件处理函数;

    7.模拟操作

    (1)常用模拟

    jQuery中通过trigger方法来完成模拟操作。

    如下是触发idbtn的按钮的click事件:

    $(“#btn”).trigger(“click”);

    (2)触发自定义事件

    该方法还可以触发自定义名称的事件,如:

    $(“#btn”).bind(“myClick”,function(){

    alert(“hello wrod”);

    })

    $(“#btn”).trigger(“myClick”);

    (3)传递数值

    trigger(type [,data]),type触发事件的类型,传递给事件处理函数的附加函数,以数组的形式传递。如下代码:

    $(“#btn”).bind(“myClick”,function(evant, messagel1,messagel2){

    alert(messagel1+messagel2);

    })

    $(“#btn”).trigger(“myClick”,[“hello”,”Eric”]); //alert出 helloEric;

    (4)执行默认操作

    trigger()方法触发事件后,会执行浏览器默认的操作。

    如: $(“input”).trigger(“focus”);

    以上代码不仅会触发绑定在input元素上的focus事件,还会使得元素本身获取焦点(浏览器默认操作)。

    如果只想触发绑定的focus事件,不想执行浏览器默认的操作,可以是有jQuery的另外一个方法——triggerHandler()方法。

    $(“input”).triggerHandler(“focus”),这样仅仅会触发绑定的focus事件,如何执行浏览器默认的操作。

    8.事件委托

    Html代码如下:

    <ul>

    <li>1</li>

    <li>2</li>

    <li>3</li>

    <li>4</li>

    </ul>

    若想为上面的li绑定click事件处理程序,并且希望后续添加的li元素也具有该事件,这时我们可以考虑使用事件委托的方式实现,这样不仅书写方便,性能方面也大大提高。

    用delegate方法

    $("ul").delegate("li","click",function(){/*显示更多信息*/});

    也可以使用on方法

    $("ul").on("click","li",function(){/*显示更多信息*/});

    9.其他用法

    (1)可以绑定多个事件类型:

    如下代码:

    $(“#myDiv”).bind(“mouseover  mouseout”,function(){

    //执行代码

    });

    (2)可以为事件添加命名空间,便于管理

    如下代码:

    $(“#myDiv”).bind(“click.plugin”,function(){

    //执行代码

    });

    $(“#myDiv”).bind(“mouseover.plugin”  mouseout”,function(){

    //执行代码

    });

    $(“#myDiv”).bind(“dbclickmouseout”,function(){

    //执行代码

    });

    //移除命名空间为“plugin”的事件,即移除clickmouseover事件

    $(“#myDiv”).unbind(“.plugint”);

    (3)相同事件名称,不同命名空间执行方法

    $(“#myDiv”).trigger(“click!”);//触发所有不包含在命名空间的click方法。

  • 相关阅读:
    从Prism中学习设计模式之Event Aggregator 模式
    Apache的HttpClient调用Https忽略证书校验
    SaltStack安装及API开启
    Java连接WebSocket服务忽略证书校验
    SpringBoot实现WebSocket服务
    MySQL主从复制搭建
    Matlab基础知识(持续更新中)
    FIFO基础知识
    图像常识知识
    VC调试记录(持续更新中)
  • 原文地址:https://www.cnblogs.com/hcw136156133/p/5049926.html
Copyright © 2011-2022 走看看