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选择器扩展之样式选择器的更多相关文章

  1. jQuery 选择器 筛选器 样式操作 文本操作 属性操作 文档处理 事件 动画效果 插件 each、data、Ajax

    jQuery jQuery介绍 1.jQuery是一个轻量级的.兼容多浏览器的JavaScript库. 2.jQuery使用户能够更方便地处理HTML Document.Events.实现动画效果.方 ...

  2. jQuery基础(样式篇,DOM对象,选择器,属性样式)

      1. $(document).ready 的作用是等页面的文档(document)中的节点都加载完毕后,再执行后续的代码,因为我们在执行代码的时候,可能会依赖页面的某一个元素,我们要确保这个元素真 ...

  3. jQuery 1.0 | 选择器 | 事件 | 操作样式 | 操作属性

    使用jQuery: 1,下载jQuery http://jquery.com/download/ 2,引入jQuery文件 3,定义入口函数 <script src="jquery-1 ...

  4. CSS 基础知识点 样式 选择器 伪类

    CSS 基础知识点汇集 版权声明:这篇博客是别人写的,大神博客地址 : https://www.cnblogs.com/Mtime/p/5184685.html 1.CSS 简介 CSS 指层叠样式表 ...

  5. jQuery学习笔记(一)——基础选择器、过滤选择器、表单选择器

    $()就是jQuery中的函数,它的功能是获得()中指定的标签元素.如演示样例中$("p")会得到一组P标签元素,当中"p"表示CSS中的标签选择器.$()中的 ...

  6. 认识CSS中css引入方式、选择器、文本样式设置以及显示模式

    前端之HTML.CSS(三) CSS CSS-Cascading Styles Sheets,层叠样式表.用于网页的表现,主要用于布局和修饰网页. CSS引入方式 CSS的三种引入方式:行内样式,内部 ...

  7. JQuery -- 介绍,选择器及其示例, 基本选择器,层次选择器,过滤选择器,表单选择器

    1. 什么是jQuery对象 jQuery 对象就是通过jQuery包装DOM对象后产生的对象. jQuery对象是jQuery独有的.如果一个对象是jQuery对象,那么它就可以使用jQuery里的 ...

  8. jQuery的基本使用及选择器和筛选器

    回顾 事件 鼠标clickdblclickcontextmenumouseentermouseleavemousemovemousedownmouseup​键盘keydownkeyupkeypress ...

  9. Jquery | 基础 | 慕课网 | 类选择器

    原生getElementsByClassName()函数的实现代码与jQuery实现代码的比较: <!DOCTYPE html> <html> <head> < ...

随机推荐

  1. TMC首秀:写作带给我生命的影响与感动

    蓦然回首,写作已陪伴了我十三个年头,横跨大学.读研.工作之初.直到现在.我将分四个小乐章,分享写作给我的生命带来的影响和感动. 第一乐章:治疗与励志 说起写作的缘由,虽然可以追溯到初高中时读过的一点文 ...

  2. 使用Java注解自动化处理对应关系实现注释代码化

    概述 假设我们要从一个 ES 索引(相当于一张DB表)查询数据,ES表有 biz_no, type, status 等字段, 而应用对象则有属性 bizNo, type, status 等.这样,就会 ...

  3. (2018干货系列八)最新VR学习路线整合

    怎么学VR 即虚拟现实技术,是一种可以创建和体验虚拟世界的计算机仿真系统,它利用计算机生成一种模拟环境,是一种多源信息融合的.交互式的三维动态视景和实体行为的系统仿真使用户沉浸到该环境中.VR/AR/ ...

  4. easyui dialog 表单提交,弹框初始化赋值,dialog实现

    //定义弹框html<div id="delete" class="easyui-dialog" title="Delete" dat ...

  5. dubbo原理

    1,观察DubboBeanDefinitionParser 的构造方法,给它打一个断点,发现其前一步在DubboNamespaceHandler 应用启动会连续调此方法 DubboBeanDefini ...

  6. Eclipse在Debug模式下经常进入ThreadPoolExecutor解决办法

    1.进入Window-->搜索:debug

  7. LNMP 添加 memcached服务

    LNMP 添加 memcached服务   由于memcached具有更多的功能和服务,已经不推荐使用memcache了.(缺少个字母d) 1. 首先安装memcached服务端. 这里使用yum源安 ...

  8. pyqt5 树节点点击实现多窗口切换

    # coding=utf-8 import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui ...

  9. django 上传文件及反馈信息

    from django.shortcuts import render,HttpResponse from django.views import View from Fiskars.models i ...

  10. yii2项目中运行composer 过程中遇到的问题

    问题1: Your requirements could not be resolved to an installable set of packages 则表明 未安装fxp/composer-a ...