jquery选择器扩展之样式选择器
https://github.com/wendux/style-selector-jQuery-plugin
http://blog.csdn.net/duwen90/article/details/50570848
http://www.jianshu.com/p/88c101483a9d
jquery中提供了丰富多样的选择器,利用这些选择器我们可以完成大多数任务,但是喜欢思考的我们总得找点事,提问时间:
1.如何选择所有字体颜色为红色的元素
2.如何选择出背景颜色为为白色的元素
3.如何选择出字体大于等于16px的元素
4.如何选择出背景元素为白色并且文字颜色为黄色的元素
等等等等......总之一句话:如何通过css的样式规则来选择元素?
是不是感觉jquery自带的选择器力不从心了吧,好吧,高手就是喜欢这个时候出手得意,鄙人闭关一个时辰,苦思冥想,悟出了这么一个利器,吾命其名为jquery样式选择器插件,少年,既然你能看到我这篇博客,也是有缘人,就不卖你10块钱了,点个赞拿去吧!从此妈妈再也不用担心老师会问如何根据元素的样式特征去选择元素了,看看引入样式选择器插件后,上面几个问题是怎么简单轻松easy nice 搞定的
1.$(
"#c :css({color:'red'})"
)
2.$(
"#c :css({backgroundColor:'white'})"
);
3.$(
"#c :css({fontSize:'>=16px'})"
);
4.$(
"#c :css({backgroundColor:'white',color:'yellow'})"
);
原理:jquery支持选择器扩展:
$.extend($.expr[':'],
{
selectorName: function(e, i, m){
//解析自己选择器,其中m是个数组,e是当前元素,m[3]便是选择器字符串,
// 如果返回true代表当前元素被选中,反之则否
}
}
好的,看到这里你是不是觉得自己也能实现了呢?too young too simple! 当然, 我鼓励你去尝试,但是你要注意两个问题:
1.如何进行运算符支持比如问题3中,要选出字体>=16像素的元素
2.如何支持多个条件匹配,比如问题4中,既要求背景颜色是白色,而且字体是黄色,如果我再加上字体小于18像素并且margin-top大于0,并且是定位方式是fixed的.....
3.假如你css代码中写了这么一句:color:red,然后你在判断是否满足条件时用jquery css("color")取出颜色值a,然后看a和选择器中的色值是否满足条件;这样有问题吗?有! 因为不同浏览器css("color")返回的值是不一样的,如果返回的是"red"那万事大吉,但是返回的可能是#ff0000(这也是红色,只不过换了一个16进制的马甲),这怎么整?好好想想吧!不过你应该知道,浏览器这样做是可以理解的,因为浏览器内部认得肯定是一个数值,而red这种语义化的写法只是为了给开发人员方便而已。
It's your turn. 少年去尝(碰)试(壁)吧!
-----------------------------------------------------------------------------------------------------
----------我是分割线,如果你实现了,或者已经碰的头破血流了,那么请往下看,看看大师是怎么实现的---------------
------------------------------------------------------------------------------------------------------
可以看到我们的选择器字符串是一个对象{}的串,为什么要这样,这可是很巧(xin)妙(ji)的:原因有两个:
1.解析时可以直接用eval转化成js对象
2.css样式非常多,我们不可能在解析时逐一对比到底是哪个样式有规则(可能是font-size也可能是color....),因为最终我们是要通过jquery方法的css去匹配,而css方法正好可以接受一个对象。【ps:这一点不能理解的话你可以试着不要看下面源代码想想定义成其它格式怎么实现,然后你就会默然回首,恍然大悟,大赞一声"喵"的】
如何支持运算符, 无非就是== > < >= <= 这几种,一个正则搞定:/^[><=!]?=?/。
颜色问题怎么办? 关键是思维! 我们虽然不知道自己设置的和再去取得的样子是不是一样,比如我们css中写的是red,我们不用css()返回后的结果a(可能是#ff0000)直接和我们选择器字符串中的值b(red)相比,而是我们先把b设置到某个元素E中之后,然后再用css()取出E的color,记为c,最后用c去和a去比较! (好好体会一下)。
能看到这里,少年,好样的,我果然没有看错你,但是先别高兴,我们还有一个问题,那就是E什么时候创建(当然E肯定是不能显示的,display:none),我们不能每次比较前都创建一个元素吧,对的,缓存!
好了,既然到这一步了,那么代码你也应该能看懂了! 来想象一下,这么狂拽炫酷屌炸天的功能,代码得有多少行? 大胆一点!
看看源码长啥样:
/*
author:duwen 2015.9.3
*/ +function($){
$.extend($.expr[':'],
{
css: function(e, i, m)
{
"use strict";
var s=eval("("+m[3]+")")
var r=/^[><=!]?=?/;
var t,cc
for(var c in s){
s[c]=s[c].replace(r,function(w){t=w;return ""})
if(t=="")t="==";
if(!m[9]){
var d=$("#_csss");
m[9]=d[0]&&d||$("<div id='_csss' style='display:none'>").appendTo("body")
}
m[9].css(c,s[c]);
cc=m[9].css(c);
if (eval("$(e).css(c)"+t+"cc"));
else return false;
}
return true;
}
});
}(jQuery);
惊艳了吧~
jquery选择器扩展之样式选择器的更多相关文章
- jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax
jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...
- jQuery基础(样式篇,DOM对象,选择器,属性样式)
1. $(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真 ...
- jQuery 1.0 | 选择器 | 事件 | 操作样式 | 操作属性
使用jQuery: 1,下载jQuery http://jquery.com/download/ 2,引入jQuery文件 3,定义入口函数 <script src="jquery-1 ...
- CSS 基础知识点 样式 选择器 伪类
CSS 基础知识点汇集 版权声明:这篇博客是别人写的,大神博客地址 : https://www.cnblogs.com/Mtime/p/5184685.html 1.CSS 简介 CSS 指层叠样式表 ...
- jQuery学习笔记(一)——基础选择器、过滤选择器、表单选择器
$()就是jQuery中的函数,它的功能是获得()中指定的标签元素.如演示样例中$("p")会得到一组P标签元素,当中"p"表示CSS中的标签选择器.$()中的 ...
- 认识CSS中css引入方式、选择器、文本样式设置以及显示模式
前端之HTML.CSS(三) CSS CSS-Cascading Styles Sheets,层叠样式表.用于网页的表现,主要用于布局和修饰网页. CSS引入方式 CSS的三种引入方式:行内样式,内部 ...
- JQuery -- 介绍,选择器及其示例, 基本选择器,层次选择器,过滤选择器,表单选择器
1. 什么是jQuery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它就可以使用jQuery里的 ...
- jQuery的基本使用及选择器和筛选器
回顾 事件 鼠标clickdblclickcontextmenumouseentermouseleavemousemovemousedownmouseup键盘keydownkeyupkeypress ...
- Jquery | 基础 | 慕课网 | 类选择器
原生getElementsByClassName()函数的实现代码与jQuery实现代码的比较: <!DOCTYPE html> <html> <head> < ...
随机推荐
- Sqoop 学习之路
sqoop 基础知识和基本操作可以参考这篇博客:https://www.cnblogs.com/qingyunzong/p/8807252.html#_label3
- HDU 1207 汉诺塔II (递推)
经典的汉诺塔问题经常作为一个递归的经典例题存在.可能有人并不知道汉诺塔问题的典故.汉诺塔来源于印度传说的一个故事,上帝创造世界时作了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘.上 ...
- Unity3d 5.x搭载VS2013使用
1. 安装unity vs.首先我们打开我们下载的unity vs.然后就会看见里面有3个文件,我们双击UnityVS 2013-1.8.1.msi.进行安装,在其过程狂点击下一步就可以,直到点击 ...
- oracle goldengate 远程捕获和投递
很早之前,OGG只支持部署在数据库主机上,这叫本地化部署.而现在OGG支持远端部署,即OGG软件不安装在数据库主机上,而是安装在单独的机器上,负责数据抽取和投递. 这样做的好处: l 易于管理 - 在 ...
- prufer编码 cayley定理
背景(在codeforces 917D 报废后,看题解时听闻了这两个玩意儿.实际上917D与之“木有关西”,也可以认为是利用了prufer的一些思路.) 一棵标号树的Pufer编码规则如下:找到标号最 ...
- Webstorm/Phpstorm中设置连接FTP,并快速进行文件比较,上传下载,同步等操作
Phpstorm除了能直接打开localhost文件之外,还可以连接FTP,除了完成正常的数据传递任务之外,还可以进行本地文件与服务端文件的异同比较,同一文件自动匹配目录上传,下载,这些功能是平常ID ...
- 给PHP开启shmop扩展实现共享内存
在项目开发中,想要实现PHP多个进程之间共享数据的功能,让客户端连接能够共享一个状态,需要开启共享内存函数shmop.如果预期考虑会遇到这方面需求,那么最好在编译PHP的时候添加--with-shmo ...
- Mac配置java运行环境的步骤
官网下载地址:jdk1.8版本的 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.htm ...
- P3809 【模板】后缀排序
P3809 [模板]后缀排序 从这学的 后缀数组sa[i]就表示排名为i的后缀的起始位置 x[i]是第i个元素的第一关键字 y[i]表示第二关键字排名为i的数,在第一关键字中的位置 #include& ...
- P2801 教主的魔法(分块)
P2801 教主的魔法 区间加法,区间查询 显然就是分块辣 维护一个按块排好序的数组. 每次修改依然是整块打标记,零散块暴力.蓝后对零散块重新排序. 询问时整块二分,零散块暴力就好辣 注意细节挺多和边 ...