当前位置: 首页 > 编程日记 > 正文

jQuery中的事件机制深入浅出

昨天呢,我们大家一起分享了jQuery中的样式选择器,那么今天我们就来看一下jQuery中的事件机制,其实,jQuery中的事件机制与JavaScript中的事件机制区别是不大的,只是,JavaScript中调用是原生的函数方法,而jQuery中调用的绑定的是jQuery中的对象方法,那么在昨天的第一篇中,我们已经说过了jQuery对象和DOM对象之间的转换,至于其中的转换的原理,我们就需要去分析一下jQuery中的源码了,这个我们在源码分析中再去做讨论,

首先呢,我们先来看一下,jQuery中的ready事件,它的作用有些类似于window中的onload事件,只不过二者的区别在于,onload事件是要等到网页中的dom节点加载完成,并且css进行样式渲染后,JavaScript中进行了预加载后再执行,而ready事件呢,是在网页中的标签被解析为DOM节点是就执行其中的函数,直白点说,ready执行的比onload早,那么我们在用jQuery的时候,需要做一个ready的执行定义:

 1   //ready的作用,是为具体加载的实现.
 2         $(document).ready(function(){
 3            alert('1234');
 4         });
 5         //第二种,少了一个document,创建一个空的jQuery对象.
 6         $().ready(function(){
 7             alert('abcd');
 8         });
 9         //第三种,简写版的,
10         $(function (){
11             alert('23333');
12         });

那么我们再来看一下onload和ready的第二个区别:

 1  //如果有两个window.onload它只会执行最后一个.如果有多个的话,后边的会将前面的覆盖掉.
 2        
 3         window.οnlοad=function(){
 4             alert(1);
 5         }
 6         window.onload = function(){
 7             alert(2);
 8         }
 9         //而window.ready 则可以设置多个函数,都去作用.
10         $(document).ready(function(){alert(1)})
11       $(document).ready(function(){alert(3)})
12 //这里的可以设置多个函数,是指的对于同一个对象设置

那么我们再来看一下jQuery中的事件绑定,这里我们一onclick事件来举例,当我们在js中进行事件绑定的时候,我们分为dom1级事件,dom2级事件,其中还包括对于IE浏览器的兼容性考虑,那么当我们使用jQuery中的事件机制时,就不用去考虑那么多了,jQuery内部已经帮我们做好了兼容性之类的操作,讲真,这真的是很方便了我们了:



 1  //DOM1级事件
 2         var itNode = document.getElementById('id');
 3         itNode.onclick = function(){};
 4          div.onclick = null; DOM1级中解除事件绑定
 5     
 6         //DOM2级事件
 7         itNode.addEventListener('click',function(){});
 8         itNode.removeEventListener();
 9        itNode.attachEvent();//IE 6 8 7 兼容性处理
10         detachEvent(); IE中接触事件绑定
11         //使用jQuery来操作绑定事件
12         //$().事件类型(function(){});
13         //$().事件类型();
14         $(function(){
15             $('div').click(function(){//给div绑定了一个onclick事件
16                 $('div').css('color','green');
17             });
18             $('div').mouseover(function(){
19                 $(this).css('color','yellow');
20             });
21         });

