前端jQuery的事件冒泡与捕获

前端jQuery的事件冒泡与捕获

关键词:前端、jQuery、事件冒泡、事件捕获、事件处理

摘要:本文深入探讨了前端jQuery中的事件冒泡与捕获机制。首先介绍了事件冒泡与捕获的背景知识,包括目的、预期读者和文档结构等。接着详细阐述了核心概念,通过文本示意图和Mermaid流程图直观展示其原理和架构。在核心算法原理部分,使用Python代码进行了类比讲解。同时给出了相关的数学模型和公式,并举例说明。项目实战部分提供了代码实际案例及详细解释。此外,还介绍了事件冒泡与捕获的实际应用场景,推荐了相关的工具和资源。最后对未来发展趋势与挑战进行了总结,并提供了常见问题与解答以及扩展阅读和参考资料,帮助读者全面理解和掌握jQuery中的事件冒泡与捕获。

1. 背景介绍

1.1 目的和范围

在前端开发中,事件处理是至关重要的一部分。jQuery作为一个广泛使用的JavaScript库,提供了强大的事件处理功能。事件冒泡与捕获是事件处理机制中的两个重要概念,理解它们对于开发者编写高效、稳定的前端代码至关重要。本文的目的是深入讲解jQuery中的事件冒泡与捕获机制,包括其原理、实现方式、应用场景等,范围涵盖了从基础概念到实际项目应用的各个方面。

1.2 预期读者

本文预期读者为有一定前端开发基础,了解HTML、CSS和JavaScript基础知识,并且对jQuery有一定使用经验的开发者。无论是初级开发者想要深入学习事件处理机制,还是有经验的开发者想要回顾和巩固相关知识,都可以从本文中获得有价值的信息。

1.3 文档结构概述

本文将按照以下结构进行组织:首先介绍事件冒泡与捕获的核心概念和联系,通过示意图和流程图帮助读者直观理解;接着讲解核心算法原理和具体操作步骤,使用Python代码进行类比说明;然后给出相关的数学模型和公式,并举例解释;项目实战部分将提供实际的代码案例和详细解读;之后介绍事件冒泡与捕获的实际应用场景;再推荐一些学习和开发相关的工具和资源;最后总结未来发展趋势与挑战,提供常见问题与解答以及扩展阅读和参考资料。

1.4 术语表

1.4.1 核心术语定义
  • 事件冒泡(Event Bubbling):事件从最具体的元素(触发事件的元素)开始,逐层向上传播到更不具体的元素(父元素),直到文档根元素。
  • 事件捕获(Event Capturing):事件从文档根元素开始,逐层向下传播到最具体的元素(触发事件的元素)。
  • 事件目标(Event Target):触发事件的具体元素。
  • 事件对象(Event Object):包含了与事件相关的信息,如事件类型、触发元素等。
1.4.2 相关概念解释
  • 事件处理程序(Event Handler):是一个函数,当特定事件发生时会被调用。在jQuery中,可以使用on()方法绑定事件处理程序。
  • 事件委托(Event Delegation):利用事件冒泡的原理,将事件处理程序绑定到父元素上,当子元素触发事件时,事件会冒泡到父元素,从而由父元素的事件处理程序进行处理。
1.4.3 缩略词列表
  • DOM:Document Object Model,文档对象模型,是一种用于表示HTML或XML文档的树形结构。
  • API:Application Programming Interface,应用程序编程接口,是一组用于与软件组件进行交互的规则和工具。

2. 核心概念与联系

2.1 事件冒泡原理

事件冒泡是事件在DOM树中传播的一种方式。当一个元素上的事件被触发时,该事件会从该元素开始,依次向上传播到其父元素、祖父元素,直到文档根元素(document)。例如,当我们点击一个按钮时,事件首先在按钮元素上触发,然后依次传播到按钮的父元素、父元素的父元素,直到document对象。

下面是一个简单的HTML结构示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Event Bubbling Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="outer">
        <div id="middle">
            <button id="inner">Click me</button>
        </div>
    </div>
    <script>
        $(document).ready(function() {
            $('#inner').on('click', function() {
                console.log('Inner button clicked');
            });
            $('#middle').on('click', function() {
                console.log('Middle div clicked');
            });
            $('#outer').on('click', function() {
                console.log('Outer div clicked');
            });
        });
    </script>
