不同的浏览器绑定事件的代码都不太一样,所以我们使用jQuery来写代码的话,可以屏蔽不同浏览器之间的差异。

在jQuery中,可以使用 on 来绑定一个事件,指定事件的名称和对应的处理函数:
// 获取超链接的jQuery对象:
var a = $('#test-link');
a.on('click', function () {
alert('Hello!');
});
5
 
1
// 获取超链接的jQuery对象: 
2
var a = $('#test-link');
3
a.on('click', function () {
4
    alert('Hello!');
5
});

但是通常,我们不这样使用,因为我们可以直接使用封装好的事件方法,比如上面的 on click 我们可以直接写成:
a.click(function () {
alert('Hello!');
});
3
 
1
a.click(function () {
2
    alert('Hello!');
3
});

1、常用事件

1.1 鼠标事件

click 鼠标单击时触发
dblclick 鼠标双击时触发
mouseenter 鼠标进入时触发
mouseleave 鼠标移出时触发
mousemove 鼠标在DOM内部移动时触发
hover 鼠标进入和退出时触发两个函数,相当于mouseenter加上mouseleave

1.2 键盘事件

键盘事件仅作用在当前焦点的DOM上,通常是<input>和<textarea>。
keydown 键盘按下时触发
keyup 键盘松开时触发
keypress 按一次键后触发

1.3 其他事件

focus 当DOM获得焦点时触发
blur 当DOM失去焦点时触发
change 当<input>、<select>或<textarea>的内容改变时触发
submit 当<form>提交时触发
ready 当页面被载入并且DOM树完成初始化后触发

注意:ready仅作用于document对象,我们的JS代码通常要等待DOM加载完成后再执行,否则经常会找不到DOM,所以我们自己初始化的代码需要放到ready事件中,保证DOM已经完成了初始化:
<html>
<head>
<script>
$(document).on('ready', function () {
$('#testForm).on('submit', function () {
alert('submit!');
});
});
</script>
</head>
<body>
<form id="testForm">
...
</form>
</body>
15
 
1
<html>
2
<head>
3
    <script>
4
        $(document).on('ready', function () {
5
            $('#testForm).on('submit', function () {
6
                alert('submit!');
7
            });
8
        });
9
    </script>
10
</head>
11
<body>
12
    <form id="testForm">
13
        ...
14
    </form>
15
</body>

或者:
$(document).ready(function () {
// on('submit', function)也可以简化:
$('#testForm).submit(function () {
alert('submit!');
});
});
6
 
1
$(document).ready(function () {
2
    // on('submit', function)也可以简化:
3
    $('#testForm).submit(function () {
4
        alert('submit!');
5
    });
6
});

通常我们使用的是如下的方式,更简洁:
$(function () {
// init...
});
3
 
1
$(function () {
2
    // init...
3
});

2、事件参数

