JQuery日期_5.20 JQuery对Sizzle选择器的扩展

代码很简单直接上源码

function winnow( elements, qualifier, not ) {
	//如果qualifier是函数
	if ( jQuery.isFunction( qualifier ) ) {
		//not为true时,返回qualifier返回false的elements
		//not为false时,返回qualifier返回true的elements
		return jQuery.grep( elements, function( elem, i ) {
			/* jshint -W018 */
			return !!qualifier.call( elem, i, elem ) !== not;
		});

	}
	//如果qualifier是DOM元素
	if ( qualifier.nodeType ) {
		//not为true时,返回elements中和qualifier不是同一元素的elements
		//not为false时,返回elements中和qualifier是同一元素的elements
		return jQuery.grep( elements, function( elem ) {
			return ( elem === qualifier ) !== not;
		});

	}
	//如果qualifier是字符串(将qualifier当成selector)
	if ( typeof qualifier === "string" ) {
		// 如果selector不是多级selector(多级selector:div #id)或多selector(selector, selector)
		// 直接调用jQuery.filter( qualifier, elements, not )返回结果
		// risSimple = /^.[^:#\[\.,]*$/
		if ( risSimple.test( qualifier ) ) {
			return jQuery.filter( qualifier, elements, not );
		}
		// 如果selector是多级selector(多级selector:div #id)或多selector(selector, selector)
		// 解释: 因为多级selector或selector无法直接加上:not组成伪类选择器
		//       所以先过滤,再遍历根据not参数过滤
		qualifier = jQuery.filter( qualifier, elements );
	}

	return jQuery.grep( elements, function( elem ) {
		return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;
	});
}
/**
 * filter方法是对自身进行筛选
 * find方法是对子集进行查找或匹配
 */
jQuery.filter = function( expr, elems, not ) {
	var elem = elems[ 0 ];

	//如果有not参数,修正selector为not伪类表达式
	if ( not ) {
		expr = ":not(" + expr + ")";
	}

	return elems.length === 1 && elem.nodeType === 1 ?
		//只有一个元素看是否和表达式匹配
		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
			return elem.nodeType === 1;
		}));
};

