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> < ...
随机推荐
- Knowing is not enough; we must apply. Willing is not enough; we must do.
Knowing is not enough; we must apply. Willing is not enough; we must do. 仅限于知道是不够的,我们必须去实践:单纯的希望是不够的 ...
- python 数据序列化(json、pickle、shelve)
本来要查一下json系列化自定义对象的一个问题,然后发现这篇博客(https://www.cnblogs.com/yyds/p/6563608.html)很全面,感谢作者,关于python序列化的知识 ...
- 20165305 苏振龙 《Java 程序设计》第一次测试总结
第一个代码运行结果截图 功能:从1到5305进行求和 第二个代码运行结果截图 代码托管 第三个代码运行结果截图 (1)源文件的名字为Person.java (2)生成2个字节码文件,名字为Person ...
- 【JavaScript 6连载】一、关于对象(访问)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Django框架----模板继承和静态文件配置
母板 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8& ...
- 大数据自学5-Python操作Hbase
在Hue环境中本身是可以直接操作Hbase数据库的,但是公司的环境不知道什么原因一直提示"Api Error:timed out",进度条一直在跑,却显示不出表. 但是在CDH后台 ...
- sql语句查询排序
一:sql语句单词意义 order by 是用在where条件之后,用来对查询结果进行排序 order by 字段名 asc/desc asc 表示升序(默认为asc,可以省略) desc表示降序 o ...
- 数据库的增、删、改、查 (CURD)
增改查删可以用CURD来表示 增加:create 修改:update 查找:read 删除:delete 增加create : insert +表名+values+(信息): in ...
- mysql常用的操作命令
在mysql中以半角分号;作为命令的结束符 查看当前系统包含的数据库:mysql> show databases [like ' ']; 从一个数据库切换到另一个:mysql>use ol ...
- Systen,IO
private void CreateHtml(string sPath, string txt) { string currPath = @"C:\MyCodeHelper" + ...