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

从jQuery的缓存到事件监听

很久以前,我还在cnblogs里面逛的时候就提出过一个问题(刚找了半天没找到)。不知道大家有没有发现,用jQuery选择器"选择"之后的DOM上会添加jQuery*********属性。

<DIV id=d1 jQuery1294122065250="1">abc </DIV>


首先jQuery1294122065250中的"1294122065250"其实是一个时间戳。看看jQuery的源代码。

var expando = "jQuery" + now(), uuid = 0, windowData = {};

由于使用了闭包,这样每一个jQuery对象都有一个expando属性。 属性值jQuery1294122065250="1"的"1"其实是jQuery的缓存的key。

首先了解一下jQuery缓存的相关API:

  • data(name):返回元素上储存的相应名字的数据
  • data(name,value):在元素上存放数据,同时也返回value。
  • jQuery.data(element,key,value):在元素上存放数据,返回jQuery对象。注意:这是一个底层方法。你应当使用.data()来代替。
  • jQuery.data([element],[key]): 查询在元素上存放的数据。如果不指定参数,则会返回元素上面存放的所有数据,以Object的形式返回。注意:这是一个底层方法。你应当使用.data()来代替。
  • removeData(data):移除元素上的缓存。

把jQuery.data方法是底层方法,data方法调用了该方法。要了解Query的缓存,最好的方法莫过于调试一下jQuery代码了。

<script type="text/javascript">     $(function(){         var $d1= $("#d1");         $d1.data("key","value");         var v = $d1.data("key");
        $d1.click(function(){             alert("click");         });         for (var k in jQuery.cache){             alert(k+"\n"+jQuery.cache[k]);         }         debugger;     }); </script> <div id="d1" class="">     abc </div>


上面是一个简单的jQuery代码。在执行完$d1.data("key","value");后。经过调试后可以发现

jQuery是一个全局变量:

// Define a local copy of jQuery var jQuery = function( selector, context ) {         // The jQuery object is actually just the init constructor 'enhanced'         return new jQuery.fn.init( selector, context );     },
    // Map over jQuery in case of overwrite     _jQuery = window.jQuery,
    // Map over the $ in case of overwrite     _$ = window.$,



jQuery.data存放着所有的缓存key就是上面提到的DOM属性jQuery*********的值。
下面是读取缓存data函数的关键代码:

data: function( elem, name, data ) {         var id = elem[ expando ], cache = jQuery.cache, thisCache;
        thisCache = cache[ id ];
        return typeof name === "string" ? thisCache[ name ] : thisCache;     },


经过调试id 与jQuery********属性一致。直接通过jQuery.cache获取缓存值。

有缓存就必然会有清除缓存,不清除缓存意味着很有可能IE内存泄漏。

// Prevent memory leaks in IE // Window isn't included so as not to unbind existing unload events // More info: //  - http://isaacschlueter.com/2006/10/msie-memory-leaks/ if ( window.attachEvent && !window.addEventListener ) {     window.attachEvent("onunload", function() {         for ( var id in jQuery.cache ) {             if ( jQuery.cache[ id ].handle ) {                 // Try/Catch is to handle iframes being unloaded, see #4280                 try {                     jQuery.event.remove( jQuery.cache[ id ].handle.elem );                 } catch(e) {}             }         }     }); }

在window.unload时,jQuery将逐一删除jQuery.cache中的元素。

jQuery的事件绑定也利用了jQuery的缓存。上面的代码监听了#d1.click事件后,经过调试,可以发现,在缓存key为"events"上记录了监听的事件。


通过上面的调试,发现所谓的事件监听或者绑定bind,其实就是在缓存中注册一下处理函数,当事件触发时,将DOM的注册的事件逐一执行就可以了。这其实是一种通用的事件处理机制,事件处理机制是一种典型的观察者设计模式。

相关文章:

对一些品种数量校正

update sphwph set shl1-1 where spidSPH00002323 and piciJHAYMA00017433_5 and hwHWI00000022 update sphwph set shl-11 where spidSPH00002323 and piciJHAYMA00021159_2 and hwHWI00000022 3月7日调拨后少了398 update sphwph set shl0398 where piciJHAYMA00024241_1 an…

收藏喜+1!值得使用的100个Python小技巧

目前Python可以说是非常流行&#xff0c;在目前的编程语言中&#xff0c;Python的抽象程度是最高的&#xff0c;是最接近自然语言的&#xff0c;很容易上手。你可以用它来完成很多任务&#xff0c;比如数据科学、机器学习、Web开发、脚本编写、自动化等。下面&#xff0c;给大家…

一款基jquery超炫的动画导航菜单

今天给大家分享一款基jquery超炫的动画导航菜单。这款导航菜单&#xff0c;初始时页面中间一个按钮&#xff0c;单击按钮&#xff0c;菜单从左侧飞入页中。再次单击按钮&#xff0c;导航飞入左侧消息。动画效果很非常炫。一起看下效果图&#xff1a; 在线预览 源码下载 实现的…

如何用C#动态编译、执行代码

