《jQuery基础教程》学习笔记(一)——jQuery事件

《jQuery基础教程》学习笔记(一)——jQuery事件


一、事件处理程序综述

总的来说,jQuery用于响应网页的加载事件都是通过事件处理程序 $(document).ready() 来处理函数中的代码。因为jQuery是一个基于JavaScript的类库,我们当然可以通过js原生的 window.onload 来实现相同的效果。但是这二者之间在触发的时间上存在细微的差别。具体如下:

  • window.onload 事件只有在文档全部加载完毕后才会触发,而$(document).ready() 事件处理程序在DOM加载完毕后就可以被调用

这样的差异在规模较小的网页中基本感觉不出来有什么不同。但假如一个网页包含上千张图片,如果采用原生的window.onload 方式则要在所有的图片都加载完毕后才会执行,与之不同,$(document).ready()在网页DOM加载完毕后就可以执行。
采用第一种方式,在网页尚未加载完毕的情况下,如果用户已经点击了一些具备默认行为的元素(e.g. 链接),则浏览器会跳转到该链接的目标地址,而不是js捆绑的自定义事件。

  • window.onload 在js中只能被绑定一次,而$(document).ready()可以绑定多个事件。

如果在一个js文件中同时出现了

window.onload = firstEvent;
function firstEvent() {
    //first event...
}
window.onload = secondEvent; 
function secondEvent() {
    //second event...
}

则第二次绑定的事件会覆盖第一个绑定的事件,即待网页全部加载完毕后,只会执行函数 secondEvent() 中定义的行为。而使用$(document).ready() 绑定多个事件后,每次调用这个方法都会向内部行为队列添加一个新的函数,当页面DOM加载完毕后,这些函数会按照之前注册的顺序依次执行。

当给 $(document).ready() 传递一个函数作为参数时,jQuery会隐式地调用 .ready() 方法。即,对于:

$(document).ready(function() {
    //some codes...
});

可以简单写成:

$(function() {
    //some codes...
});

不过我个人喜欢第一种方式,显式地声明 .ready() 方式有助于提醒我jQuery事件执行的时间。


二、事件传播

理解jQuery的事件传播机制能够避免一些意想不到的情况,对此加以利用还可以很好的使用事件委托功能。假设一个HTML页面如下:

<div class="foo">
    <span class="bar">
        <a href="http://www.example.com/">
        The quick brown fox jumps over the lazy dog.
        a>
    span>
    <p>
    How razorback-jumping frogs can level six piqued gymnasts!
    p>
div>

这段代码在浏览器中结构如下:
《jQuery基础教程》学习笔记(一)——jQuery事件_第1张图片

图1 网页结构

如果点击了 元素,那么处于同一位置的它的祖先 元素和

元素都可以响应到点击操作。允许多个网页元素响应同一事件的第一种策略是事件捕获。在事件捕获的过程中,事件首先会交给最外层的元素,接着再交给更具体的元素。在这个例子中,意味着单击事件首先会传递给
,然后是,最后是。如下图所示。
《jQuery基础教程》学习笔记(一)——jQuery事件_第2张图片

图2 事件捕获模型

另一种相反的策略叫做事件冒泡。即当事件发生时,会首先发送给最具体的元素,在这个元
素获得响应机会之后,事件会向上冒泡到更一般的元素。在这个例子中, 会首先处理事件,然后按照顺序依次是

。在DOM标准中同时采取这两种策略:首先,事件要从一般元素到具体元素逐层捕获,然后,事件再通过**冒泡返回**DOM树的顶层。而事件处理程序可以注册到这个过程中的任何一个阶段。
因此, 为了确保跨浏览器的一致性, jQuery始终会在模型的冒泡阶段注册事件处理程序。因此,可以认为在jQuery中最具体的元素会首先获得响应事件的机会。

2.1 事件冒泡的副作用

参考这样一段HTML代码:

<div id="switcher" class="switcher">
    <h3>Style Switcherh3>
    <button id="switcher-default">Defaultbutton>
    <button id="switcher-narrow">Narrow Columnbutton>
    <button id="switcher-large">Large Printbutton>
div>

相应的jQuery代码如下:

$(document).ready(function() {
    $('#switcher').click(function() {
        $('#switcher button').toggleClass('hidden');
    });
});

可以看出,这段代码的本意是当点击

时,内部的三个

你可能感兴趣的:(jQuery)