选择器模块

1、push方法的兼容性(了解)

  • 问题:IE8不支持aplly方法中的第二个参数是 伪数组
  • 目标:实现 push 方法的浏览器兼容性问题
var push = [].push;
try {
// 判断 push 是否可用
var container = document.createElement("div");
container.innerHTML = "<p></p><p></p>";
push.apply([], container.childNodes);
} catch(e) {
// push不可用,则自己实现
push = {
apply: function(target, els) {
var j = target.length;
i = 0;
while(target[j++] = els[i++]) {}
target.length = j - 1;
}
};
} finally {
container = null;
} // push.apply([1, 2, 3], ["a", "b"])
// [1, 2, 3, "a", "b"]
  • 优化原则:
将 push 的判断,放入 沙箱 中
在页面加载的时候就会执行这段代码,保证了代码只会检测一次
以后的操作中直接使用 push 即可。

2、整合JS文件

  • 目标:将已经写好的函数放到一个单独的 js 文件中去,实现代码的复用
  • 注意:代码要加注释
get / each
getTag / getId / getClass

2.1 优化封装好的方法

  • 目标:体现复用,优化现有方法

3、支持上下文的通用 get 函数

  • 解释:上下文(context),即当前内容的上面和下面,也就是环境
  • 目标:让 get 函数可以从指定的上下文中取出相应的元素
  • 注意:只有 document 具有 getElementById 方法
  • 思路:先从三个简单的获取函数入手(从小做起),再修改通用 get 函数
// 只查找 context 中的 div 元素
var elms = get("div", context);

3.1 在 context 中查找元素

  • 思路:提供 context 参数
  • 推荐:函数参数顺序,按照使用频率高低的顺序排放

3.1.1 context 是 DOM对象

  • 目标:获取 DOM对象 的后代元素
var getTag = function(tagName, context, results) {
context = context || document;
// ...
};
// getClassName 和 get 同样修改

3.1.2 context 是 DOM对象数组

  • 目标:获取 DOM对象数组中 每个DOM对象的后代元素
  • 技巧:“没有条件创造条件也要上”
