- 浏览: 323999 次
- 性别:
- 来自: 南昌
文章分类
最新评论
-
j_bird:
你好,想探讨下滑动窗口是怎么计算的,一条群发短信发出去,滑动窗 ...
协议研发 中移动CMPP2.0协议API -
andyliulin:
楼主,现在的magicode 生成器工具的 官网,http: ...
Mgicode 生成器正式发布 -
huazai_wow:
楼主 你只是分析了 在jquery 中 有使用到 jQu ...
jquery event trigger 分析 -
dengkanghua:
CMPP2.0中出现流量控制错误是什么引起的。有什么解决办法吗 ...
协议研发 中移动CMPP2.0协议API -
JohnHust:
[flash=200,200][/flash][url][/u ...
Jquery源码分析(一)
/** * author:prk * date:2008-08-04 * comment:comment for selector of jQuery * */ var chars = jQuery.browser.safari && parseInt(jQuery.browser.version) < 417 ? "(?:[\\w*_-]|\\\\.)" : "(?:[\\w\u0128-\uFFFF*_-]|\\\\.)", quickChild = new RegExp("^>\\s*(" + chars + "+)"), quickID = new RegExp("^(" + chars + "+)(#)(" + chars + "+)"), // ^((?:[\\w*_-]|\\\\.))(#)((?:[\\w*_-]|\\\\.)) quickClass = new RegExp("^([#.]?)(" + chars + "*)");// ^([#.]?)((?:[\\w*_-]|\\\\.)*) jQuery.extend( { expr : { "" : function(a, i, m) { return m[2] == "*" || jQuery.nodeName(a, m[2]); }, "#" : function(a, i, m) { return a.getAttribute("id") == m[2]; }, ":" : { // Position Checks lt : function(a, i, m) { return i < m[3] - 0; }, gt : function(a, i, m) { return i > m[3] - 0; }, nth : function(a, i, m) { return m[3] - 0 == i; }, eq : function(a, i, m) { return m[3] - 0 == i; }, first : function(a, i) { return i == 0; }, last : function(a, i, m, r) { return i == r.length - 1; }, even : function(a, i) { return i % 2 == 0; }, odd : function(a, i) { return i % 2; }, // Child Checks "first-child" : function(a) { return a.parentNode.getElementsByTagName("*")[0] == a; }, "last-child" : function(a) { return jQuery.nth(a.parentNode.lastChild, 1, "previousSibling") == a; }, "only-child" : function(a) { return !jQuery.nth(a.parentNode.lastChild, 2, "previousSibling"); }, // Parent Checks parent : function(a) { return a.firstChild; }, empty : function(a) { return !a.firstChild; }, // Text Check contains : function(a, i, m) { return (a.textContent || a.innerText || jQuery(a).text() || "") .indexOf(m[3]) >= 0; }, // Visibility visible : function(a) { return "hidden" != a.type && jQuery.css(a, "display") != "none" && jQuery.css(a, "visibility") != "hidden"; }, hidden : function(a) { return "hidden" == a.type || jQuery.css(a, "display") == "none" || jQuery.css(a, "visibility") == "hidden"; }, // Form attributes enabled : function(a) { return !a.disabled; }, disabled : function(a) { return a.disabled; }, checked : function(a) { return a.checked; }, selected : function(a) { return a.selected || jQuery.attr(a, "selected"); }, // Form elements text : function(a) { return "text" == a.type; }, radio : function(a) { return "radio" == a.type; }, checkbox : function(a) { return "checkbox" == a.type; }, file : function(a) { return "file" == a.type; }, password : function(a) { return "password" == a.type; }, submit : function(a) { return "submit" == a.type; }, image : function(a) { return "image" == a.type; }, reset : function(a) { return "reset" == a.type; }, button : function(a) { return "button" == a.type || jQuery.nodeName(a, "button"); }, input : function(a) { return /input|select|textarea|button/i.test(a.nodeName); }, // :has() has : function(a, i, m) { return jQuery.find(m[3], a).length; }, // :header header : function(a) { return /h\d/i.test(a.nodeName); }, // :animated animated : function(a) { return jQuery.grep(jQuery.timers, function(fn) { return a == fn.elem; }).length; } } }, // The regular expressions that power the parsing engine parse : [ // Match: [@value='test'], [@foo] /^(\[) *@?([\w:-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, // Match: :contains('foo') /^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, // Match: :even, :last-child, #id, .class new RegExp("^([:.#]*)(" + chars + "+)")], multiFilter : function(expr, elems, not) { var old, cur = []; while (expr && expr != old) {// 存在且改变 old = expr; var f = jQuery.filter(expr, elems, not); expr = f.t.replace(/^\s*,\s*/, ""); cur = not ? elems = f.r : jQuery.merge(cur, f.r); } return cur; }, find : function(t, context) { if (typeof t != "string") return [t];// 快速处理非字符表达式 if (context && context.nodeType != 1 && context.nodeType != 9) return [];// 确保context是DOM元素或document context = context || document;// 缺省的context // 初始化,ret:result, done:已经完成,last:上一次的t,nodeName:节点名,如p var ret = [context], done = [], last, nodeName; while (t && last != t) {// t存在,且变化 var r = []; // ret的tempValue last = t; // last:上一次的t t = jQuery.trim(t);// 去首尾空格 var foundToken = false, re = quickChild, // 以>开头的regexp m = re.exec(t); if (m) {// 首先判断是不是以>开头 nodeName = m[1].toUpperCase(); // 找到上下文的那些满足regexp中nodeName的所有子节点。 for (var i = 0;ret[i]; i++) for (var c = ret[i].firstChild;c; c = c.nextSibling) if (c.nodeType == 1 && (nodeName == "*" || c.nodeName.toUpperCase() == nodeName)) r.push(c); ret = r; // 现在找到的所有元素都是上下文(context) t = t.replace(re, "");// remove已经处理过的部分 if (t.indexOf(" ") == 0)// 说明是 "E F"这样的形式 continue;// 循环就能找到所有 foundToken = true;// 找到标识 } else {// 第二判断是不是以+~开头 re = /^([>+~])\s*(\w*)/i; if ((m = re.exec(t)) != null) {// 以+~开头的 r = []; var merge = {}; nodeName = m[2].toUpperCase();// 节点名 m = m[1];// 符号,如+,~ // 如果参数t匹配" "或>(子元素),由context的第一个子元素开始遍历, // 如果参数t匹配~或+(后续元素),则从context的下一个元素开始遍历 for (var j = 0, rl = ret.length;j < rl; j++) {// 已经找到的节点(context)遍历 // 把~和+的操作统一在一起进行处理 var n = (m == "~" || m == "+" ? ret[j].nextSibling : ret[j].firstChild); for (;n; n = n.nextSibling) if (n.nodeType == 1) {// 保证节点是元素类型 var id = jQuery.data(n);// 为n元素生成全局唯一的id if (m == "~" && merge[id])// 保证ret中元素不重复 break;// nextSibling会循环到第一个节点? if (!nodeName || n.nodeName.toUpperCase() == nodeName) { if (m == "~")// 找到元素保存起来 merge[id] = true; r.push(n); } if (m == "+")// 直接后续兄弟节点,只进行一次操作。 break; } } ret = r;// 找到元素的后续操作 t = jQuery.trim(t.replace(re, "")); foundToken = true; } } if (t && !foundToken) {// 不是以>~+开头的 if (!t.indexOf(",")) {// ,分隔出现在第一个位置上 if (context == ret[0]) ret.shift();// 把初始化给定的context清除出ret done = jQuery.merge(done, ret);// ret的其它元素放入done r = ret = [context];// 重新初始化 // Touch up the selector string t = " " + t.substr(1, t.length); } else {// 采用,分隔的多表达式 /* * qId:^((?:[\w*_-]|\.)+)(#)((?:[\w*_-]|\.)+) * qclass:^([#.]?)((?:[\\w*_-]|\.)*) */ var re2 = quickID;// 如(.)nodeName#idName var m = re2.exec(t);// 找到第一个相配的 if (m) { m = [0, m[2], m[3], m[1]];// m=[0,#,idName,nodeName] } else { re2 = quickClass;// #nodeName,.className m = re2.exec(t);// m=[all,#,idName] } m[2] = m[2].replace(/\\/g, "");// 去除转义字符 var elem = ret[ret.length - 1];// 结果数组最后一个 // 根据Id直接找到元素并确保其的确存在 if (m[1] == "#" && elem && elem.getElementById && !jQuery.isXMLDoc(elem)) { var oid = elem.getElementById(m[2]); // 回测元素的ID的确存在,在IE中会取name属性的值,同时在form 元素中 // 会选中在form中元素的name属性为id的元素。 if ((jQuery.browser.msie || jQuery.browser.opera) && oid && typeof oid.id == "string" && oid.id != m[2]) oid = jQuery('[@id="' + m[2] + '"]', elem)[0]; // 回测元素的node Name是否相同,如div#foo,可以提交效率 ret = r = oid && (!m[3] || jQuery.nodeName(oid, m[3])) ? [oid] : []; } else {// 找到结果集合中每个元素所有的后代元素组成集合,进行排查 for (var i = 0;ret[i]; i++) { var tag = (m[1] == "#" && m[3] ? m[3] : (m[1] != "" || m[0] == "" ? "*" : m[2]));// 分情况取tagName if (tag == "*" && ret[i].nodeName.toLowerCase() == "object") tag = "param";// Handle IE7 being really dumb // about <object>s r = jQuery.merge(r, ret[i].getElementsByTagName(tag)); } if (m[1] == ".") // 根据class在找到结果集合中过滤 r = jQuery.classFilter(r, m[2]); if (m[1] == "#") {// 对元素的id过滤,找到regexp给定id的元素 var tmp = []; for (var i = 0;r[i]; i++) if (r[i].getAttribute("id") == m[2]) { tmp = [r[i]]; break; } r = tmp; } ret = r; } t = t.replace(re2, ""); } } if (t) {// 根据余下的selector,对找到的r集合中的元素进行过滤 var val = jQuery.filter(t, r); ret = r = val.r; t = jQuery.trim(val.t);// 去首尾空格 } } if (t)// selector出现,返回[]。 ret = []; if (ret && context == ret[0]) ret.shift();// 去掉根上下文 done = jQuery.merge(done, ret);// 合并 return done; }, // 找到r中element中的className中含有m 或不含有的所有的元素 classFilter : function(r, m, not) { m = " " + m + " "; var tmp = []; for (var i = 0;r[i]; i++) { var pass = (" " + r[i].className + " ").indexOf(m) >= 0; if (!not && pass || not && !pass) tmp.push(r[i]); } return tmp; }, filter : function(t, r, not) { var last; while (t && t != last) {// t存在,且改变 last = t; // Match: [@value='test'], [@foo] // 1、^(\[) *@?([\w:-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/, // Match: :contains('foo') // 2、^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/, // Match: :even, :last-child, #id, .class // 3、new RegExp("^([:.#]*)(" + chars + "+)")], // isSimple = /^.[^:#\[\.]*$/ var p = jQuery.parse, m; for (var i = 0;p[i]; i++) {// 找到与jQuery.parse中regexp相配的 m = p[i].exec(t); if (m) { t = t.substring(m[0].length); m[2] = m[2].replace(/\\/g, "");// 有可能会有没有转换的\去掉 break; } } if (!m)// 与上面三种的regexp都不相配 break; // :not(.class) 处理不包含.class的其它的元素 if (m[1] == ":" && m[2] == "not") // 性能上优化 m[3]是.class经常出现 r = isSimple.test(m[3]) ? jQuery.filter(m[3], r, true).r : jQuery(r).not(m[3]); else if (m[1] == ".")// 性能上优化考虑 r = jQuery.classFilter(r, m[2], not); else if (m[1] == "[") {// [@value='test']形式的属性选择 var tmp = [], type = m[3];// 符号,如= for (var i = 0, rl = r.length;i < rl; i++) { var a = r[i], z = a[jQuery.props[m[2]] || m[2]];// 元素的属性值 if (z == null || /style|href|src|selected/.test(m[2])) z = jQuery.attr(a, m[2]) || '';// 几个特殊的处理 // [foo],[foo=aa][foo!=aa][foo^=aa][foo$=aa][foo~=aa] if ((type == "" && !!z || type == "=" && z == m[5] || type == "!=" && z != m[5] || type == "^=" && z && !z.indexOf(m[5]) || type == "$=" && z.substr(z.length - m[5].length) == m[5] || (type == "*=" || type == "~=") && z.indexOf(m[5]) >= 0) ^ not) tmp.push(a); } r = tmp; } else if (m[1] == ":" && m[2] == "nth-child") {// 性能考量 var merge = {}, tmp = [], // parse equations like 'even', 'odd', '5', '2n', '3n+2', // '4n-1', '-n+6' test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3] == "even" && "2n" || m[3] == "odd" && "2n+1" || !/\D/.test(m[3]) && "0n+" + m[3] || m[3]), // 计算器(first)n+(last),first=(-?)(\d*),last=((?:\+|-)?\d*) first = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0; for (var i = 0, rl = r.length;i < rl; i++) { var node = r[i], parentNode = node.parentNode, id = jQuery .data(parentNode); if (!merge[id]) {// 为元素的每个子节点标上顺序号,作了不重复标识 var c = 1; for (var n = parentNode.firstChild;n; n = n.nextSibling) if (n.nodeType == 1) n.nodeIndex = c++; merge[id] = true; } var add = false; if (first == 0) {// 0不能作除数 if (node.nodeIndex == last) add = true; } // 处理3n+2这种形式同时表达式要大于0 else if ((node.nodeIndex - last) % first == 0 && (node.nodeIndex - last) / first >= 0) add = true; if (add ^ not) tmp.push(node); } r = tmp; } else {// 根据m[1]m[2]在Query.expr找到对应的处理函数 var fn = jQuery.expr[m[1]]; if (typeof fn == "object") fn = fn[m[2]]; if (typeof fn == "string") fn = eval("false||function(a,i){return " + fn + ";}"); // 执行处理函数过滤r r = jQuery.grep(r, function(elem, i) { return fn(elem, i, m, r); }, not); } } // Return an array of filtered elements (r) // and the modified expression string (t) return { r : r, t : t }; }, // dir:nextSibling elem:element dir : function(elem, dir) { var matched = [], cur = elem[dir]; while (cur && cur != document) { if (cur.nodeType == 1) matched.push(cur); cur = cur[dir]; } return matched; }, // dir:nextSibling result:deep cur:current. elem :no use nth : function(cur, result, dir, elem) { result = result || 1; var num = 0; for (;cur; cur = cur[dir]) if (cur.nodeType == 1 && ++num == result) break; return cur; }, // 排除elem的n的后续兄弟元素节点。 sibling : function(n, elem) { var r = []; for (;n; n = n.nextSibling) { if (n.nodeType == 1 && n != elem) r.push(n); } return r; } });
发表评论
-
[转载]jquery.validate.js的基本用法入门
2011-03-10 22:35 2890[转载]jquery.validate.js的基本用法入门 j ... -
使用javascript动态创建SVG对象的问题
2011-01-11 17:18 4753无沙备忘录系列 -平时的一些研究,有时也会颇费功夫,然 ... -
evaluate mxGraph
2010-06-10 16:09 1730To evaluate mxGraph: - Navigate ... -
js中的prototype与constructor
2010-06-09 10:53 2943并且每个函数都有一个默认的prototype属性。 如果这个函 ... -
Jquery1.2.6 源码分析
2008-08-29 00:13 14184jQuery是一个非常优秀的J ... -
jquery fx分析
2008-08-28 19:37 63348 FX分析 prk/彭仁夔 ... -
jqueyr fx源码(修改)
2008-08-28 19:33 2698/* * author:prk date:2008-08-0 ... -
jquery.ajax
2008-08-27 16:50 81267.2 jquery.ajax ... -
jquery event domready
2008-08-26 17:39 41456.3 domReady的处理 ... -
jquery event trigger 分析
2008-08-26 17:37 113926.2.2 trigger ... -
jquery event addEvent 分析
2008-08-26 17:36 112106.2 事件的处理 ... -
jquery event 封装的源源分析
2008-08-26 17:35 46076.Event分析 ... -
jquery position
2008-08-25 16:34 87975.2.3 position ... -
jquery wrap
2008-08-25 08:12 44865.3.5 wrap ... -
jquery element content
2008-08-25 08:11 43705.4dom元素的内容 ... -
jquery class
2008-08-22 23:18 53785.1.2 Class prk/彭仁夔 2008- ... -
jquery attr
2008-08-22 23:16 76215 DOM元素 prk/彭仁夔 ... -
jquery Selector (修改)
2008-08-21 17:10 3104/** * author:prk * date:2008- ... -
CSS selector (jquery的源码分析,修改)
2008-08-21 17:09 44313.3、采用CSS方式查找Dom节点 ... -
如何找到Dom元素
2008-08-20 22:10 28413、如何找到Dom元素 ...
相关推荐
《jQuery源码分析》 jQuery,作为一款广泛使用的JavaScript库,极大地简化了DOM操作、事件处理、动画制作以及Ajax交互。深入理解其源码对于提升JavaScript编程技能和优化前端性能至关重要。本文将从核心概念、设计...
**jQuery 1.2.6 源码分析** jQuery 是一个广泛使用的 JavaScript 库,它简化了 HTML 文档遍历、事件处理、动画以及 Ajax 交互等任务。本篇文章将深入探讨 jQuery 1.2.6 版本的源码,揭示其背后的实现原理,帮助...
### jQuery源码分析关键知识点详解 #### 一、前言 在深入了解jQuery源码之前,有必要先简要介绍一下jQuery的基本情况及其对JavaScript编程领域的重要意义。jQuery作为一个轻量级、功能丰富的JavaScript库,在Web...
《jQuery 1.2.6 源码分析》 jQuery是JavaScript库的典范,以其简洁的API和强大的功能赢得了开发者们的广泛喜爱。在1.2.6版本中,jQuery的核心特性已经相当成熟,它提供了丰富的DOM操作、事件处理、动画效果以及Ajax...
这份中文注释的源码分析旨在帮助开发者逐步揭开jQuery的神秘面纱,提升JavaScript编程技能。 首先,jQuery的核心在于选择器引擎Sizzle。Sizzle是一个高效的选择器解析器,能够处理CSS1至CSS3的选择器,包括ID、类、...
《jQuery 1.4.3 源码分析——核心部分》 jQuery 是一个广泛使用的JavaScript库,它极大地简化了JavaScript的DOM操作、事件处理、动画制作和Ajax交互。在jQuery 1.4.3版本中,其核心部分主要包括选择器引擎、DOM操作...
第一种,如果传入的参数是非字符串,则先通过jQuery选择器将selector查找出来,然后过滤出包含于当前jQuery对象所匹配的元素的节点。 if ( typeof selector !== "string" ) { self = this; return this....
《jQuery 1.2.6 源码分析与API详解》 jQuery 是一个广泛使用的JavaScript库,它极大地简化了JavaScript编程,使得DOM操作、事件处理、动画制作以及Ajax交互变得更加便捷。本篇文章将深入剖析jQuery 1.2.6版本的源码...
### jQuery源码分析 #### 一、概述 jQuery作为一个卓越的JavaScript库,以其简洁高效的特性在前端开发领域占据了一席之地。与Prototype、YUI、Mootools等其他JavaScript库相比,jQuery更加注重实用性,去除了一些...
### jQuery 1.4.3 源码分析(核心部分) #### 一、引言 随着 Web 技术的不断发展,JavaScript 成为了前端开发中不可或缺的一部分。而在众多 JavaScript 库中,jQuery 几乎成为了网页开发的标准工具之一。本文将...
### jQuery源码分析—构造jQuery对象 #### 一、源码结构概览 根据所提供的文件内容,本节将深入分析如何构建jQuery对象及其核心构造逻辑。首先,让我们从整体上理解jQuery构造函数的设计思路。 ##### 总体结构 ...
提供的压缩包文件名列表与Jquery源码分析的主题不相符,它们看起来是音频文件的名称,可能是相声或者音乐作品。然而,你要求的是关于Jquery的源码分析。因此,我将专注于Jquery这个JavaScript库的相关知识点。 **...
在前端开发中,表单是用户与网页交互的...通过对这些文件的理解和分析,开发者可以学习到如何使用jQuery和Selector.js实现联动下拉框,以及如何结合Ajax和CSS进行表单美化,这对于前端开发者来说是一份宝贵的实战经验。
通过对jQuery 1.2.6源码的深入分析,我们可以了解到JavaScript库的设计原则,以及如何通过优秀的API设计和优化技术提升用户体验。尽管现代前端框架如React和Vue已经取代了jQuery的部分角色,但其设计理念和最佳实践...
### JQuery源码的奥秘逐行分析视频教程 #### JQuery简介 JQuery 是一款轻量级的 JavaScript 库,它极大地简化了 HTML 文档遍历、事件处理、动画以及 Ajax 交互等操作。JQuery 提供了一个简洁且强大的 API 接口,...
接着,源码分析揭示了 init 函数的实现逻辑。函数首先检查是否有 selector 参数传入,如果没有,那么就返回 this,即一个空的 jQuery 对象。如果 selector 是字符串,则根据字符串的类型和内容,进行不同处理。对于 ...
源码分析有助于理解事件委托、事件冒泡等概念,以及jQuery如何优化事件处理以避免内存泄漏。 4. **动画制作:**jQuery的动画效果是其的一大亮点,如`fadeIn()`, `slideUp()`等。源码揭示了jQuery如何利用CSS样式和...
通过分析和实践这个"JavaScript+jQuery程序设计 源码",学习者不仅能巩固JavaScript和jQuery的基础知识,还能提升实际项目开发经验,尤其是处理网页交互和动态效果的能力。同时,这也将有助于理解和应用更多高级特性...