选择器模块

1、获取元素的基本操作

  • 案例:给页面中的div和p设置边框样式

1.1 传统方式 -获取元素并设置样式

实现思路

  • 1 通过 标签名 获取元素
  • 2 遍历循环 设置样式
  1. var dvs = document.getElementsByTagName("div"),
  2. ps = document.getElementsByTagName("p"),
  3. i = 0, j = 0,
  4. dvLen = dvs.length,
  5. pLen = ps.length;
  6.  
  7. for(; i < dvLen; i++) {
  8. dvs[i].style.border = "1px solid red";
  9. }
  10. for(; j < pLen; j++) {
  11. ps[j].style.border = "1px solid red";
  12. }
  • 小结:传统方式存在的不足
  1. 1 代码冗余
  2. 2 没有实现复用
  3. 3 错误率高
  4. 4 效率低
  5. 5 性能不好

1.2 使用函数 -获取元素并设置样式

  • 优势:函数的复用
  • 注意:函数命名,达到 “顾名思义” 的效果
  1. var getElmsByTag = function(tagName) {
  2. return document.getElementsByTagName(tagName);
  3. };
  4.  
  5. var dvs = getElmsByTag("div");
  6. var ps = getElmsByTag("p");
  7.  
  8. // for 循环遍历两次来设置样式

1.3 封装 each 函数

  • 目标:只要是能用循环完成的操作 each 函数都能完成

1.3.1 使用 each 函数简化设置样式

  1. // 1 将 for 循环封装成 each 函数
  2. var each = function(arr) {
  3. for(var i = 0; i < arr.length; i++) {
  4. arr[i].style.border = "1px solid red";
  5. }
  6. };
  7.  
  8. // 2 修改 each 函数的功能 实现修改任何样式
  9. var each = function(arr, style, value) {
  10. for(var i = 0; i < arr.length; i++) {
  11. arr[i].style[ style ] = value;
  12. }
  13. };
  • 不足:只能修改样式
  1. var arr = [1, 3, 5, 7, 10, 9, 8];
  2. 例如:求和、求最大值、查找某值的索引号 等等
  3. 写出以上练习,并找出其中相同点(抽象的能力)

1.3.2 重新封装each函数 -1(添加回调函数)

  • 目标:在回调函数中能访问到数组中每一项和索引号(使用参数)
  1. var each = function(arr, fn) {
  2. var i = 0,
  3. len = arr.length;
  4. for(;i < len; i++) {
  5. fn(i, arr[i]);
  6. }
  7. };

1.3.3 重新封装each函数 -2(添加跳出循环)

  • 目标:让循环的终止可控
  1. var each = function(arr, fn) {
  2. var i = 0,
  3. len = arr.length;
  4. for(; i < len; i++) {
  5. if(fn(i, arr[i]) === false) {
  6. break;
  7. }
  8. }
  9. };

1.3.4 重新封装each函数 -3(添加this支持)

  • 目标:在函数内部使用 this 表示当前元素
  1. var each = function(arr, fn) {
  2. var i = 0,
  3. len = arr.length;
  4. for(;i < len; i++) {
  5. if(fn.call(arr[i], i, arr[i]) === false) {
  6. break;
  7. }
  8. }
  9. };
  • 练习:使用封装好的each遍历元素设置样式

1.4 封装 getElmsByTag 函数(使用容器存储结果)

  • 目标:调用方法获得任意个结果(心想事成)

1.4.1 重新封装 getElmsByTag 函数

  1. var getElmsByTag = function(tagName, results) {
  2. results = results || []; // 设置默认值
  3.  
  4. results.push.apply(results, document.getElementsByTagName(tagName));
  5. return results;
  6. };
  • 验证优化之后的 get 函数:
  1. each(getElmsByTag("div", getElmsByTag("p")), function() {
  2. this.style.background = "green";
  3. });

2、封装通用 get 函数 -通过基本选择器获取元素

  • 思路:实现get函数的两种方式
  1. 1 在原来的函数中直接修改
  2. 2 写一个新的函数,如果要通过标签名获取,则直接调用 getElmsByTag
  3.  
  4. 推荐使用第二种方式
  5. 原因:获取元素的函数可能有多个,例如:通过id获取的函数/通过标签名获取/通过类名获取