在开始之前&#xff0c;先熟悉几个类及部分属性、方法&#xff1a;CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。  一、CSharpCodeProvider    提供对C#代码生成器和代码编译器的实例的访问。如果要动态生成VB代码&#xff0c;可…

【解决】MySql 5.6 运行崩溃错误

【解决】MySql 5.6 运行崩溃错误 最近弄了一台云主机&#xff0c;配置是20G磁盘空间&#xff0c;1G运行内存的Linux服务器。在上面安装了LAMP&#xff08;RHEL7.2Apache2.4MySql5.6PHP5.6&#xff09;&#xff0c;然后搭建wordpress网站&#xff0c;可是网站运行没多久&#xf…

制作安全网站的checklist

原作者charlee、原始链接 http://tech.idv2.com/2008/04/19/secure-website-checklist/ fcicq最近在IPA上看到一篇安全相关的文章&#xff0c;它的最末尾有个checklist&#xff0c;于是催我把它翻译了。前几天比较忙&#xff0c;周末没什么事儿了&#xff0c;就翻译一下吧。 原…

百变冰冰!手把手教你实现CVPR2021最新妆容迁移算法

作者&#xff1a;小潘师兄来源&#xff1a;AI算法与图像处理简介在本文中&#xff0c;我们从不同的角度将妆容迁移问题分解为两步提取-分配过程。为此&#xff0c;我们提出了一种基于风格的可控GAN模型&#xff0c;该模型由三个部分组成&#xff0c;每个部分分别对应于目标风格…

Vlan 4096的限制原因

为什么80%的码农都做不了架构师&#xff1f;>>> VLAN配置的最大可能值为4094&#xff0c;它的由来如下所述&#xff1a; IEEE802.1q协议也就是“Virtual Bridged Local Area Networks”&#xff08;虚拟桥接局域网&#xff0c;简称虚拟局域网&#xff09;协议&#…

Hive 数据模型

Hive 数据模型 Hive 数据表有五种类型&#xff1a;内部表&#xff0c;外部表&#xff0c;分区表&#xff0c;桶表&#xff0c;视图表&#xff0c;默认以 tab 分隔 * MySQL (Oracle) 表默认以逗号分隔&#xff0c;因此&#xff0c;要想导入 MySQL(Oracle) 数据&#xff0c;需要设…

完整中英文世界国家级联下拉列表插件【前端版】

为什么80%的码农都做不了架构师&#xff1f;>>> 这个小东西是之前小项目上临时增加功能的产物&#xff0c;那时候在网上找了很久都没有能用的插件&#xff0c;要么是数据残缺少得可怜&#xff0c;还有就是实现手段非常低效不可维护那种&#xff0c;各种奇拔问题&am…

何时使用margin和padding?

margin和padding的意义相信大家都很清楚&#xff0c;可是在具体应用中&#xff0c;到底应该使用哪一个&#xff0c;就比较难于判断了。 这篇文章 说得挺清楚的&#xff0c;在这里翻译一下&#xff0c;供参考。 何时应当使用margin 需要在border外侧添加空白时。 空白处不需要…

10年IT老兵给新人程序员的几点建议

【CSDN 编者按】对于很多计算机专业的同学而言&#xff0c;“进大厂”已经成为毕业后职业道路的首选。但是面试官最喜欢什么样的应届生你知道吗&#xff1f;在校期间应该为找工作做哪些准备&#xff1f;除了技术好&#xff0c;在职场中还有哪些必备软实力&#xff1f;今天&…

asp.net文件上传下载的简单实现

使用FileUpload上传&#xff1a; protected void btnUpload_Click(object sender, EventArgs e) { if (FileUpload1.HasFile) { /*通过文件扩展名判断文件类型*/ string fileExt System.IO.Path.Ge…

JAVA数组的定义及用法

数组是有序数据的集合&#xff0c;数组中的每一个元素具有同样的数组名和下标来唯一地确定数组中的元素。 1. 一维数组 1.1 一维数组的定义 type arrayName[]; type[] arrayName; 当中类型(type)能够为Java中随意的数据类型&#xff0c;包含简单类型组合类型&#xff0c;数组名…

英特尔公布新技术路线图,将为 AWS、高通代工芯片

编译|刘春霖出品|AI科技大本营(ID:rgznai100)图源|IC photo今天英特尔宣布其旗下的工厂将开始制造高通芯片&#xff0c;并公布了公司有史以来最详细的制程工艺和封装技术路线图&#xff0c;希望在 2025 年前赶上台积电、三星电子。除了公布其近十多年来首个全新晶体管架构 Ribb…

epoll相关资料整理

http://www.cppblog.com/converse/archive/2008/10/13/63928.htmlepoll相关资料整理 学习epoll有一段时间了,最近终于有一个服务器采用了epoll模型,从中积累了一些epoll的资料.个人感觉目前可以找到的epoll相关的资料太少了,因为epoll仅被linux 2.6以上版本内核所支持,它的应用…

18.绝对路径和相对路径

什么是绝对路径&#xff08;Absolute Pathname&#xff09;&#xff1f; 1.绝对路径必定由“/”开头 2.绝对路径是为档案/文件的所在位置做指向 3.在任何时候&#xff0c;都可以用绝对路径来找到我们想要的文件 PS&#xff1a;绝对路径只对当前所在目录有效。 什么是相对路径&a…