</body>
</html>

当点击按钮时,控制台会依次输出:

Inner button clicked
Middle div clicked
Outer div clicked

这就是事件冒泡的过程,事件从最内层的按钮元素开始,依次向上传播到父元素。

2.2 事件捕获原理

事件捕获是事件传播的另一种方式,与事件冒泡相反。事件捕获从文档根元素开始,逐层向下传播到最具体的元素(触发事件的元素)。在现代浏览器中,事件捕获默认是禁用的,但可以通过addEventListener()方法的第三个参数设置为true来启用。

在jQuery中,虽然没有直接提供事件捕获的方法,但可以通过原生JavaScript来实现类似的效果。下面是一个简单的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Event Capturing Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="outer">
        <div id="middle">
            <button id="inner">Click me</button>
        </div>
    </div>
    <script>
        var outer = document.getElementById('outer');
        var middle = document.getElementById('middle');
        var inner = document.getElementById('inner');

        outer.addEventListener('click', function() {
            console.log('Outer div clicked (capturing)');
        }, true);
        middle.addEventListener('click', function() {
            console.log('Middle div clicked (capturing)');
        }, true);
        inner.addEventListener('click', function() {
            console.log('Inner button clicked (capturing)');
        }, true);
    </script>
</body>
</html>

当点击按钮时,控制台会依次输出:

Outer div clicked (capturing)
Middle div clicked (capturing)
Inner button clicked (capturing)

这就是事件捕获的过程,事件从最外层的元素开始,依次向下传播到最内层的元素。

2.3 文本示意图

下面是一个简单的文本示意图,展示了事件冒泡和事件捕获的过程:

事件捕获方向
|----------------------|
| document             |
|  |- html             |
|     |- body          |
|        |- outer div  |
|           |- middle div |
|              |- inner button |
|----------------------|
事件冒泡方向

2.4 Mermaid流程图

graph LR
    classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px;
    classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px;

    A([Document]):::startend --> B(HTML):::process
    B --> C(Body):::process
    C --> D(Outer Div):::process
    D --> E(Middle Div):::process
    E --> F(Inner Button):::process
    F --> E
    E --> D
    D --> C
    C --> B
    B --> A
    A1([开始捕获]):::startend --> A
    F1([事件触发]):::startend --> F
    F2([结束冒泡]):::startend <-- A

该流程图展示了事件捕获从Document开始,逐层向下传播到Inner Button,然后事件冒泡从Inner Button开始,逐层向上传播到Document的过程。

3. 核心算法原理 & 具体操作步骤

3.1 事件冒泡算法原理

事件冒泡的算法原理可以简单描述为:当一个事件在某个元素上触发时,浏览器会将该事件封装成一个事件对象,并从该元素开始,依次向上查找其父元素,直到文档根元素。在查找过程中,会检查每个元素是否绑定了与该事件类型相同的事件处理程序,如果绑定了,则调用该事件处理程序。

下面是一个使用Python代码类比实现事件冒泡的示例:

class Element:
    def __init__(self, name, parent=None):
        self.name = name
        self.parent = parent
        self.event_handlers = {}

    def add_event_handler(self, event_type, handler):
        if event_type not in self.event_handlers:
            self.event_handlers[event_type] = []
        self.event_handlers[event_type].append(handler)

    def trigger_event(self, event_type):
        if event_type in self.event_handlers:
            for handler in self.event_handlers[event_type]:
                handler()
        if self.parent:
            self.parent.trigger_event(event_type)

# 创建元素
document = Element('document')
html = Element('html', document)
body = Element('body', html)
outer_div = Element('outer_div', body)
middle_div = Element('middle_div', outer_div)
inner_button = Element('inner_button', middle_div)

# 添加事件处理程序
def inner_button_click():
    print('Inner button clicked')

def middle_div_click():
    print('Middle div clicked')

def outer_div_click():
    print('Outer div clicked')

