扩展jquery的选择器
I’m sure you all know that it’s possible to create plugins and extend various aspects of the jQuery JavaScript library but did you know you could also extend the capabilities of it’s selector engine?
Well, you can! For example, you might want to add a new ‘:inline’ selector which will return those elements that are displayed inline. Have a look:
$.extend($.expr[':'],{
|
Using the above code, when you want to select elements that are displayed inline you can simply include it within the selector:
$(':inline'); // Selects ALL inline elements
|
That was a pretty simple example but I’m sure you can see the endless possibilites that this enables! And, creating a custom jQuery selector couldn’t really be simpler!
Loaded images selector
You might want to add a ‘loaded’ selector which will work with images, and will return those images that are loaded:
// Flag images upon load: |
Querying element data
jQuery’s ‘data’ function allows us to add special data to elements without having to pollute global variables or add invalid element attributes. One of the things that jQuery lacks is the capability to easily query elements according to their data. For example, one might decide to flag all elements added dynamically (with jQuery) as ‘dom':
// New element: |
Currently there’s no easy way to select all elements that have been flagged but what if we added a new ‘:data’ selector which could query such information?
Here’s how we would do it:
// Wrap in self-invoking anonymous function: |
Usage
Now, selecting elements which have that ‘dom’ flag is really easy:
$(':data(dom)'); // All elements with 'dom' flag
|
The ‘:data’ extension also allows you to query by comparison, for example:
$(':data(ABC=123)'); // All elements with a data key of 'ABC' equal to 123
|
It also allows you to use regular expressions:
// Let's assume we have slightly varying data across a set of elements: |
Additionally, you can select elements on a basis of whether or not they have ANY data applied to them:
$(':data'); // All elements with data
|
Some other examples:
:red
// Check if color of element is red:
$.extend($.expr[':'],{
red: function(a) {
return $(a).css('color') === 'red';
}
});
// Usage:
$('p:red'); // Select all red paragraphs:childOfDiv
// Check if element is a child of a div:
$.extend($.expr[':'],{
childOfDiv: function(a) {
return $(a).parents('div').size();
}
});
// Yes, I know this is exactly the same as $('div p')
// This is just a demonstration! ;)
// Usage:
$('p:childOfDiv'); // Select all paragraphs that have a DIV as a parent:width()
// Check width of element:
$.extend($.expr[':'],{
width: function(a,i,m) {
if(!m[3]||!(/^(<|>)d+$/).test(m[3])) {return false;}
return m[3].substr(0,1) === '>' ?
$(a).width() > m[3].substr(1) : $(a).width() < m[3].substr(1);
}
});
// Usage:
$('div:width(>200)'); // Select all DIVs that have a width greater than 200px
// Alternative usage:
$('div:width(>200):width(<300)'); // Select all DIVs that have a width greater
// than 200px but less than 300px:biggerThan()
// Check whether element is bigger than another:
$.extend($.expr[':'],{
biggerThan: function(a,i,m) {
if(!m[3]) {return false;}
return $(a).width() * $(a).height() > $(m[3]).width() * $(m[3]).height();
}
});
// Usage:
$('div:biggerThan(div#banner))'); // Select all DIVs that are bigger than #banner
// Alternative usage: (something a little more complex)
// (Making use of custom width() selector)
// Select all DIVs with a width less than 600px but an overall
// size greater than that of the first paragraph which has a
// size greater than img#header:
$('div:width(<600):biggerThan(p:biggerThan(img#header):eq(0))');
Like I said, the possibilities are endless…
UPDATE
I’ve created a couple more examples, take a look:
:external
// Check whether links are external:
// (Only works with elements that have href):
$.extend($.expr[':'],{
external: function(a,i,m) {
if(!a.href) {return false;}
return a.hostname && a.hostname !== window.location.hostname;
}
});
// Usage:
$('a:external'); // Selects all anchors which link to external site/page:inView
// Check whether element is currently within the viewport:
$.extend($.expr[':'],{
inView: function(a) {
var st = (document.documentElement.scrollTop || document.body.scrollTop),
ot = $(a).offset().top,
wh = (window.innerHeight && window.innerHeight < $(window).height()) ? window.innerHeight : $(window).height();
return ot > st && ($(a).height() + ot) < (st + wh);
}
});
// Usage:
$('div:inView'); // Selects all DIV elements within the current viewport
// Alternative Usage:
if ( $('div#footer').is(':inView') ) {
// Do stuff...
}
UPDATE #2
I’ve created a plugin which makes it a little easier to add new ‘:’ selectors. Although, it’s not really a ‘plugin’, it’s just a function which resides under the jQuery namespace:
(function($){
|
Creating a new selector with the ‘newSelector’ plugin:
// Method 1: |
Thanks for reading! Please share your thoughts with me on Twitter. Have a great day!
from http://james.padolsey.com/javascript/extending-jquerys-selector-capabilities/
扩展jquery的选择器的更多相关文章
- jquery选择器扩展之样式选择器
https://github.com/wendux/style-selector-jQuery-plugin http://blog.csdn.net/duwen90/article/details/ ...
- jQuery 各种选择器 $.()用法
jQuery 元素选择器jQuery 使用 CSS 选择器来选取 HTML 元素. $("p") 选取 <p> 元素. $("p.intro") 选 ...
- 扩展jquery easyui datagrid编辑单元格
扩展jquery easyui datagrid编辑单元格 1.随便聊聊 这段时间由于工作上的业务需求,对jquery easyui比较感兴趣,根据比较浅薄的js知识,对jquery easyui中的 ...
- 扩展 -------jQuery
本文摘要:http://www.liaoxuefeng.com/ 编写jQuery插件 为了满足需求,我们经常会调用一些插件,js插件都是别人写的,今天就来了解了解一些方法. 给jQuery对象绑定一 ...
- JQuery 实践--扩展JQuery
Why扩展JQuery通过扩展可以利用JQuery所提供的现有代码基础.避免从头编写代码 有效扩展JQuery的规则扩展JQuery的两种形式: $上直接定义实用工具函数 和JQuery包装集进行操作 ...
- jQuery学习笔记——jQuery常规选择器
一.简单选择器在使用 jQuery 选择器时,我们首先必须使用“$()”函数来包装我们的 CSS 规则.而CSS 规则作为参数传递到 jQuery 对象内部后,再返回包含页面中对应元素的 jQuery ...
- jQuery 的选择器常用的元素查找方法
jQuery 的选择器常用的元素查找方法 基本选择器: $("#myELement") 选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myE ...
- HTML 学习笔记 JQuery(选择器)
学习前端也有一段时间了,今天终于进入到JQuery阶段了,对于新手来讲,JQuery的选择器类型之多 功能之强大实在不是一天两天能够记得完的.现在,就采用边学边记录的方式.以后要是忘了的话,也有一个地 ...
- 扩展 jquery miniui 组件实现自动查询数据
主题 之前写过一篇文章分享了公司basecode查找数据后台是怎么实现的(http://www.cnblogs.com/abcwt112/p/6085335.html).今天想分享一下公司前台是怎么扩 ...
随机推荐
- Oracle 物理备份--rman
Oracle 物理备份--rman 1.直接在服务器,打开命令行,输入: rman target/ 2.配置参数也一同备份 configure controlfile autobackup on; 如 ...
- C#读写锁ReaderWriterLockSlim的使用
读写锁的概念很简单,允许多个线程同时获取读锁,但同一时间只允许一个线程获得写锁,因此也称作共享-独占锁.在C#中,推荐使用ReaderWriterLockSlim类来完成读写锁的功能. 某些场合下,对 ...
- .NET批量删除代码前的行号
1 EmEditor Pro.EditPlus .visual studio ,把有行号的代码粘贴进去,按住键盘的Alt键,然后用鼠标拖出选择框列选行号,最后按Delete删除行号; 2 使用正则 ...
- Js 验证中文字符长度
代码如下: //Oracle Varchar2 一个中文对应3个Byte,所以用3个x替换 var commentValue = commentValue.replace(/[^\x00-\xff]/ ...
- MyBatis入门学习教程-实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- 一个github账户多台电脑代码提交
在实际工作生活中,我们可能不一定仅仅在一台电脑上编码,比如:我们平时在单位电脑1上写代码,提交代码到github账户,而我们也可能会在在家里的电脑2上继续工作,提交代码,这样就是在不同的电脑上提交代码 ...
- Oracle补习班第九天
Better to light one candle than to curse the darkness. 与其诅咒黑暗,不如点亮烛光! 1,用SQL备份数据库数据文件 sqlplus / as s ...
- GUI(图形用户界面)
ylbtech-Miscellaneos:GUI(图形用户界面) A,返回顶部 1, 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显 ...
- redis中setbit的用法
原文地址:http://www.zhihu.com/question/27672245 在redis中,存储的字符串都是以二级制的进行存在的.举例:设置一个 key-value ,键的名字叫“andy ...
- FreeBSD从零开始---安装后配置(三)
IPFW和IPF 一.IPFW IPFW意思可以理解为ip防火墙,主要作用是拦截设定规则外的ip包.你可以把这个理解为linux下的iptables,但是,ipfw要比iptables简单易用. ...