IE的box模型显示bug

原作者charlee、原始链接http://tech.idv2.com/2007/01/02/ie-box-model-bug/以及本声明。 box模型即由<div>等块元素的 margin、padding、border、width、height 等属性构成的显示模型&#xff0c;它是CSS布局的基础。通过设置<div>的各种属性&#xff0c;可以得到…

AI 能匹敌程序员了吗?OpenAI 新研究展​示 NLP 大模型的局限性

作者&#xff1a;Ben Dickson来源&#xff1a;数据实战派Codex在一篇新论文中&#xff0c;OpenAI 的研究人员展示了 Codex 的详细信息&#xff0c;它是一种生成软件源代码的深度学习模型。Codex 可以为 OpenAI 和 GitHub 联合开发的 “AI 配对程序员” 工具 Copilot 提供支持。…

MSLicensing​中断远程桌面连接

---------------------------中断远程桌面连接---------------------------客户端无法建立跟远程计算机的连接。导致这个错误的可能的原因是:1) 远程计算机上的远程连接可能没有启用。2) 已超出远程计算机上的连接最大数。3) 建立连接时出现了一个网络错误。------------------…

如何恢复,迁移,添加, 删除 Voting Disks

如何恢复&#xff0c;迁移&#xff0c;添加, 删除 Voting Disks 恢复流程 在11gR2 之前&#xff0c;我们可以直接直接使用dd命令对voting disk进行备份。 DD示例 备份votedisk盘&#xff1a; [rootraw1 bin]# dd if/dev/raw/raw2 of/home/oracle/voting_disk.bak 恢复votedisk盘…

跨站脚本攻击(XSS)FAQ

原作者charlee、原始链接http://tech.idv2.com/2006/08/30/xss-faq/以及本声明。 该文章简单地介绍了XSS的基础知识及其危害和预防方法。Web开发人员的必读。译自 http://www.cgisecurity.com/articles/xss-faq.shtml。 简介 现在的网站包含大量的动态内容以提高用户体验&…

linux中的for命令

bash shell提供了for命令&#xff0c;用于创建通过一系列值重复的循环。每次重复使用系列中的一个值执行一个定义的命令集。for命令基本格式为&#xff1a;for var in listdo commandsdone1.读取列表中的值 #!/bin/bash #basic for command for test in a b c d e f doecho The…

终于有人把计算机视觉讲明白了 。。。

机器学习是目前比较热门的技术&#xff0c;包含深度学习、强化学习、对抗学习、对偶学习、迁移学习、分布式学习、以及元学习等内容。得益于大数据、大模型、大计算的发展&#xff0c;深度学习在计算机视觉、语音处理、自然语言方面相继取得了突破&#xff0c;达到甚至超过了人…

mysql启动与关闭(手动与自动)

手动管理mysql的启动与关闭 [rootmysql ~]# service mysql start --手动启动mysql Starting MySQL. SUCCESS! [rootmysql ~]# service mysql stop --手动关闭mysql Shutting down MySQL.. SUCCESS! [rootmysql ~]# mysqld --verbose --help --查看MySQL的默认参数的具体值 如果…

C#中抽象类和接口的区别

一、抽象类&#xff1a;抽象类是特殊的类&#xff0c;只是不能被实例化&#xff1b;除此以外&#xff0c;具有类的其他特性&#xff1b;重要的是抽象类可以包括抽象方法&#xff0c;这是普通类所不能的。抽象方法只能声明于抽象类中&#xff0c;且不包含任何实现&#xff0c;派…

echo向文件中写入

echo命令向一个文件写入内容的方法详解&#xff0c;感兴趣的朋友可以参考下。 覆盖型写法 (文件里原来的内容被覆盖)echo "aaa" > a.txtecho aaa > a.txt 添加型写法 (新内容添加在原来内容的后面&#xff09;echo "aaa" >> a.txtecho aaa >…

火山引擎向企业客户开放上万款抖音同款特效

你喜爱的抖音特效&#xff0c;在其他平台上也能使用了。 7月28日&#xff0c;抖音联合火山引擎举办特效技术开放日&#xff0c;首次披露抖音特效的生产流程和技术原理。活动中&#xff0c;火山引擎宣布已向企业客户开放了上万款抖音同款特效&#xff0c;包括猴哥、漫画惊讶脸…

5.1 python的缩进

python 并不像其他语言一样要求以大括号来分辨逻辑&#xff0c;仅仅使用 tab 键&#xff08;默认的四个空格&#xff09;来区分代码。比如 ainput(Please input a num: ) b0 if int(a)>b: print(a>0) else: print(a<0) 返回结果&#xff1a;当输入小于0时&#xff0c;…

centOS 自动安装php

centos下安装php#yum install -y php这个只安装PHP建议安装运行库及MySQL的支持#yum install -y php php-devel php-mysql如果你的系统是CentOS 5.6那么上面这条命令安装的是PHP 5.1,要安装 PHP 5.3则执行下面的命令:#yum install -y php53 php53-devel php53-mysql自动安装启动…