inner_button.add_event_handler('click', inner_button_click)
middle_div.add_event_handler('click', middle_div_click)
outer_div.add_event_handler('click', outer_div_click)

# 触发事件
inner_button.trigger_event('click')

在这个示例中,我们定义了一个Element类来表示DOM元素,每个元素可以添加事件处理程序。当一个元素触发事件时,会先调用自身的事件处理程序,然后递归调用其父元素的事件处理程序,模拟了事件冒泡的过程。

3.2 事件捕获算法原理

事件捕获的算法原理与事件冒泡相反,当一个事件触发时,浏览器会从文档根元素开始,依次向下查找该元素的父元素和子元素,直到找到触发事件的元素。在查找过程中,会检查每个元素是否绑定了与该事件类型相同的事件处理程序,如果绑定了,则调用该事件处理程序。

下面是一个使用Python代码类比实现事件捕获的示例:

class Element:
    def __init__(self, name, parent=None):
        self.name = name
        self.parent = parent
        self.event_handlers = {}

    def add_event_handler(self, event_type, handler):
        if event_type not in self.event_handlers:
            self.event_handlers[event_type] = []
        self.event_handlers[event_type].append(handler)

    def capture_event(self, event_type):
        if self.parent:
            self.parent.capture_event(event_type)
        if event_type in self.event_handlers:
            for handler in self.event_handlers[event_type]:
                handler()

# 创建元素
document = Element('document')
html = Element('html', document)
body = Element('body', html)
outer_div = Element('outer_div', body)
middle_div = Element('middle_div', outer_div)
inner_button = Element('inner_button', middle_div)

# 添加事件处理程序
def outer_div_click():
    print('Outer div clicked (capturing)')

def middle_div_click():
    print('Middle div clicked (capturing)')

def inner_button_click():
    print('Inner button clicked (capturing)')

outer_div.add_event_handler('click', outer_div_click)
middle_div.add_event_handler('click', middle_div_click)
inner_button.add_event_handler('click', inner_button_click)

# 触发事件
inner_button.capture_event('click')

在这个示例中,当一个元素触发事件时,会先递归调用其父元素的事件处理程序,然后再调用自身的事件处理程序,模拟了事件捕获的过程。

3.3 jQuery中的具体操作步骤

在jQuery中,使用on()方法来绑定事件处理程序。默认情况下,jQuery使用事件冒泡机制。下面是一个简单的示例:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery Event Bubbling</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="outer">
        <div id="middle">
            <button id="inner">Click me</button>
        </div>
    </div>
    <script>
        $(document).ready(function() {
            $('#inner').on('click', function() {
                console.log('Inner button clicked');
            });
            $('#middle').on('click', function() {
                console.log('Middle div clicked');
            });
            $('#outer').on('click', function() {
                console.log('Outer div clicked');
            });
        });
    </script>
</body>
</html>

如果想要阻止事件冒泡,可以在事件处理程序中调用event.stopPropagation()方法。例如:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>jQuery Stop Event Bubbling</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="outer">
        <div id="middle">
            <button id="inner">Click me</button>
        </div>
    </div>
    <script>
        $(document).ready(function() {
            $('#inner').on('click', function(event) {
                console.log('Inner button clicked');
                event.stopPropagation();
            });
            $('#middle').on('click', function() {
                console.log('Middle div clicked');
            });
            $('#outer').on('click', function() {
                console.log('Outer div clicked');
            });
        });
    </script>
</body>
</html>

当点击按钮时,由于调用了event.stopPropagation()方法,事件不会继续向上冒泡,因此只会输出Inner button clicked

4. 数学模型和公式 & 详细讲解 & 举例说明

4.1 事件传播路径模型

可以将事件传播路径看作是一个树形结构,每个节点代表一个DOM元素。事件冒泡和事件捕获可以看作是在这个树形结构上的两种遍历方式。

T T T 为DOM树, N N N 为DOM树中的节点集合, E E E 为边集合。对于事件冒泡,从触发事件的节点 n 0 n_0 n0 开始,依次访问其父节点 n 1 , n 2 , ⋯   , n k n_1, n_2, \cdots, n_k n1,n2,,nk,直到根节点 n k n_k nk。事件捕获则是从根节点开始,依次访问子节点,直到触发事件的节点。