jQuery.fn.extend({
	find: function( selector ) {
		var i,
			len = this.length,
			ret = [],
			self = this;
		// example:
		// var e = document.getElementById('a');
		// var $li = $('div').find(e);
		if ( typeof selector !== "string" ) {
			return this.pushStack( jQuery( selector ).filter(function() {
				for ( i = 0; i < len; i++ ) {
					// this指向jQuery( selector )迭代的当前元素
					// 如果调用.find(selector)的JQuery对象中的的某个元素包含selector,返回true
					if ( jQuery.contains( self[ i ], this ) ) {
						return true;
					}
				}
			}) );
		}

		//$('ul').find('li');
		for ( i = 0; i < len; i++ ) {
			jQuery.find( selector, self[ i ], ret );
		}

		// Needed because $( selector, context ) becomes $( context ).find( selector )
		// 删除重复元素
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
		// 拼接调用者和selector,example,$(div).find('ul'),ret.selector为div ul
		ret.selector = this.selector ? this.selector + " " + selector : selector;
		return ret;
	},
	// 保留匹配selector的元素
	filter: function( selector ) {
		return this.pushStack( winnow(this, selector || [], false) );
	},
	// 删除匹配selector的元素
	not: function( selector ) {
		return this.pushStack( winnow(this, selector || [], true) );
	},
	// 如果调用的jquery元素有一个符合selector返回true
	is: function( selector ) {
		return !!winnow(
			this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test( selector ) ?
				jQuery( selector ) :
				selector || [],
			false
		).length;
	}

JQuery日期_5.20 JQuery对Sizzle选择器的扩展

时间: 2024-07-29 23:54:11

JQuery日期_5.20 JQuery对Sizzle选择器的扩展的相关文章

JQuery日记_5.14 Sizzle选择器(七)

上篇说道,tokenize方法会把selector分割成一个个selector逻辑单元(如div>a是三个逻辑单元 'div','>','a')并为之片段赋予对应类型的过滤函数. for ( type in Expr.filter ) { if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || (match = preFilters[ type ]( match ))) ) { matc

JQuery日记_5.13 Sizzle选择器(六)选择器的效率

当选择表达式不符合快速匹配(id,tag,class)和原生QSA不可用或返回错误时,将调用select(selector, context, results, seed)方法,此方法迭代DOM选择.过滤元素, 在DOM树非常大的时候为了保证效率,应该保证html设计的合理,尽量使用可快速匹配(id,tag,class)的表达式,其次是QSA支持的选择器,尽量不要使用jquery扩展的selector和嵌套selector,然后是尽量不要使用位置伪类(它是从左向右查找,需要多次循环内套循环遍历)

JQuery日记 5.11 Sizzle选择器(五)

//设置当前document和document对应的变量和方法 setDocument = Sizzle.setDocument = function( node ) { var hasCompare, //node为Element时返回node所属document //node为Document时返回node //node为空时返回window.document doc = node ? node.ownerDocument || node : preferredDoc, //document

jQuery日期选择器插件date-input

官网:http://jonathanleighton.com/projects/date-input/ 下载: http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js http://github.com/jonleighton/date_input/raw/master/jquery.date_input.js http://github.com/jonleighton/date_input/raw/master/date_

基于Bootstrup的jQuery日期时间选择器

bootstrap-datetimepicker是一款基于Bootstrup 3的超实用jQuery日期时间选择器.通过该插件你可以非常容易的创建很酷的bootstrup样式的日期时间选择器. 你也可以通过修改css文件来自定义它的样式. 该jQuery日期时间选择器的最小外部依赖需求是: jQuery Moment.js Bootstrap.js(如果你不想使用完整的bootstrup,至少需要transition 和collapse) Bootstrap Datepicker script

jQuery学习笔记(三)使用选择器二

简单的伪类选择器也被称为定位过滤器,因为它们主要根据编号和排位筛选特定位置上的元素,或者过滤掉特定元素 简单的伪类选择器 说明 :first 匹配找到的第一个元素 :last 匹配找到的最后一个元素 :not 去除所有与给定选择器匹配的元素 :even 匹配所有索引值为偶数的元素,从0开始计数 :odd 匹配所有索引值为奇数的元素,从0开始计数 :eq 匹配一个给定索引值的元素,从0开始计数 :gt 匹配所有大于给定索引值的元素,从0开始计数 :lt 匹配所有小于给定索引值的元素,从0开始计数

jQuery:自学笔记(2)——jQuery选择器

jQuery:自学笔记(2)--jQuery选择器 基本选择器 说明 jQuery的基本选择器与CSS的选择器相似: 实例 标签选择器 //使用标签选择器更改字体大小 $(div).css('font-size','18px') ID选择器 //使用id选择器改变背景颜色 $('#div1').css('background','red'); 说明:ID选择器中,ID前面必须加一个#,以表明这是一个jQuery的ID选择器. 类选择器 //使用类选择器设置字体样式 $('.spanclass')

jQuery入门笔记之(一)选择器引擎-【转】

---恢复内容开始--- 原文:http://segmentfault.com/a/1190000004230781 一. 常规选择器 (一)简单选择器 模仿的是CSS选择器,只不过在使用jQuery选择器时,我们首先必须使用“$()”函数来包装我们的 CSS 规则.而CSS 规则作为参数传递到jQuery对象内部后,再返回包含页面中对应元素的 jQuery 对象.随后可以进行节点操作,例如:$('#box').css('color', 'red'); . 那么除了 ID 选择器之外,还有两种基

精确到秒的JQuery日期控件

项目中需要用到精确到秒的日期控件,到网上搜了一下,发现有一个JQuery控件可以实现该功能---TimerPicker.但是官网上没有提供该控件的完整Demo,而且没有提供汉化包,所以自己汉化了一下,以供需要的朋友参考. 效果图如下: 首先在页面中引用一下库: <link type="text/css" href="css/jquery-ui-1.8.17.custom.css" rel="stylesheet" /> <lin