2.1 封装 id/className 函数

  • 目标:封装函数实现通过 id 或者 类名 来获取元素

2.1.1 封装getElmById函数 -通过id获取元素

  1. var getElmById = function(id, results) {
  2. results = results || [];
  3. results.push( document.getElementById(id) );
  4.  
  5. return results;
  6. };

2.1.2 封装getElmsByClsName函数 - 通过类名获取元素

  1. var getElmsByClsName = function(clsName, results) {
  2. results = results || [];
  3. results.push.apply(results, document.getElementsByClassName(clsName));
  4.  
  5. return results;
  6. };

2.2 封装get函数

  • 目标:通用函数能通过 id/类名/标签名 获取元素
  1. var get = function(selector, results) {
  2. results = results || [];
  3.  
  4. var rquickExpr = /^(?:#([\w-]+)|\.([\w-]+)|([\w-]+)|(\*))$/,
  5. m = rquickExpr.exec(selector);
  6.  
  7. if(m) {
  8. if(m[1]) {
  9. results = getElmById(m[1], results);
  10. } else if(m[2]) {
  11. results = getElmsByClsName(m[2], results);
  12. } else {
  13. results = getElmsByTag(m[3] || m[4], results);
  14. }
  15. }
  16.  
  17. return results;
  18. };

3、实现兼容 getElementsByClassName 函数

  • 目标:封装 className 函数兼容所有浏览器
  • 问题:
  1. 1 方法存在兼容性,IE8 及以下的浏览器不支持此方法
  2. 2 如何判断浏览器不支持该方法
  3. 3 如何实现该方法

3.1 浏览器能力检测

  • 注意:
  1. 1 能力只需要检测一次即可
  2. 2 能力检测当心函数重写问题
  • 思路:
  1. 1 提供一个:support 对象
  2. 2 对象中提供与被检测方法同名的属性,其值为布尔值
  3. 3 js被加载的时候,就进行能力判断且只判断一次,并将判断的结果进行存储
  4. 4 凡是要用到能力检测的地方直接使用该对象
  1. var support = {};
  2. support.getElementsByClassName = !!document.getElementsByClassName;

3.2 检测 getElementsByClassName(了解,不做要求)

  • 目标:不仅判断有没有这个方法,还要判断能力是否符合要求
  1. var support = {};
  2.  
  3. support.getElementsByClassName = function() {
  4. var isExist = false,
  5. tempDiv = null, tempClsName;
  6. isExist = !!document.getElementsByClassName;
  7.  
  8. if(!isExist || typeof document.getElementsByTagName !== "funtion") {
  9. return false;
  10. }
  11.  
  12. tempDiv = document.createElement("div");
  13. tempClsName = "itcast_" + Math.random();
  14. tempDiv.className = tempClsName;
  15.  
  16. document.body.appendChild(tempDiv)
  17.  
  18. isExist = document.getElementsByClassName(tempClsName)[0] === tempDiv;
  19.  
  20. document.body.removeChild(tempDiv);
  21.  
  22. return isExist;
  23. }();

3.2.1 jQuery中的实现

  1. support.getElementsByClassName = function() {
  2. // function getElementsByClassName() { [native code] }
  3. var rnative = /^[^{]+\{\s*\[native \w/;
  4. return rnative.test(document.getElementsByClassName);
  5. }();

3.3 实现兼容 getElementsByClassName 函数

  • 思路:
  1. 1 通过 标签名 获取到所有元素
  2. 2 遍历集合,通过判断元素的 className 属性,看下是否符合要求
  3. 3 符合要求的添加到 数组
  4. 4 将数组返回
  • 技巧:类名两端加空格,然后使用indexOf判断代替for循环
  1. var getElmsByClsName = function (className, results) {
  2. results = results || [];
  3.  
  4. var allNodes, i, len, cNode;
  5.  
  6. if(document.getElementsByClassName) {
  7. results.push.apply(results,
  8. document.getElementsByClassName(className));
  9. } else {
  10. allNodes = document.getElementsByTagName("*");
  11.  
  12. for(i = 0, len = allNodes.length; i < len; i++) {
  13. cNode = allNodes[i];
  14. if((" " + cNode.className + " ")
  15. .indexOf(" " + className + " ") > -1) {
  16. results.push(cNode);
  17. }
  18. }
  19. }
  20.  
  21. return results;
  22. };

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

  1. jQuery基本选择器模块(二)

    选择器模块 1.push方法的兼容性(了解) 问题:IE8不支持aplly方法中的第二个参数是 伪数组 目标:实现 push 方法的浏览器兼容性问题 var push = [].push; try { ...

  2. JavaScript框架设计(四) 字符串选择器(选择器模块结束)

    JavaScript框架设计(四) 字符串选择器(选择器模块结束) 经过前面JavaScript框架设计(三) push兼容性和选择器上下文的铺垫,实现了在某一元素下寻找,现在终于进入了字符串选择器 ...

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

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

  4. python 全栈开发,Day53(jQuery的介绍,jQuery的选择器,jQuery动画效果)

    js总结 js: 1.ECMAScript5 ES5语法 2.DOM CRUD 获取 3种方式 id tag className //面向对象 对象 : 属性和方法 某个对象中 function $( ...

  5. jQuery 的选择器常用的元素查找方法

    jQuery 的选择器常用的元素查找方法 基本选择器: $("#myELement")    选择id值等于myElement的元素,id值不能重复在文档中只能有一个id值是myE ...

  6. HTML 学习笔记 JQuery(选择器)

    学习前端也有一段时间了,今天终于进入到JQuery阶段了,对于新手来讲,JQuery的选择器类型之多 功能之强大实在不是一天两天能够记得完的.现在,就采用边学边记录的方式.以后要是忘了的话,也有一个地 ...

  7. jQuery的选择器中的通配符总结

    1.选择器 (1)通配符: $("input[id^='code']");//id属性以code开始的所有input标签 $("input[id$='code']&quo ...

  8. JQuery实现的模块交换动画效果

    <!doctype html> <html> <head> <meta http-equiv="content-type" content ...

  9. JQuery 层次选择器

    <!DOCTYPE HTML> <html> <head> <title> 使用jQuery层次选择器 </title> <scrip ...

随机推荐

  1. fiddler抓包 IOS11以上系统

    想要使用fiddler对iphone X进行抓包,按照以前的配置方法,走一遍.还是抓不成,原来是因为IOS11操作系统中,安装完证书之后,还需要再手动信任证书才能正常抓包. 以下内容来自:https: ...

  2. CDR服装设计-旗袍款式图

    在服装行业中的服装款式设计.图案设计和面料设计等方面,CorelDRAW是一款常用绘图设计软件,用CorelDRAW绘制款式图比手绘更容易表达服装结构.比例.图案.色彩等要素,服装款图主要目的是为了更 ...

  3. Hadoop 使用小命令(2)

    一.查看一堆文件共有多少行 查看file1/file2目录下所有文件总共多少行 hadoop fs -text file1/file2/* | wc -l 二.正则表达式 hadoop fs -tex ...

  4. 单点登录之 CAS SSO 从入门到精通(第一天)

    转自:http://blog.csdn.net/lifetragedy/article/details/43817903 啊......it's quite a long time. 好久没更新博客了 ...

  5. 被遗忘的 Logrotate

    转自: http://huoding.com/2013/04/21/246 被遗忘的 Logrotate 发表于 2013-04-21 我发现很多人的服务器上都运行着一些诸如每天切分 Nginx 日志 ...

  6. javascript实现:在N个字符串中找出最长的公子串

    'use strict' module.exports = function 找出最长公子串 (...strings) { let setsOfSubstrings = [] strings.redu ...

  7. js:多种方法实现数组去重

    面试的时候数组去重要多种方法实现, 只想到一种判断重复删除的方法,而且还没写对.后来大概看了一下网上的方法. 下午想到一个网上没见过的filter方法,于是整理了一下,基于以前看到的思想,然后用了一些 ...

  8. 利用python暴力破解压缩文件密码

    import randomimport sysimport zipfileimport timefrom threading import Threadfrom multiprocessing imp ...

  9. Happy 2006

    Happy 2006 Time Limit: 3000MS   Memory Limit: 65536K       Description Two positive integers are sai ...

  10. 0123简单配置LNMP

    简单配置LNMP不怕出现错误,就怕错误不知道出现在哪里?看日值tail -f /var/log/message -- 系统整个的日志tail -f /var/log/nginx/error.log - ...