这里的一个主意点就是当绑定事件时,事件名是不用写on的,其实我们还可以用另一种写法$('div').on('click',funciton(){});上面的那种写法就是这种写法的简化,二者的作用还是一样的.那么当我们需要给当前jQuery对象添加多个事件的时候,我们就可以使用bind方法来处理了:

 1   
 2             //$().bind(事件类型,事件处理函数(分为有名函数,和匿名函数))
 3             $(function(){
 4                 //绑定一个鼠标移动上去处理的事件.
 5                 $('div').bind('mouseover',function(){
 6                     $('div').css('background-color','blue');
 7                 });
 8                 $('div').bind('mouseout',function(){
 9                     $('div').css('background-color','yellow');
10                 });
11 
12                 //一个函数绑定多个事件 这多个时间之间只需要用空格隔开.
13                 //这个虽然可以绑定多个事件,但是函数比较单一,不灵活.
14                 $('div').bind('mouseover mouseout',function(){
15                     console.log(1234);
16                 });
17                 //使用对象的形式来绑定多个事件,
18                 $('div').bind({
19                    click: function(){console.log(1);},
20                    mouseover: function(){alert(22);},
21                    mouseout : function(){alert(33);}
22                 });
23               
24                 //绑定有名的函数
25                 function fa(){alert("fa");};
26                 function fb(){alert("fb");};
27                 function fc(){alert("fc");};
28                 $('div').bind('click',fb);
29                 $('div').bind('click',fc);
30 
31                 $('div').unbind();//这样直接调用unbind函数会直接将所有绑定的事件都取消掉.
32                 $('div').unbind('click');//这样子就会将div里边所有的click绑定的事件取消掉了
33                 //直接解除指定的函数的绑定,这种方式也只能解除有名函数的绑定,不能解除指定的匿名函数的绑定
34                 $('div').unbind('click',fa);
35 
36             });

当然,在事件处理中,事件对象无疑是我们经常要使用的一个对象,在js中,我们获取对象时还要考虑到兼容性问题,但是在jquery中,我们根本就不用考虑,只需要直接使用函数中传递的event参数就行了:

 1     function(evt){
 2            var evt = evt || window.event;
 3             evt.preventDefault();//主流浏览器阻止默认事件
 4             evt.returnValue = false;// IE中阻止对象默认事件
 5             evt.stopPropagation();//主流浏览器中阻止浏览器冒泡
 6             evt.cancelBubble();//IE中阻止浏览器冒泡处理
 7            
 8         }
 9  $().bind('click',function(evt){
10                //evt不用做兼容性处理
11                 evt.preventDefault();//阻止浏览器的默认动作.
12                 evt.stopPropagation();//阻止浏览器冒泡,
13         });    

当然了,我们jQuery中的事件也是由键盘事件,鼠标事件,表单事件,甚至还有自定义的事件等等,和js中的基本一样,总结起来呢,使用jQuery使我们不用去考虑兼容性问题,同时代码量也大大的减少了.

 

转载于:https://www.cnblogs.com/blackgan/p/5796875.html

相关文章:

滑动加载商品列表

