`
jljlpch
  • 浏览: 319595 次
  • 性别: Icon_minigender_1
  • 来自: 南昌
社区版块
存档分类
最新评论

jquery Selector (修改)

阅读更多
/**
 * 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;
  
	//这里就是把复合选择器的字符串从左到右取最小单元的选择进行分析操作
	//分析操作完之后就这个分析过的字符串部分给删除,
	//然后循环分析接下来的剩余的部分。直到字符串为空。
	//这里的最小单元指如#id,~F(+F,>F),.class,[id='xx'],F,:last()之类
	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) {// 首先判断是不是以>开头,因为每次处理都处理都删除分析过的字符串部分 1
			//这里可以看作是>作为找到tagName元素的子节点们的标记
			nodeName = m[1].toUpperCase();//tagName

			//在结果集中(第一次是默认是给定的context)找到满足的tagName元素的所有子节点。
			//两个循环,第一是对结果集中每个元素进行,第二个是对每个元素中每个子元素节点。
			//找到结果集中所有的元素的所有子元素的集合。
			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; // 现在找到的所有元素都是结果集
			t = t.replace(re, "");// remove已经处理过的字符串部分
			
			//对于E (F,>F,+F etc)的形式,这里跳过后面的代码又回到while处执行。
			//但是在while处之后会把这个空格去掉。好像没有进行操作。这里变化了是ret。
			//无论后面是怎样的最小单元选择器,都是要根据这个个ret中的元素来进行操作。
			//如果是tagName,那么就是转4处执行ret[i].getElementsByTagName().
			//如果是>tagName,就执行1处的代码,其它的省略,
			//可见每个最小单元之后都可以是任意的空格分隔。			
			if (t.indexOf(" ") == 0)continue;
			
			foundToken = true;// 找到标识

		} else {// 第二判断是不是以+~开头                 2
			re = /^([>+~])\s*(\w*)/i;
			if ((m = re.exec(t)) != null) {// 以+~开头的
				r = [];
				var merge = {};
				nodeName = m[2].toUpperCase();// 节点名
				m = m[1];// 符号,如+,~
				// 如果selector字符串的匹配+或~(子元素),在结果集中所有元素中找到其兄弟元素节点。
				//不同的+找的是后续的第一个兄弟元素,而~是找到所有的后续的兄弟元素节点。
				//之后把找到的所有的元素放到结果集合中。
				for (var j = 0, rl = ret.length;j < rl; j++) {
					// 把~和+的操作统一在一起进行处理
					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) {
			//这里的意思是在开始的位置找到,号,说明一个selector已经完成了,那么
			//结果集就要存到已经完成的集合中。结果集也应该初如化。
			if (!t.indexOf(",")) {               
				//说明运行到这里的时候,还是单个selector的字符串分析是刚刚开始
			    //因为>~+不可能得到ret[0]元素等于元素的自身。如果等于的话,
				//那就清除出ret,因为接下来就要把ret结果集中的元素存入done中
				if (context == ret[0])
					ret.shift();
					
				done = jQuery.merge(done, ret);// ret的其它元素放入done
				r = ret = [context];// 重新初始化
				//把,采用空格代替。
				t = " " + t.substr(1, t.length);
			} else {
				// 说明这一个selector部分还没有完成,同时还没有找到元素
				 // 或者是 >F的后面用空格来分隔。				
				 //* 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, "");// 去除转义字符
				
				//取数组的最后一个元素,其实就是为了取到是不是为document,
				//因为只有document才有getElementById,为什么不直接采用
				//document呢?难道document的查找会比先根据element.
				//getElementsByTagName找到元素下面的tagname的相符的
				//集合然后采用id属性去判断对比来得更慢吗?不一定?对于大的Dom树,
				//而element的范围又很小的话,可能会慢一些。
				//不过由于这里还要通过属性选择器来进行验证进行验证,一般来说	
				//element.getElementsByTagName会快一点。
				var elem = ret[ret.length - 1];			
				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 {
					//这里处理了#id,.class tagName,div#id四种形式
					//这里我们还可以看出E F形式。并没有特殊的处理。就是采用了
					//E.getElementsByTagName(F)就可以了。
					//这个就能取后元素的所有后代为F和F的元素节点。
					//和F使用是统一的起来。因为E都是结果集。
					for (var i = 0;ret[i]; i++) {
						//因为m有两种情况:[0,#,idName,nodeName]、[all,#/.,idName/class/tagName]
						//这里就是根据这两种情况来取得tagName,m[1] == "#" && m[3]
						//为真,说明是第一种,取nodeName。如果m[1] == "#" && m[3]为假
						//说明m[1] <> "#"||!m[3],而m[1] != ""说明只能是第二个数组中的.或#
						//说明了对于#nodeName,.className采用element.getElementsByTagName(*).
						//当m[1] == "",说明是一个E 元素选择器,它不带任何的前缀。如:p。这个时候
						//m[2]是tagName.
						//m[0] == "" ,只能指第二个数组中的。它=="",说明没有找到符合qclass的regExp.
						//其它的情况都不会为"",它为"",!m[1],!m[2]也都为true.						
						var tag = (m[1] == "#" && m[3] ? m[3] : (m[1] != ""
								|| m[0] == "" ? "*" : m[2]));// 分情况取tagName
                       
						//*的情况下,对于object标签转换为param标签进行操作。
						if (tag == "*"&& ret[i].nodeName.toLowerCase() == "object")
							tag = "param";// Handle IE7 being really dumb about <object>s
							
                        //把结果集合中第一个元素的getElementsByTagName存入到临时的结果集中。
						r = jQuery.merge(r, ret[i].getElementsByTagName(tag));
					}
                    
					//class选择器的话,就根据class属性在找到结果集合中过滤
					if (m[1] == ".") 
						r = jQuery.classFilter(r, m[2]);
                     
					//id选择器的话,就根据id属性在找到结果集合中过滤
					if (m[1] == "#") {
						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, "");
			}

		}

		//这个时候已经找到结果的集合,对于如CSS Selector为:hidden的属性筛选器,
		//它的集合就是context的下面的所有元素节点。也就是说上面的
		//代码无论如何都能找到元素的集合。这个集合可能是>/+~ F
		//或#id,.class tagName,div#id,对于不满足这些条件的,就采用
		//context.getElementsByTagName(*)要取得其下所有的元素
		//确保接下来的过滤(筛选)
		if (t) {// 根据余下的selector,对找到的r集合中的元素进行过滤
			var val = jQuery.filter(t, r);
			ret = r = val.r;
			t = jQuery.trim(val.t);// 去首尾空格
		}
	}
   
	//如果还会有t存在说明一个问题:last == t
	//也就是上一次的过程中没有进行成功的解析一个最小单元的选择器
	//原因是输入的 t 字符串有语法上的错误。如果是采用,分隔的多选择器
	//那么就是当前及之后的选择器不分析。完成的done就是之前的结果集。
	//觉得这样处理不好,很多时间我们都会写错CSS selectror,不报错,
	//对于调试发现问题特难。	
	if (t)	ret = [];

	//出现这种情况说明运行到这里的时候,还是单个selector的字符串分析是刚刚开始
	//如果等于的话,那就清除出ret,因为接下来就要把ret结果集中的元素存入done中
	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;
},

//根据CSS selector表达式查找集合中满足该表达式的所有元素
//还可以根据not来指定不满足CSS selector表达式元素集
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 + "+)")],		
		
		//这里可以看出我们直接调用filter的时候的selector如不是筛选器的话,
		//那就不进行筛选了,这里的selector语法如[@value='test'], [@foo]、
		//:contains('foo'),:even, :last-child, #id, .class的形式
		//可以是上面这几种形式的组合,但不能包括元素选择器。
		//而且复合的形式中间不能采用空格隔开,如[@value='test']#id.class可行的。
		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;
			}
		}        
		// 与上面三种的regexp都不相配
		if (!m)	break;

		//处理 :not(.class)的形式,返回集合中不包含.class的其它的元素
		if (m[1] == ":" && m[2] == "not")
			// 性能上优化 m[3]是.class经常出现
			r = isSimple.test(m[3])// isSimple = /^.[^:#\[\.]*$/
					? jQuery.filter(m[3], r, true).r: jQuery(r).not(m[3]);
					
		//处理.class的过滤。只要看看m[2]这个class是不是被集合中元素的class包含。
		else if (m[1] == ".")// 性能上优化考虑
			r = jQuery.classFilter(r, m[2], not);
			//处理属性过滤。如[@value='test']形式的属性选择
		else if (m[1] == "[") {
			var tmp = [], type = m[3];// 符号,如=

			for (var i = 0, rl = r.length;i < rl; i++) {
				//jQuery.props[m[2]]进行tag中属性名和对应的元素的属性名转换,
				//因为tag中属性名是元素中简写,z取到 元素的属性值
				var a = r[i], z = a[jQuery.props[m[2]] || m[2]];
                
				//直接取元素的属性值,没有取到,说明有的浏览器不支持这种方法
				//进一步尝试采用jQuery.attr来进行非标准的兼容取属性值。
				//就算是取到了值,但对于属性名为style|href|src|selected,
				//它们不能直接取值,要进行特殊的处理,这个在jQuery.attr进行。
				//其实这里可以直接采用jQuery.attr(a, 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]
				//这几种方式之一,这个元素就可能通过。即满足条件。m[5]属性值。
				if (   (type == "" && !!z//[foo]
				        || type == "=" && z == m[5]//[foo=aa]
						|| type == "!=" && z != m[5]//[foo!=aa]
						|| type == "^=" && z&& !z.indexOf(m[5])//[foo^=aa]
						|| type == "$="	&& z.substr(z.length - m[5].length) == m[5]//[foo$=aa]
						|| (type == "*=" || type == "~=")&& z.indexOf(m[5]) >= 0//[foo~=aa]
						)
					^ not)
					tmp.push(a);
			}
			r = tmp;

		}
		//处理:nth-child(n+1)。其实这里也改变了结果集,
		//不过这里是采用的是间接引用的方式,只要知道元素就可以了,
		//不需要dom树去查找。因为它要解析参数中的表达式
		else if (m[1] == ":" && m[2] == "nth-child") {// 性能考量
			var merge = {}, tmp = [],
			// 分析:nth-child(n+1)中的参数,这里支持
			//'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'几种形式
			//test[1]="-或空",test[2]="n前面的数或空",test[3]="n后面的数或空"
			//这样把参数分成三个部分:1是负号的处理,2是xn中的x处理,3是n-x中-x的处理
			//3中的是带有符号的。也就是+或-。
			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 = (test[1] + (test[2] || 1)) - 0, last = test[3] - 0;
            
			//找到符合(first)n+(last)表达式的所有子元素
			for (var i = 0, rl = r.length;i < rl; i++) {
				var node = r[i], parentNode = node.parentNode, 
				id = jQuery.data(parentNode);//为该元素parentNode分配了一个全局的id

				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;//初始化add的标记
                
				//常数的形式,如1,2等等,当然还要判断元素的序号和这个数是否相等。
				if (first == 0) {// 0不能作除数
					if (node.nodeIndex == last)
						add = true;
				}
				// 处理3n+2这种形式同时表达式要大于0
				//当前的子节点的序号要满足两个条件:
				//1、其序号进行first求余的结果=last.
				//2、其序号要大于last。对于-n的形式,要大于-last.
				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]];
			//支持一个符号(如:last)后的方法名与函数的对应
			if (typeof fn == "object")
				fn = fn[m[2]];
             
				//支持更简短的string来代替jQuery.expr中的funciton。
				//这里没有用到。
			if (typeof fn == "string")
				fn = eval("false||function(a,i){return " + fn + ";}");

			// 执行处理函数fn过滤。对于r中每个元素,如果fn返回的结果为true,保留下来。
			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,如,parentNode
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;
},

// 从包含n元素开始的所有后续兄弟,但不包含elem。
sibling : function(n, elem) {
	var r = [];

	for (;n; n = n.nextSibling) {
		if (n.nodeType == 1 && n != elem)
			r.push(n);
	}

	return r;
}
});

 

分享到:
评论

相关推荐

    jQuery打印插件.js

    可接受的值:任何有效jQuery-selector或布尔值 功能:是否从iframe打印而不是弹出窗口; 可以将jQuery-selector现有iframe作为值 附加/添加 默认: null 可接受的值:任何有效jQuery-selector或HTML文本 功能:在选定...

    jquery插件使用方法大全

    jQuery.sub() jQuery 1.5提供了一种创建和修改jQuery副本的方式。可以用来添加不向外部公开的方法,或者对jQuery的某些方法进行重新定义以提供新功能,或者提供更好的封装、避免名称空间冲突。当然,也可以用来开发...

    jQuery详细教程

    下面的例子把所有 p 元素的背景颜色更改为红色: 实例 $("p").css("background-color","red"); 更多的选择器实例 语法 描述 $(this) 当前 HTML 元素 $("p") 所有 &lt;p&gt; 元素 $("p.intro") 所有 class="intro" 的 &lt;p&gt; ...

    jQuery修改class属性和CSS样式整理

    class属性修改  类属性即class属性,规定类名.  用类选择器规定样式的... 用jQuery进行类名修改既可以用attr()方法修改”class”属性,也可以用addClass(), removeClass(), toggleClass()等方法来完成. addClass()

    jQuery 1.3 API 参考文档中文版 html

    + jQuery.selector + jQuery.context * 效果下的queue和dequeue搬到核心下 + live() + die() + closest() * stop( [clearQueue], [gotoEnd]) 增加两个参数 + jQuery.support + jQuery.isArray( obj ) 2009-01-08 23...

    jquery-1.1.3 效率提高800%

    nth-child(n)")Space-separated attributes: After being removed in jQuery 1.0, this selector has now been brought back by popular demand. It allows you to locate individual items in a space-separated ...

    jQuery学习笔记 更改jQuery对象

    生成jQuery对象B,操作jQuery对象B……但是若此过程中,对象A、B……之间有某种关系,那么完全没必要一个个去$(selector),这很繁琐的。因此jQuery提供了一些方法,使流程变为生成jQuery对象A,操作jQuery对象A;...

    Web前端开发技术-Jquery的属性和内容操作.pptx

    data()方法:data()方法用来在指定的元素上存取数据,数据保存在内存中,并不会修改DOM元素结构; data()方法获取属性值语法: $(selector).data("数据名") data()方法设置属性值语法: $(selector).data("数据名", ...

    jQuery1.3API参考文档中文版

    + jQuery.selector + jQuery.context * 效果下的queue和dequeue搬到核心下 + live() + die() + closest() * stop( [clearQueue], [gotoEnd]) 增加两个参数 + jQuery.support + jQuery.isArray( obj ) 2009-01-08 23...

    Web前端开发技术-Jquery元素操作作.pptx

    遍历元素:基本语法$(selector).each(function(index,?domEle)?{}); 该方法的参数是一个函数。这个函数将会在遍历时调用 在函数中,index参数是每个元素的索引号 domEle是每个DOM元素的对象(个元素调用一次不是...

    jquery操作select详解(取值,设置选中)

    select class=”selector”&gt;&lt;/select&gt; 1、设置value为pxx的项选中  $(“.selector”).val(“pxx”); 2、设置text为pxx的项选中 $(“.selector”).find(“option”).attr(“selected”,true); 这里有一个中...

    jquery更改元素属性attr()方法操作示例

    本文实例讲述了jquery更改元素属性attr()方法。分享给大家供大家参考,具体如下: jquery中用attr()方法来获取和设置元素属性,attr是attribute(属性)的缩写, 是js中setAttribute()和getAttribute()的简化 最基本...

    jquery.boilerplate:我的“完美”jQuery 插件样板,用于轻松启动新的 jQuery 插件

    可链接和实例相关默认情况下,该插件可通过 jQuery 使用且可链接: jQuery ( ".selector" ) . PerfectBoilerplate ( { configuration : "goes here" } ) . chainableFunction ( ) ; 该插件为每次调用创建一个自己的...

    jquery-star-rating-plugin:评分插件jQuery

    用法将插件添加到您的源中,使用以下命令进行调用: $('-your-selector-').addRating();选项 icon : star | favorite星星是星星,喜爱是一颗心 max : 5您想要多少颗星/最高评分。 fieldName : 'rating'隐藏输入字段...

    jquery.japanese-input-change:一个jQuery插件,当用日语IME输入的文本更改时,该插件将调用处理程序函数

    一个jQuery插件,当用日语IME输入的文本更改时,该插件将调用处理程序函数 原料药 $(selector).japaneseInputChange(handler) 当文本值从原始值更改时,将调用处理程序。 在IME具有未提交的文本期间,将不会调用该...

    jquery-elastic:Elastic 让你的 textareas 增长和缩小以适应它的内容

    $ ( selector ) . elastic ( ) ; Max height css 属性 'max-height' 会影响 Elastic。 当内容大于设置的最大高度时会出现滚动条。 ###更改日志 版本 变化 1.6.11 修复了 Jquery 的 NoConflict-mode 和一个错误地...

    jQuery插件ContextMenu自定义图标

    jQuery的ContextMenu插件使用起来非常简单(当前前提是看了我的上一篇微博,哈哈),但是想改菜单的图标,很多人又要懵圈了。因为ContextMenu插件只提供了有限的几个图标,如剪切、拷贝、删除等等。 修改图标的相关...

    jQuery-Chaos-Fontsize-Selector:Fontsize选择器,以允许访问更多网站内容

    jQuery Chaos Fontsize选择器Fontsize选择器,以允许访问更多网站内容。 与其他解决方案相比,此插件的目标是在不进行CSS更改和适应现有站点设计的情况下,为Text Size选择器创建一个解决方案。 总是需要进行细微的...

    jukebox:再次具有将JS代码更改为jQuery代码的精神

    顺便说一句,如果您想使用带有jQuery的Dom元素,则必须执行以下操作:$('selector')。get(0); 在那里,我为您节省了一个下午的头痛! 如果您对代码有任何评论,或者总是知道一种使它更好地变得更好的休闲最佳...

    jquery-fullheight:另一个全高技巧

    jQuery 全高 ... property [String] 要在容器调整大小时更改的元素 css 属性。 例子 请参阅示例目录。 执照 The MIT License (MIT) Copyright :copyright: 2015 Andrey Pervakov Permission is hereby gra

Global site tag (gtag.js) - Google Analytics