4.2 事件处理程序调用次数公式

假设一个DOM元素 n n n 绑定了 m m m 个事件处理程序,当事件传播到该元素时,事件处理程序的调用次数为 m m m

设事件传播路径上的元素集合为 P = { n 0 , n 1 , ⋯   , n k } P = \{n_0, n_1, \cdots, n_k\} P={n0,n1,,nk},每个元素绑定的事件处理程序数量为 m 0 , m 1 , ⋯   , m k m_0, m_1, \cdots, m_k m0,m1,,mk,则事件传播过程中事件处理程序的总调用次数为:
∑ i = 0 k m i \sum_{i = 0}^{k} m_i i=0kmi

4.3 举例说明

考虑以下HTML结构:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Event Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <div id="outer">
        <div id="middle">
            <button id="inner">Click me</button>
        </div>
    </div>
    <script>
        $(document).ready(function() {
            $('#inner').on('click', function() {
                console.log('Inner button click handler 1');
            });
            $('#inner').on('click', function() {
                console.log('Inner button click handler 2');
            });
            $('#middle').on('click', function() {
                console.log('Middle div click handler');
            });
            $('#outer').on('click', function() {
                console.log('Outer div click handler');
            });
        });
    </script>
</body>
</html>

在这个例子中,事件传播路径上的元素集合为 P = { inner , middle , outer } P = \{\text{inner}, \text{middle}, \text{outer}\} P={inner,middle,outer},每个元素绑定的事件处理程序数量分别为 m 0 = 2 m_0 = 2 m0=2 m 1 = 1 m_1 = 1 m1=1 m 2 = 1 m_2 = 1 m2=1。根据公式,事件传播过程中事件处理程序的总调用次数为:
∑ i = 0 2 m i = 2 + 1 + 1 = 4 \sum_{i = 0}^{2} m_i = 2 + 1 + 1 = 4 i=02mi=2+1+1=4
当点击按钮时,控制台会依次输出:

Inner button click handler 1
Inner button click handler 2
Middle div click handler
Outer div click handler

5. 项目实战:代码实际案例和详细解释说明

5.1 开发环境搭建

