jQuery中的事件

jQuery中的事件

JavaScript和HTML之间的交互是通过用户和浏览器操作页面所引发的事件来处理的。当文档和它的某些元素发生某些变化或操作时。浏览器会生成一个事件。例如当浏览器装载完一个文档时,会生成事件;当用户点击了某个元素时,也会生成事件。

jQuery中的事件

DOM加载

window.onload $(document).ready()
当网页中的所有元素都加载完毕之后,才执行 只要DOM完全就绪就可以被调用但并不意味着这些元素关联的文件都已经下载完毕

例如当为某一网站的所有图片添加某些行为时,若使用window.onload处理,那么必须等到每一幅图片都加载完成才有效。而$(document).ready()只需要DOM就绪就可以操作。需要注意的是:由于$(document).ready()中注册的事件,只要DOM就绪就可以加载,可能此时元素的关联文件还未加载完。比如和图片相关的HTML已加载完了,并已经解析为DOM,但很可能图片还未加载完,此时对于图片的高度或宽度这样的属性不一定有效。解决方式是使用jQuery中的另一个加载事件的方法--load()

// 下面的两组代码等价
$(window).load(funcition(){...});
window.onload = function(){...};

当$()不带参数时,其默认参数就是'document'。

事件绑定

在文档加载完毕后,若要为元素绑定事件来实现某些操作,可以使用bind()方法。

bind(type[,data],fn);

bind()方法中的第一个参数是事件类型,它包括以下:
blur、focus、laod、risize、scroll、unload、click、dbclick、mousedown、mouseup、mousemove、mouseover、mouseout、mouseenter、mouseleave、change、select、submit、keydown、keypress、keyup、error等,也包括自定义名称。
第二个人参数时作为可选的,作为event.data()属性值传递给事件对象的额外数据对象。
第三个参数则是用来绑定的处理函数。

//html
<h3>什么是jQuery?</h3>
<div style="display: none;">这使得大量的循环结构变得不再必要,从而大幅地减少了代码量
</div>
//js
$(function () {
    $('h3').bind('click',function () {
    var $content = $('div');
       if ($content.is(':visible')){
            $content.hide()
        }else {
            $content.show()
        }
    });
})

合成事件

hover()方法的语法结构

hover(enter,leave);
hover()方法用于模拟光标悬停事件。当光标移到这个元素上时,会触发第一个函数(enter);当光标移除这个元素时,会触发第二个函数(leave);

// 控制鼠标移入移出时文字的显示与隐藏
$(function () {
    $('h3').hover(function () {
        $('div').show();
    },function () {
        $('div').hide();
    });
})

hover()方法准确来说是代替jQuery中的mouseenter与mouseleave的,而不是替代mouseover和mouseout

事件冒泡

什么是事件冒泡

在页面上可以有很多事件,也可以多个元素响应同一个事件。假设网页上有一个元素嵌套在另一个元素中,并且都绑定了click事件,同时body上也绑定了click事件:

// html
<div>
    外层div元素 <br>
    <span style="margin-left: 20px">内层span元素</span> <br>
    外层div元素
</div>
<p id="msg" style="color: #f40"></p>
// js
$('span').click(function (e) {
    var txt = $('#msg').text() + '<p>内层span元素被单击</p>';
    $('#msg').html(txt);
})
$('div').click(function () {
    var txt = $('#msg').text() + '<p>外层div元素被单击</p>';
    $('#msg').html(txt);
})
$('body').click(function () {
    var txt = $('#msg').text() + '<p>最外层body元素被单击</p>';
    $('#msg').html(txt);
})

此时若单击span元素,却会触发三个事件。这就是由于冒泡引起的。之所以叫做冒泡,是因为事件会按照DOM的层次结构像水泡一样不断向上至顶端。

问题所在:本来只想触发span元素的click事件,却同时触发了div与body元素的click事件。为了解决这一问题,进入下列问题探讨。

  1. 事件对象 ==>event
  2. 停止事件冒泡 ==>stopPropagation();
  3. 阻止默认行为。网页中的元素都有自己的默认行为,例如单击超链接后会跳转、单击“提交”按钮后会提交,有时需要组织元素的默认行为。 ==>preventDefault()

如果想同时对事件对象停止冒泡和默认行为,可以在事件处理函数中返回false,这是对在事件对象上同时调用event.preventDefault()和event.stopPropagation()方法的一种简写

  1. 事件捕获,它与事件冒泡的行为刚好是两个相反的过程。并非所有的浏览器都支持事件捕获,这个缺陷无法通过JavaScript修复,jQuery不支持事件捕获。

事件对象属性

  1. event.type 该方法可以获取到事件的类型
  2. event.preventDefault()方法 阻止默认的事件行为
  3. event.stopPropagation()方法 阻止事件冒泡
  4. event.target 获取到触发事件的元素
$("a[href='http://google.com']").click(function () {
    var tg = event.target;
    alert(tg.href);
    return false;
});
  1. event.relatedTarget 在标准DOM中,mouseover和mouseout所发生的元素可以通过event.target来访问,相关元素是 event.relatedTarget
  2. event.pageX和event.pageY 该方法的作用是获取到光标相对于页面的x坐标和y坐标
  3. event.which 该方法的作用是在鼠标单击事件中获取到鼠标的左、中、右键;在键盘事件中获取键盘的按键
  4. event.metaKey 针对不同浏览器对键盘中的ctrl按键的解释不同,jQuery中 规定了event.metaKey为键盘事件中获取ctrl按键

移除事件

unbind()

unbind([type],[data])
第一个参数是事件类型,第二个参数是要移除的函数

具体说明:

  • 如果没有参数,则移除所有事件
  • 如果提供了事件类型作为参数,那么只移除该类型的绑定事件
  • 如果在绑定是传递的处理函数作为第二个参数,则只有这个特定的事件处理函数会被删除
$('#delAll').click(function(){
    $('#btn').unbind('click'); //移除id为btn元素的所有click事件
})

另外对于只需要触发一次,随后就要解除绑定的情况,jQuery提供了一种简写的方法——one()方法。one()方法可以为元素绑定处理函数,当处理函数触发一次后,立即被删除
one(type,[data],fn)

模拟操作

  • 常用模拟
    以上例子都死用户必须通过单击按钮才能触发事件,有时我们需要去模拟用户现在,来达到单击效果,例如在用户进入页面后就触发click而不是通过主动单击。在jQuery中使用trigger()方法来模拟用户操作
  • 触发自定义事件
    trigger()方法不仅能触发浏览器支持的相同名称的事件,还支持自定义名称事件
$('#btn').bind('myClick',function () {
    $('p').append('<p>click Event</p>')
});
$('#btn').trigger('myClick');
  • 传递数据
    trigger(type,[data])方法有两个参数,第一个是要触发事件的类型,第二个是传递给事件处理函数附加的数据,以数组的形式传递
$('#btn').bind('myClick',function (event,msg1,msg2) {
    $('p').append('<p>'+msg1+msg2+'</p>')
});
$('#btn').trigger('myClick',['myclick','event']);

其他用法

  1. 绑定多个事件类型
    可以为元素一次性绑定多个事件类型
$('div').bind('mouseover,mouseout',function () {
    $(this).toggleClass('over');
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容