商品列表htmL 所绑定的js事件 后台代码 $(function () { //滚动加载 var stop true; var start 2; // $.ajaxSetup({async:false}); function getData(url){ // console.log(url); $.ajax({ type:"get",//跨域访问时只能用get url:url,//要访问的api地址 dataType:…

mac 怎么查找大于200m的文件_U盘无法拷贝大于4GB的文件怎么办?

相信在经常使用U盘的用户手中,都会或多或少的存有几个U盘,有时候如果我们需要重装系统的时候,就会发现下载的系统居然无法拷贝到U盘当中,这究竟是怎么回事呢?U盘主要有三种格式:FAT32:缺点&…

以太坊今日大涨7.5%,芝商所备战“以太坊期货”

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 据The Block报道,芝加哥商品交易所(CME)预计将于7月15日改变以太坊相关的参考利率和指数,消息人士称…

python package_Python之package、module

一、模块: 1.简单的描述:一个.py文件 2.好处:大大提高代码的可维护性 3.模块三种:1.python标准库 2.第三方模块 3.应用程序自定义模块(*****) 4.import实质就是:1.执行对应文件 2.引入变量名 在…

C# Timer使用方法示例

实例化一个timer: // 每5分钟执行一次,每次执行的间隔毫秒时长 System.Timers.Timer timer new System.Timers.Timer(5*60*1000);为timer设置事件和任务循环回调方法: //到达时间的时候执行事件timer.Elapsed new System.Timers.ElapsedEventHandler(T…

[Educational Codeforces Round 16]A. King Moves

[Educational Codeforces Round 16]A. King Moves 试题描述 The only king stands on the standard chess board. You are given his position in format "cd", where c is the column from a to h and dis the row from 1 to 8. Find the number of moves permitted…

解读Go语言的2018:怎么就在中国火成这样了?

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 本篇文章是 Go 语言 2018 年终盘点,力求客观、深入分析 2018 年 Go 语言的技术发展现状,同时对明年可能的发展情况进行预测…

Io流的字节流与缓冲流

当我们队大量数据进行保存时可以用数组,当数据到达一定量时或给用户一个易懂得接口时就可采用IO流: IO流按进行的操作分输出流与输入流InputStream与OutputSteam 按操作的原理来分有2种常见的IO流字节流与缓冲流:这2种IO的的输入输出流都是对…

057 Insert Interval 插入区间

给出一个无重叠的按照区间起始端点排序的区间列表。在列表中插入一个新的区间,你要确保列表中的区间仍然有序且不重叠(如果有必要的话,可以合并区间)。示例 1:给定区间 [1,3],[6,9],插入并合并 [2,5] 得到 [1,5],[6,9]…

python3笔记_python3基础笔记(一)

1、就单个 python 文件来说在 python 中 python 的后缀可以是任意的。但如果这个 python 文件需要导入的时候如果不是 .py 会出错。所以一般情况下 python 文件的后缀为 .py 2、是 linux 中使用 ./文件.py 时候需要在文档的第一行注明解释器路径 # !/usr/bin/env/ python 3、声…

django中使用celery简单介绍

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 本章节我们重点在于实现,如何存储任务的结果. 我们将任务函数改为: from celery_demo.celery import app import time 加上app对象…

Node.js:路由

ylbtech-Node.js:路由1.返回顶部 1、Node.js 路由 我们要为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码。 因此,我们需要查看 HTTP 请求,从中提取出请求的 URL 以及 GET/POST 参…

如何进行Web服务的性能测试?

随着浏览器功能的不断完善,用户量不断的攀升,涉及到web服务的功能在不断的增加,对于我们测试来说,我们不仅要保证服务端功能的正确性,也要验证服务端程序的性能是否符合要求。那么性能测试都要做些什么呢?我…

64位游戏找call_替换Unity可执行文件为64位,改善游戏性能

虽然Unity同时支持多种架构,但是总有些程序员选择只打包32位版本,既然我们没有办法手动给程序员的脑子抽水,那就自己动手替换一个64位版本吧以下面这个游戏为例右键目录内最大的可执行文件或dll,属性,查看版本显然这个游戏使用的是5.6.6版本的Unity打开Unity官网(https://unity…

Python数据分析学习文章归纳

链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载。 数据分析如何入门学习How do I learn data analysis with Python? 虽然是英文的,不过看一遍很大收获(可以用百度翻译看一…

概率统计 —— 常犯错误

1. 患病的概率与医院的精度 已知某一种疾病在人群中的患病概率是万分之一(0.01%),某医院检查的精度为 99.9%,某人在该医院检查的结果显示自己患了这个病,那么此人确实患病的概率是多少? 也即在诊断出患病的…

python tcp不用循环监听_网络编程: TCP

1. IP 地址概念: 标识网络中设备的地址(需要联网才有没有联网, 是没有这个地址)表现形式:ipv4 目前主要使用的, 点分十进制的格式,(192.168.3.43)分为 4 段, 每段的范围是 0-255, 0.0.0.0 ~ 255.255.255.255公网 IP, 可以直接被别人使用访问的 ip(需要购买)局域网 ip(内网), 通…

WC2018集训 吉老师的军训练

WC2018集训 吉老师的军训练 #include<bits/stdc.h> #define RG register #define IL inline #define _ 200005 #define X 100000000 #define ll unsigned long long using namespace std;IL int gi(){RG int data 0 , m 1; RG char ch 0;while(ch ! - && (ch&…

一篇文章搞定Python全部基础知识

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 前言&#xff1a; 1、Python软件安装 第一章、字符串及数字变量 1、变量 要点提炼&#xff1a;Python变量为强类型动态类型。换言之&#xff0c…

Java 时间和日期类型的 Hibernate 映射

以下情况下必须显式指定 Hibernate 映射类型一个 Java 类型可能对应多个 Hibernate 映射类型. 例如: 如果持久化类的属性为 java.util.Date 类型, 对应的 Hibernate 映射类型可以是 date, time 或 timestamp. 此时必须根据对应的数据表的字段的 SQL 类型, 来确定 Hibernate 映射…

idea springmvc_SSM三大框架使用Maven快速搭建整合(SpringMVC+Spring+Mybatis)

本文介绍使用SpringMVCSpringMyBatis三大框架使用Maven快速搭建一个demo&#xff0c;实现数据从数据库中查询返回到页面进行展示的过程。技术选型&#xff1a;SpringMVCSpringMyBatisMySqlMavenJSPIDEATomcat7JDK1.8Navicat for MySql下面开始搭建项目&#xff1a;一、数据库环…

欧拉函数+素数筛

欧拉函数&#xff0c;就是欧拉发现的一个关于求素数的的公式&#xff0c;然后我们编个函数实现这个公式。 欧拉发现求小于等于n的正整数中有多少个数与n互质可以用这个公式&#xff1a; euler(x)x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…(1-1/pn),其中p1,p2……pn为x的所有素因数&a…

对 Python 开发者而言,IPython 仍然是 Jupyter Notebook 的核心

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Jupyter 项目提供的魔法般的开发体验很大程度上得益于它的 IPython 基因。 最近刚刚写过我为什么觉得觉得 Jupyter 项目&#xff08;特别是 Jupy…

LintCode 249. 统计前面比自己小的数的个数

给定一个整数数组&#xff08;下标由 0 到 n-1&#xff0c; n 表示数组的规模&#xff0c;取值范围由 0 到10000&#xff09;。对于数组中的每个 ai 元素&#xff0c;请计算 ai 前的数中比它小的元素的数量。 注意事项 We suggest you finish problem Segment Tree Build, Segm…

springboot过滤器排除掉一些url_理解这9大内置过滤器,才算是精通Shiro

小Hub领读&#xff1a;权限框架一般都是一堆过滤器、拦截器的组合运用&#xff0c;在shiro中&#xff0c;有多少个内置的过滤器你知道吗&#xff1f;在哪些场景用那些过滤器&#xff0c;这篇文章希望你能对shiro有个新的认识&#xff01;别忘了&#xff0c;点个 [在看] 支持一下…

安装APK,启动系统Activity

要同时设置data和type的话只能用函数setDataAndType private void installApk(File file) {Intent intent new Intent("android.intent.action.VIEW");intent.addCategory("android.intent.category.DEFAULT"); // intent.setData(Uri.fromFile(fi…

EOS能不能囤?一篇文章搞懂EOS优缺点

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 EOS是一个基于区块链的开发平台&#xff0c;专为构建去中心化应用程序&#xff08;dApp&#xff09;而设计。EOS是一个开源项目&#xff0c;其源代…

JS 中的事件设计

看懂此文&#xff0c;不再困惑于 JS 中的事件设计 原文出处&#xff1a; aitangyong 抽空学习了下javascript和jquery的事件设计&#xff0c;收获颇大&#xff0c;总结此贴&#xff0c;和大家分享。 (一)事件绑定的几种方式 javascript给DOM绑定事件处理函数总的来说有2种方式…

‘百度杯’十月场web ---login

首先一看的题&#xff0c;既然是是web类的&#xff0c;就要查看源码&#xff0c;一看&#xff0c;最先有一行注释&#xff0c;估摸着是用户名和密码 果然登录上去了&#xff0c;显示一段乱码&#xff0c;源码也没有什么东西&#xff0c; 那就抓一次包吧 发现响应头里边有个sho…

oracle 与 client端执行结果不一致_不同模式下Spark应用的执行过程

根据应用执行的3个阶段&#xff0c;不同执行模式下各个阶段的执行逻辑不相同&#xff0c;本文分析不同模式下的执行逻辑。Yarn-Client模式的执行流程Yarn的组成Yarn是hadoop自带的资源管理框架&#xff0c;它的设计思想是&#xff1a;YARN的基本思想是将资源管理和作业调度/监视…