var get = function(selector, context, results) {
results = results || [];
context = context || document; var rquickExpr = /^(?:#([\w-]+))|\.([\w-]+)|([\w-]+)|(\*))$/,
m = rquickExpr.exec(selector); if(m) {
if(context.nodeType) {
context = [context];
} each(context, function(i, v) {
if(m[1]) {
results = getElmById(m[1], results);
} else if(m[2]) {
results = getElmsByClsName(m[2], v, results);
} else {
results = getElmsByTag(m[3] || m[4], v, results);
}
});
}
return results;
};

3.1.3 context 是字符串(选择器)

  • 思路:将 选择器 转化为 DOM对象数组
var get = function(selector, context, results) {
// ...
if(typeof context === "string") {
context = get(context);
}
// ...
};

4、复合选择器

4.1 回顾jQuery的选择器

  • 选择器大致分类:
1 基本选择器:id、class、element、*
2 复合选择器
* 2.1 并集选择器 ,
* 2.2 后代选择器 > 空格
2.3 兄弟选择器 ~ +
2.4 过滤选择器
基本过滤选择器 :eq() :odd :even
属性选择器 [k = v]

4.2 实现 并集选择器 和 后代选择器

  • 思路:先处理 逗号,将其分解为几个简单的部分再处理
$(".c .c1, .dv:eq(0), div > [title]");

4.2.1 处理 并集选择器

  • 思路:创建一个 select 函数,用来处理组合选择器
// 去除两边空格函数
var myTrim = function(str) {
if(String.prototype.trim) {
return str.trim();
} else {
return str.replace(/^\s+|\s+$/, "");
}
}; // selector => "#dv, .cls"
var select = function(selector, context, results) {
results = results || []; var newSelectors = selector.split(","); each(newSelectors, function(i, v) {
[].push.apply(results, get(myTrim(v), context));
}); return results;
};

4.2.2 处理后代选择器

  • 目标:获取指定上下文的符合后代选择器的子元素

    • select("s1 s2 s3", context)
  • 思路:
list = select("s1", context);
list = select("s2", list);
list = select("s3", list);
var select = function(selector, context, results) {
results = results || []; var newSelectors = selector.split(","); each(newSelectors, function(i, v) {
var list = myTrim(v).split(" "),
c = context; each(list, function(i, v) {
if(v !== "") {
c = get(v, c);
}
}); results.push.apply(results, c);
}); return results;
};

5、选择器模块整体分析 -要实现的功能

  • 目的:回顾总结选择器模块实现的功能
1 get 函数实现了:通过基本选择器( id, class, tag, * ) 获取DOM对象
2 get 函数实现在某个指定上下文中获取DOM对象
3 select 函数实现了:通过组合选择器 获取DOM对象
4 select 函数实现了:通过后代选择器 获取DOM对象 支持的选择器:
1 基本: "#dv" ".cls" "span"
2 上下文:select("span", "#dv")
3 组合: select(".c1, .c2")
4 后代: select(".c1 .c3");

6、封装函数到一个对象中

  • 目标:将写好的函数封装到一个 select.js 的文件中去
  • 优化:代码复用 和 性能调优
  • 思路:使用沙箱模式,形成独立环境,并对外暴露核心函数:select
  • 注意:select 并非最终的 itcast 函数,不需要使用 window 暴露到全局环境
var select =
(function() {
// ... return select;
})();

7、借用jQuery的 Sizzle 引擎

jQuery基本选择器模块(二)的更多相关文章

  1. jQuery基本选择器模块

    选择器模块 1.获取元素的基本操作 案例:给页面中的div和p设置边框样式 1.1 传统方式 -获取元素并设置样式 实现思路 1 通过 标签名 获取元素 2 遍历循环 设置样式 var dvs = d ...

  2. 第71天:jQuery基本选择器(二)

    jQuery选择器 一.内容过滤选择器 选择器 描 述 返 回 示 例 :contains(text) 匹配含有文本内容text的元素 集合元素 $(“p:contains(今天)”) :empty ...

  3. jQuery Sizzle选择器(二)

    自己开始尝试读Sizzle源码.   1.Sizzle同过自执行函数的方式为自己创建了一个独立的作用域,它可以不依赖于jQuery的大环境而独立存在.因此它可以被应用到其它js库中.实现如下:(fun ...

  4. jQuery自学笔记(二):jQuery选择器

    一.简单选择器 ID选择器:$('#box') 元素标签名:$('div') 类选择器:$('.box') jQuery提供了length和size()两种方法查看返回的元素,可验证ID在页面只出现一 ...

  5. jQuery学习笔记(二):this相关问题及选择器

    上一节的遗留问题,关于this的相关问题,先来解决一下. this的相关问题 this指代的是什么 这个应该是比较好理解的,this就是指代当前操作的DOM对象. 在jQuery中,this可以用于单 ...

  6. jQuery学习之旅 Item2 选择器【二】

    这里接着上一个Item1 把jQuery的选择器讲完.主要有:属性过滤器和子元素过滤器 点击"名称"会跳转到此方法的jQuery官方说明文档. 5. 属性过滤器 Attribute ...

  7. 揭开jQuery的面纱-jQuery选择器简介(二)

    选择器并没有一个固定的定义,在某种程度上说,jQuery的选择器和样式表中的选择器十分相似.选择器具有如下特点: 1.简化代码的编写 2.隐式迭代 3.无须判断对象是否存在 “$”是选择器不可缺少的部 ...

  8. 锋利的jQuery ——jQuery选择器(二)

    一.jQuery选择器 1)CSS选择器 CSS选择器有:1>标签选择器  E{CSS规则} 2>ID选择器   #ID{CSS规则} 3>类选择器  E.className{CSS ...

  9. jQuery源代码学习之八——jQuery属性操作模块

    一.jQuery属性模块整体介绍 jQuery的属性操作模块分四个部分:html属性操作,dom属性操作,类样式操作,和值操作. html属性操作(setAttribute/getAttribute) ...

随机推荐

  1. Day 20 python基础总复习

    一.计算机基础 1.1 计算机基础之编程 编程语言是人与计算机之间交流的介质 编程就是写一堆文件 编程为了奴隶计算机,解放劳动力 1.2 计算机组成原理 CPU 控制器:控制硬件 运算器:逻辑运算和算 ...

  2. [frontend] 根据文字长度 自适应宽度 自适应高度+ Uncaught ReferenceError: xxx is not defined at HTMLDivElement.onclick

    CSS一行代码就可以解决第一个问题: 1.1 根据文字长度,自适应标签宽度 解决方法:把width的设置删掉,加一行代码 display:table; .tag-footdetail{  /*widt ...

  3. Java8自定义条件让集合分组

    /** * 将一个指定类型对象的集合按照自定义的一个操作分组: 每组对应一个List.最终返回结果类型是:List<List<T>> * * @param <T> ...

  4. 进程映射、mmap(day05)

    一.内存管理(续) 每个进程都有自己独立的4G的虚拟地址空间. 冯.诺伊曼体系结构 哈佛体系结构 section 代码段 只读数据段 栈段 举例说明 数据所属的段. 代码参见 memory.c 如何获 ...

  5. Linux下进程与线程的区别

    https://www.cnblogs.com/fah936861121/articles/8043187.html https://my.oschina.net/cnyinlinux/blog/36 ...

  6. 09.正则表达式re-1.正则表达式

    1.正则表达式概述 正则表达式(英语:Regular Expression,在代码中常简写为regex.regexp或RE),是计算机科学的一个概念. 正则表达式使用单个字符串来描述.匹配一系列匹配某 ...

  7. wordpress常见问题

    一.WordPress新手必须注意的两个设置 第一 :设置里面的媒体--关闭wordpress缩略图功能如果开启了三种缩略图,博客上传的图片就会生成不同大小的三份,而基本上博客又没有使用,这样下来严重 ...

  8. [bzoj2631]tree_LCT

    tree bzoj-2631 题目大意:给定一个n个点的树,每个点的初始权值为1,支持:删边加边(这两个操作同时进行,保证操作之后还是一棵树),路径加,路径乘,查询路径和. 注释:$1\le n,q\ ...

  9. 反射常用API

    反射所有功能都是通过class API来实现的 class常用API有: 1.class.GETINTERFACES():获得这个类实现的接口. 2.class.getMethods() Method ...

  10. Github 基本使用

    github GitHub是一个通过Git进行版本控制的软件源代码托管服务,由GitHub公司(曾称Logical Awesome)的开发者Chris Wanstrath.PJ Hyett和Tom P ...