博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
jQuery零基础入门——(七)事件
阅读量:6825 次
发布时间:2019-06-26

本文共 3685 字,大约阅读时间需要 12 分钟。

hot3.png

《jQuery零基础入门》系列博文是在廖雪峰老师的博文基础上,可能补充了个人的理解和日常遇到的点,用我的理解表述出来,主干出处来自廖雪峰老师的技术分享。

我们在《零基础入门JavaScript》的课程中,就重点讲过JavaScript的事件。因为JavaScript在浏览器中以单线程模式运行,页面加载后,一旦页面上所有的JavaScript代码被执行完后,就只能依赖触发事件来执行JavaScript代码。

浏览器在接收到用户的鼠标或键盘输入后,会自动在对应的DOM节点上触发相应的事件。如果该节点已经绑定了对应的JavaScript处理函数,该函数就会自动调用。由于不同的浏览器绑定事件的代码都不太一样,所以用jQuery来写代码,就屏蔽了不同浏览器的差异,我们总是编写相同的代码。

举个例子,假设要在用户点击了超链接时弹出提示框,我们用jQuery这样绑定一个click事件:

/* HTML: * * 点我试试 * */// 获取超链接的jQuery对象:var a = $('#test-link');a.on('click', function () {    alert('Hello!');});

on方法用来绑定一个事件,我们需要传入事件名称和对应的处理函数。

另一种更简化的写法是直接调用click()方法:

a.click(function () {    alert('Hello!');});

两者完全等价。我们通常用后面的写法。

jQuery能够绑定的事件主要包括:

鼠标事件

  1. click: 鼠标单击时触发;
  2. dblclick:鼠标双击时触发;
  3. mouseenter:鼠标进入时触发;
  4. mouseleave:鼠标移出时触发;
  5. mousemove:鼠标在DOM内部移动时触发;
  6. hover:鼠标进入和退出时触发两个函数,相当于mouseenter加上mouseleave。

键盘事件

键盘事件仅作用在当前焦点的DOM上,通常是<input><textarea>

  1. keydown:键盘按下时触发;
  2. keyup:键盘松开时触发;
  3. keypress:按一次键后触发。

其他事件

  1. focus:当DOM获得焦点时触发;
  2. blur:当DOM失去焦点时触发;
  3. change:当<input><select><textarea>的内容改变时触发;
  4. submit:当<form>提交时触发;
  5. ready:当页面被载入并且DOM树完成初始化后触发。

其中,ready仅作用于document对象。由于ready事件在DOM完成初始化后触发,且只触发一次,所以非常适合用来写其他的初始化代码。假设我们想给一个<form>表单绑定submit事件,下面的代码没有预期的效果:

        
...

因为JavaScript在此执行的时候,<form>尚未载入浏览器,所以$('#testForm)返回[],并没有绑定事件到任何DOM上。

所以我们自己的初始化代码必须放到document对象的ready事件中,保证DOM已完成初始化:

        
...

这样写就没有问题了。因为相关代码会在DOM树初始化后再执行。

由于ready事件使用非常普遍,所以可以这样简化:

$(document).ready(function () {    // on('submit', function)也可以简化:    $('#testForm).submit(function () {        alert('submit!');    });});

甚至还可以再简化为:

$(function () {    // init...});

上面的这种写法最为常见。如果你遇到$(function () {...})的形式,牢记这是document对象的ready事件处理函数。

完全可以反复绑定事件处理函数,它们会依次执行:

$(function () {    console.log('init A...');});$(function () {    console.log('init B...');});$(function () {    console.log('init C...');});

事件参数

有些事件,如mousemovekeypress,我们需要获取鼠标位置和按键的值,否则监听这些事件就没什么意义了。所有事件都会传入Event对象作为参数,可以从Event对象上获取到更多的信息:

$(function () {    $('#testMouseMoveDiv').mousemove(function (e) {        $('#testMouseMoveSpan').text('pageX = ' + e.pageX + ', pageY = ' + e.pageY);    });});

取消绑定

一个已被绑定的事件可以解除绑定,通过off('click', function)实现:

function hello() {    alert('hello!');}a.click(hello); // 绑定事件// 10秒钟后解除绑定:setTimeout(function () {    a.off('click', hello);}, 10000);

需要特别注意的是,下面这种写法是无效的:

// 绑定事件:a.click(function () {    alert('hello!');});// 解除绑定:a.off('click', function () {    alert('hello!');});

这是因为两个匿名函数虽然长得一模一样,但是它们是两个不同的函数对象,off('click', function () {...})无法移除已绑定的第一个匿名函数。

为了实现移除效果,可以使用off('click')一次性移除已绑定的click事件的所有处理函数。

同理,无参数调用off()一次性移除已绑定的所有类型的事件处理函数。

事件触发条件

一个需要注意的问题是,事件的触发总是由用户操作引发的。例如,我们监控文本框的内容改动:

var input = $('#test-input');input.change(function () {    console.log('changed...');});

当用户在文本框中输入时,就会触发change事件。但是,如果用JavaScript代码去改动文本框的值,将不会触发change事件:

var input = $('#test-input');input.val('change it!'); // 无法触发change事件

有些时候,我们希望用代码触发change事件,可以直接调用无参数的change()方法来触发该事件:

var input = $('#test-input');input.val('change it!');input.change(); // 触发change事件

input.change()相当于input.trigger('change'),它是trigger()方法的简写。

为什么我们希望手动触发一个事件呢?如果不这么做,很多时候,我们就得写两份一模一样的代码。

浏览器安全限制

在浏览器中,有些JavaScript代码只有在用户触发下才能执行,例如,window.open()函数:

// 无法弹出新窗口,将被浏览器屏蔽:$(function () {    window.open('/');});

这些“敏感代码”只能由用户操作来触发:

var button1 = $('#testPopupButton1');var button2 = $('#testPopupButton2');function popupTestWindow() {    window.open('/');}button1.click(function () {    popupTestWindow();});button2.click(function () {    // 不立刻执行popupTestWindow(),100毫秒后执行:    setTimeout(popupTestWindow, 100);});

当用户点击button1时,click事件被触发,由于popupTestWindow()click事件处理函数内执行,这是浏览器允许的,而button2click事件并未立刻执行popupTestWindow(),延迟执行的popupTestWindow()将被浏览器拦截。

转载于:https://my.oschina.net/JandenMa/blog/1864894

你可能感兴趣的文章
装机必备工具
查看>>
Block
查看>>
查看.NET程序集编译类型命令corflags
查看>>
每天一个linux命令(16):witch命令
查看>>
使用Guava进行函数式编程
查看>>
「记录」安装Arch Linux的过程步骤
查看>>
SQL Sever数据库语法介绍及相关例子
查看>>
一步步学Qt,第五天-小小的ClippingDemo
查看>>
__FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)(转)
查看>>
ASCII字符集
查看>>
如何用Axure快速制作APP交互原型
查看>>
微软正式开源Blazor,将.NET带回到浏览器
查看>>
Linux中普通用户配置sudo权限(带密或免密)
查看>>
poj1753-Flip Game BFS+位运算
查看>>
DeDe调用body文章内容
查看>>
Eclipse的Debug(一)
查看>>
配置虚拟主机(搭建网站)
查看>>
用了N年的接口,你知道接口是什么吗?——一个简单实例说明接口的伟大意义...
查看>>
EF 数据库迁移(Migration)
查看>>
[Xilinx]官方资料 常用链接
查看>>