有些事件比如mousemove和keypress,我们需要获得鼠标的位置和按键的值。所有事件都会传入 Event 对象作为参数,可以从该对象上获取更多的信息:
$(function () {
$('#testMouseMoveDiv').mousemove(function (e) {
$('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);
});
});
5
 
1
$(function () {
2
    $('#testMouseMoveDiv').mousemove(function (e) {
3
        $('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);
4
    });
5
});
如下图所示,鼠标移动的话x,y坐标值会不断变化:
 

3、取消绑定

一个已被绑定的事件可以解除绑定,通过off('xxx', function)实现,值得注意的是,off方式的取消绑定是无法取消直接的事件方法的,如下方式取消绑定是无效的:
// 绑定事件:
a.click(function () {
alert('hello!');
}); // 解除绑定:
a.off('click', function () {
alert('hello!');
});
x
 
1
// 绑定事件:
2
a.click(function () {
3
    alert('hello!');
4
});
5

6
// 解除绑定:
7
a.off('click', function () {
8
    alert('hello!');
9
});

这是两个不同的函数对象,所以off无法取消已经banding的第一个匿名函数。

可以使用 off('click') 移除所有已绑定的 click 事件的函数,或者 off() 移除已绑定的所有类型的事件处理函数。

4、事件触发条件

记住,事件的触发总是由用户操作引发的,即如果用JS代码去改变值,不会触发对应的事件!

如果一定要使用JS触发事件,可以直接调用无参的事件方法来触发,例如:
var input = $('#test-input');
input.val('change it!');
input.change(); // 触发change事件
// input.change()相当于input.trigger('change'),它是trigger()方法的简写
 
1
var input = $('#test-input');
2
input.val('change it!');
3
input.change(); // 触发change事件
4
// input.change()相当于input.trigger('change'),它是trigger()方法的简写

另外,有些JS代码即使设定触发,也因为浏览器的安全设置无法实现,只能由用户触发。


06jQuery-05-事件的更多相关文章

  1. JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数

    本篇体验JavaScript事件的基本面,包括: ■ 事件必须在页面元素加载之后起效■ 点击事件的一个简单例子■ 为元素注册多个点击事件■ 获取事件参数 ■ 跨浏览器事件处理 □ 事件必须在页面元素加 ...

  2. 读书笔记(05) - 事件 - JavaScript高级程序设计

    HTML依托于JavaScript来实现用户与WEB网页之间的动态交互,接收用户操作并做出相应的反馈,而事件在此间则充当桥梁的重要角色. 日常开发中,经常会为某个元素绑定一个事件,编写相应的业务逻辑, ...

  3. jQuery中的事件冒泡

    1.什么是冒泡 eg: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <he ...

  4. JavaScript进阶系列07,鼠标事件

    鼠标事件有Keydown, Keyup, Keypress,但Keypress与Keydown和Keyup不同,如果按ctrl, shift, caps lock......等修饰键,不会触发Keyp ...

  5. JavaScript进阶系列06,事件委托

    在"JavaScript进阶系列05,事件的执行时机, 使用addEventListener为元素同时注册多个事件,事件参数"中已经有了一个跨浏览器的事件处理机制.现在需要使用这个 ...

  6. 20160227.CCPP体系详解(0037天)

    程序片段(01):01.一对一模式.c+02.中介者模式.c+03.广播模式.c 内容概要:事件 ///01.一对一模式.c #include <stdio.h> #include < ...

  7. 20160226.CCPP体系详解(0036天)

    程序片段(01):01.多线程.c+02.多线程操作.c 内容概要:多线程 ///01.多线程.c #include <stdio.h> #include <stdlib.h> ...

  8. JavaScript进阶系列04,函数参数个数不确定情况下的解决方案

    本篇主要体验函数参数个数不确定情况下的一个解决方案.先来看一段使用函数作为参数进行计算的实例. var calculate = function(x, y, fn) { return fn(x, y) ...

  9. JavaScript进阶系列03,通过硬编码、工厂模式、构造函数创建JavaScript对象

    本篇体验通过硬编码.工厂模式.构造函数来创建JavaScript对象. □ 通过硬编码创建JavaScript对象 当需要创建一个JavaScript对象时,我们可能这样写: var person = ...

  10. JavaScript进阶系列02,函数作为参数以及在数组中的应用

    有时候,把函数作为参数可以让代码更简洁. var calculator = { calculate: function(x, y, fn) { return fn(x, y); } }; var su ...

随机推荐

  1. Joda-Time 简介

    既然无法摆脱时间,为何不设法简化时间处理? 任何企业应用程序都需要处理时间问题.应用程序需要知道当前的时间点和下一个时间点,有时它们还必须计算这两个时间点之间的路径.使用 JDK 完成这项任务将非常痛 ...

  2. 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别

    Java中的"equals"和"=="的用法及区别 在初学Java时,可能会经常碰到下面的代码: String str1 = new String(" ...

  3. 关于aop的两种方式-基于注解和基于aspectj

    spring的aop确实好用,能够在不影响业务功能的情况下,实现一些低耦合的功能. 而aop又有两种常用的实现方式,一种是用aspectj表达式去匹配,实现全局的配置,表达式还可以使用与或非符号去连接 ...

  4. Sass初学者超强十分钟入门

    ruby安装 因为sass依赖于ruby环境,所以装sass之前先确认装了ruby.先导官网下载个ruby 在安装的时候,请勾选Add Ruby executables to your PATH这个选 ...

  5. Just for Today

    Just for today I will try to live through this day only and not tackle my whole life problem at once ...

  6. java面向对象理解

    面向对象:世间一切事物均可认为是对象,用户不必了解软件内部的实现机制,可根据需要直接调用接口,生成一个正常工作的应用程序. 面向对象的特点:抽象,封装,继承,多态性, 对象:对象就是一个具有明确行为的 ...

  7. 学习python的*args和 **kwargs

    *args表示任何多个无名参数,它是一个tuple(元组):**kwargs表示关键字参数,它是一个dict(字典) def foo(*args, **kwargs): print 'args = ' ...

  8. 马士兵讲jsp项目--BBS项目分析笔记

    1 导言 作为一个新手JAVA程序员,我相信很多人和我一样急切的想要寻找项目来做,这里我把马士兵老师讲的JAVA WEB的第一个小项目拿过来给大家分享一下. 首先,对一个项目而言我们先要认识清楚我们要 ...

  9. Codis分布式锁

    近期一项需求需要使用分布式锁,考虑的方案主要有如下两种: zookeeper codis 因为对于zookeeper不是特别熟悉,因此选用了codis,Codis是一个分布式的Redis解决方案,从应 ...

  10. spring mvc:属性无法自动注入

    在使用spring mvc 3开发一个项目模块时,遇到这样一个奇怪的问题: 前端页面发送的请求中,所有参数都无法自动注入到指定的@ModelAttribute对象中,经过检查,参数名称与接受对象的属性 ...