完全听不懂啊,老师能给个思路吗?
来源:8-9 解决getElementsByClassName()兼容性
Elisa呀
2019-08-19 23:36:23
首先 .node 是个什么属性??
什么是正则????正则表达式又是个啥???那个正则表达式完全没看懂,请老师帮忙再讲一下
var pattern=new RegExp 这句又是什么意思??RegExp是什么?
partern.test 这里 .text 又是什么意思??
searchClass: "light dark" 这里,searchClass:""又是个什么用法???
这几个点老师都是在哪里讲的呀??是我的课看漏了吗??还是老师讲的课学校没上传完呀?总觉得里边有很多没听过的并且老师不解释的东西。
然后,老师留给大家自己去处理的那个问题点,老师能帮忙写一下吗?因为完全没看懂,所以没法自己写
2回答
好帮手慕糖
2019-08-21
同学你好,这里的确稍微有点难。可以先简单了解一下,不用深究, 随着我们深入的学习, 在返回来看这里的知识就会很容易理解了。
如果帮助到了你, 祝学习愉快!
好帮手慕糖
2019-08-20
同学你好,1、node是个变量名,是个自定义的属性。
opt是参数,:这句代码的意思就是如果用户没有传入要查找的元素, 那么就去document中查找。opts.node就是 函数getElementsByClassName下的属性node
2、正则指的就是正则表达式,正则表达式是描述了一种字符串匹配的模式。书写的这个正则的作用:来直接匹配匹配类名或者左右有空白的类名。
(1)^表示以...开头。
(2)\s匹配任何不可见字符,包括空格、制表符、换页符等等。new RegExp()中的\需要转义,否则就是普通的斜杠,所以变为\\s。
(3)$表示以...结尾。
所以类名应该是:'name'(无空格),' name'(前有空格),‘name ’(后有空格),‘ name ’(前后有空格)。
这个后面的课程中有讲解,这里可以先了解下哦。
3、RegExp 是正则表达式的缩写。通过 new 关键词来定义 RegExp 对象,所在这里就是定义正则表达式的哦。
4、test() 是正则表达式中的一个方法,是检索字符串中的指定值。返回值是 true 或 false。
5、如下这个是一个对象{},而searchClass是这个对象的属性名。后面的是属性值哦。
6、这里由于涉及到正则的内容,稍微有些不好理解,可以多看几遍视频哦,这里我们要了解document.getElementsByClassName方法获取DOM元素存在兼容性, 有的浏览器不支持这个方法。
然后, 我们在来理解这节课的主要目的, 就是封装了一个方法getElementsByClassName, 用来处理document.getElementsByClassName方法的兼容性问题。也可以结合以下加了注释的代码来理解下。
var getElementsByClassName = function(opts) { var searchClass = opts.searchClass; // 存储要查找的类名 var node = opts.node || document; // 存储要出查找的范围 var tag = opts.tag || '*'; // 存储一定范围内要查找的标签 var result = []; // 判断浏览器支不支持getElementsByClassName方法 if (document.getElementsByClassName) { // 如果浏览器支持 // 通过getElementsByClassName获取所有的元素 var nodes = node.getElementsByClassName(searchClass); // 判断是否传入了指定范围, 如果传入的li, 那么就只返回对应类名为searchClass的li标签 if (tag !== "*") { // 这里的node = nodes[i++]表示直到nodes集合中的最后一个元素。停止循环。这个就是循环条件哦。 /** * 可以这样理解for循环中间的代码是用来判断是否满足循环条件的 * 当i = nodes.length;时候, nodes[nodes.length]值为undefined。 所以node的也被赋值为undefined, * 此时通过隐士类型转换, undefined会被转成false,不满足循环条件了,也就退出循环了 */ for (var i = 0; node = nodes[i++];) { // 判断获取元素的标签名和指定的标签名是否相等 if (node.tagName === tag.toUpperCase()) { // 相等的话,就将获取的元素存在到一开始定义的数组中 result.push(node); } } } else { // 直接将获取的所有元素赋值给result result = nodes; } // 最后返回获取的元素 return result; } else { // 使用IE8以下的浏览器能够支持该属性 // 所有浏览器都会支持getElementsByTagName这个方法, 所以用给这个方法来兼用不支持getElementsByClassName的方法 var els = node.getElementsByTagName(tag); // 获取所有元素 var elsLen = els.length; var i, j; // 这里是定义一个正则表达式, 用来匹配传入的类名 /** * 正则表达式的定义及相关用法,后面会有对应的章节详细讲解, 同学目前只需要简单了解即可哦 */ var pattern = new RegExp("(^|\\s)" + searchClass + "(\\s|$)"); /** * 通过for循环, 将标签中拥有类名元素找到, 赋值给result */ for (i = 0, j = 0; i < elsLen; i++) { // 检测正则表达式, if (pattern.test(els[i].className)) { result[j] = els[i]; j++; } } return result; }
然后在html中调用。
最终结果:获取了所有类名light的li标签元素, 没有获取到类名为light的div元素
如果觉得不好理解, 可以先结合代码实现的效果, 简单了解一下,先梳理下思路,根据思路来看代码哦。
如果帮助到了你, 欢迎采纳!
祝学习愉快!
相似问题