为了进行项目实战,我们需要搭建一个基本的前端开发环境。以下是具体步骤:

  1. 创建项目文件夹:在本地创建一个新的文件夹,用于存放项目文件。
  2. 引入jQuery库:可以从jQuery官方网站(https://jquery.com/)下载最新版本的jQuery库,然后将其复制到项目文件夹中。也可以使用CDN链接,在HTML文件中添加以下代码:
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
  1. 创建HTML文件:在项目文件夹中创建一个新的HTML文件,例如index.html,并添加基本的HTML结构。

5.2 源代码详细实现和代码解读

以下是一个实际的项目案例,实现了一个简单的列表项点击事件处理,使用了事件委托和事件冒泡机制。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Event Delegation Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        ul {
            list-style-type: none;
        }
        li {
            padding: 10px;
            border: 1px solid #ccc;
            margin-bottom: 5px;
        }
    </style>
</head>
<body>
    <ul id="myList">
        <li>Item 1</li>
        <li>Item 2</li>
        <li>Item 3</li>
    </ul>
    <script>
        $(document).ready(function() {
            // 使用事件委托,将事件处理程序绑定到父元素上
            $('#myList').on('click', 'li', function() {
                // 获取点击的列表项文本
                var itemText = $(this).text();
                // 输出点击的列表项文本
                console.log('You clicked on: ' + itemText);
            });
        });
    </script>
</body>
</html>
代码解读:
  1. HTML部分:创建了一个无序列表,包含三个列表项。
  2. CSS部分:对列表和列表项进行了简单的样式设置。
  3. JavaScript部分
    • 使用$(document).ready()方法确保文档加载完成后再执行代码。
    • 使用$('#myList').on('click', 'li', function() { ... })方法将事件处理程序绑定到#myList元素上,但只对其内部的li元素触发的点击事件进行处理。这就是事件委托的应用,利用了事件冒泡的原理。
    • 在事件处理程序中,使用$(this).text()方法获取点击的列表项的文本内容,并将其输出到控制台。

5.3 代码解读与分析

事件委托的优势
  • 减少事件处理程序的绑定数量:如果直接将事件处理程序绑定到每个列表项上,当列表项数量很多时,会增加内存开销。而使用事件委托,只需要将事件处理程序绑定到父元素上,减少了绑定数量。
  • 动态添加元素时无需重新绑定事件:如果后续需要动态添加新的列表项,由于事件处理程序是绑定在父元素上的,新添加的列表项也会自动具有点击事件处理功能,无需重新绑定事件。
事件冒泡的作用

事件冒泡是事件委托实现的基础。当点击列表项时,事件会从列表项开始,向上冒泡到父元素#myList,从而触发父元素上绑定的事件处理程序。

6. 实际应用场景

6.1 事件委托

事件委托是事件冒泡最常见的应用场景之一。在一个包含大量子元素的父元素中,如果需要为每个子元素绑定相同的事件处理程序,使用事件委托可以减少事件处理程序的绑定数量,提高性能。例如,在一个动态生成的表格中,为每个单元格绑定点击事件处理程序,可以将事件处理程序绑定到表格元素上,利用事件冒泡来处理单元格的点击事件。

6.2 表单验证

在表单验证中,可以使用事件冒泡来简化代码。例如,当用户在输入框中输入内容时,需要对输入内容进行验证。可以将验证事件处理程序绑定到表单元素上,当输入框触发输入事件时,事件会冒泡到表单元素,从而在表单元素上进行统一的验证处理。

6.3 菜单交互

在菜单交互中,事件冒泡和事件捕获可以用于实现复杂的菜单效果。例如,当鼠标悬停在菜单项上时,需要显示子菜单。可以将鼠标悬停事件处理程序绑定到菜单元素上,利用事件冒泡来处理菜单项的悬停事件。

6.4 模态框关闭

在模态框关闭功能中,可以使用事件冒泡来实现点击模态框外部关闭模态框的效果。将点击事件处理程序绑定到模态框的父元素上,当点击模态框外部时,事件会冒泡到父元素,从而触发关闭模态框的操作。

7. 工具和资源推荐

7.1 学习资源推荐

7.1.1 书籍推荐
  • 《JavaScript高级程序设计(第4版)》:这本书是JavaScript领域的经典著作,详细介绍了JavaScript的核心概念和高级特性,包括事件处理机制。
  • 《jQuery实战(第3版)》:专门介绍jQuery的使用,包括事件处理、动画效果、AJAX等方面的内容,适合初学者和有一定经验的开发者。
7.1.2 在线课程
  • MDN Web Docs:MDN提供了丰富的Web开发文档和教程,包括jQuery的详细文档和示例代码,是学习jQuery的重要资源。
  • W3Schools:提供了jQuery的基础教程和在线练习,适合初学者快速入门。
  • CourseraedX:这两个在线学习平台上有很多关于前端开发和jQuery的课程,可以根据自己的需求选择合适的课程进行学习。
7.1.3 技术博客和网站
  • jQuery官方博客:提供了jQuery的最新消息、更新日志和技术文章,是了解jQuery最新动态的重要渠道。
  • Stack Overflow:是一个程序员社区,有很多关于jQuery事件处理的问题和解答,可以在这里找到解决问题的思路和方法。
  • CSS-Tricks:提供了很多前端开发的技巧和案例,包括jQuery事件处理的应用案例。

7.2 开发工具框架推荐

7.2.1 IDE和编辑器
  • Visual Studio Code:是一个轻量级的代码编辑器,支持多种编程语言和前端开发框架,有丰富的插件可以扩展功能,是前端开发的首选工具之一。
  • WebStorm:是一款专门为前端开发设计的集成开发环境,提供了强大的代码编辑、调试和版本控制功能,对jQuery的支持非常好。
7.2.2 调试和性能分析工具
  • Chrome DevTools:是Chrome浏览器自带的开发者工具,提供了强大的调试和性能分析功能,可以用于调试jQuery代码和分析页面性能。
  • Firebug:是Firefox浏览器的一个扩展,提供了类似Chrome DevTools的功能,也可以用于调试jQuery代码。
7.2.3 相关框架和库
  • Bootstrap:是一个流行的前端框架,提供了丰富的CSS样式和JavaScript插件,可以与jQuery结合使用,快速搭建响应式网页。
  • Vue.jsReact:是现代的前端框架,虽然与jQuery的使用场景有所不同,但在一些项目中可以与jQuery一起使用,实现复杂的交互效果。

7.3 相关论文著作推荐

7.3.1 经典论文
  • 《JavaScript: The Definitive Guide》:这本书是JavaScript领域的权威著作,对JavaScript的事件处理机制进行了深入的探讨和分析。
  • 《High Performance JavaScript》:介绍了提高JavaScript性能的方法和技巧,包括事件处理的性能优化。
7.3.2 最新研究成果

可以关注ACM SIGWeb、IEEE Computer Society等计算机领域的学术会议和期刊,了解关于前端事件处理的最新研究成果。

7.3.3 应用案例分析

可以在GitHub等开源代码托管平台上搜索jQuery事件处理的应用案例,学习其他开发者的实践经验。

8. 总结:未来发展趋势与挑战

8.1 未来发展趋势

  • 与现代前端框架的融合:随着现代前端框架(如Vue.js、React等)的发展,jQuery可能会更多地与这些框架融合使用。例如,在一些旧项目中使用jQuery进行事件处理,同时在新项目中使用现代前端框架构建用户界面。
  • 事件处理的智能化:未来的事件处理可能会更加智能化,例如根据用户的行为模式自动调整事件处理策略,提高用户体验。
  • 跨平台和跨设备支持:随着移动设备和物联网的发展,事件处理需要更好地支持跨平台和跨设备,确保在不同设备上都能提供一致的用户体验。

8.2 挑战

  • 性能优化:随着网页内容的不断增加和复杂度的提高,事件处理的性能优化变得越来越重要。如何在保证功能的前提下,减少事件处理程序的执行时间和内存开销,是一个挑战。
  • 兼容性问题:不同浏览器对事件处理的支持可能存在差异,需要开发者进行兼容性测试和处理,确保代码在各种浏览器上都能正常运行。
  • 安全问题:事件处理可能会带来安全风险,例如恶意脚本利用事件处理漏洞进行攻击。开发者需要加强安全意识,采取有效的安全措施来防范安全问题。

9. 附录:常见问题与解答

9.1 如何阻止事件冒泡?

在jQuery中,可以在事件处理程序中调用event.stopPropagation()方法来阻止事件冒泡。例如:

$('#element').on('click', function(event) {
    event.stopPropagation();
    // 其他代码
});

9.2 事件冒泡和事件捕获哪个先执行?

在现代浏览器中,事件捕获默认是禁用的。如果同时启用了事件捕获和事件冒泡,事件捕获会先执行,然后是事件目标阶段,最后是事件冒泡阶段。

9.3 事件委托有什么优缺点?

优点

  • 减少事件处理程序的绑定数量,提高性能。
  • 动态添加元素时无需重新绑定事件。

缺点

  • 可能会导致事件处理逻辑复杂,难以理解和维护。
  • 如果父元素上绑定了过多的事件处理程序,可能会影响性能。

9.4 如何在jQuery中实现事件捕获?

jQuery本身没有直接提供事件捕获的方法,但可以通过原生JavaScript的addEventListener()方法来实现。例如:

var element = document.getElementById('element');
element.addEventListener('click', function() {
    console.log('Event captured');
}, true);

10. 扩展阅读 & 参考资料

  • jQuery官方文档:https://api.jquery.com/
  • MDN Web Docs:https://developer.mozilla.org/en-US/docs/Web/API/Event
  • 《JavaScript高级程序设计(第4版)》,作者:Nicholas C. Zakas
  • 《jQuery实战(第3版)》,作者:Bear Bibeault、Yehuda Katz、Tom Humble
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值