BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / www-technology / #30472同步于 2015/6/9
该镜像源已超过 30 天没有更新,可能在源站已被删除。
WWWTechnology机器人发帖

[问题]求指导,示例代码看不懂,实现DOM元素获取,不用JQUERY

yunjunian
2015/6/9镜像同步19 回复
下面是要求,自己不会写,参考下别人的,很惭愧,看不懂,掩面~~o(>_<)o ~~,小语句不懂,大一点的功能也不明白。。。大神能不能解答一下疑惑,疑问在代码注释中,多谢[ema41] 功能要求 $("#adom"); // 返回id为adom的DOM对象 // 可以通过tagName获取DOM对象,例如 $("a"); // 返回第一个<a>对象 // 可以通过样式名称获取DOM对象,例如 $(".classa"); // 返回第一个样式定义包含classa的对象 // 可以通过attribute匹配获取DOM对象,例如 $("[data-log]"); // 返回第一个包含属性data-log的对象 $("[data-time=2015]"); // 返回第一个包含属性data-time且值为2015的对象 // 可以通过简单的组合提高查询便利性,例如 $("#adom .classa");//返回id为adom的DOM所包含的所有子节点中,第一个样式定义包含classa的对象 代码如下: <script> /** *mini $ *@param {string} selector选择器 *@return {Array.<HTMLElement>} 返回匹配的元素列表 */ function $(selector) { /[color=#0000FF]/疑问一?? \w 不是包括[A-Z a-z 0-9_] 。么,那\w_什么意思。[/color] var idReg = /^#([\w_\-]+)/; var classReg = /^.([\w_\-]+)/; var tagReg = /^\w+$/i; // [data-log] // [data-log = "test"] // [data-log = test] // [data-log = 'test'] //疑问二??正则表达式含义不懂 且\3查不到,感觉应该写为/^\[(\w+)? (=["']?(\w+)["']?)?/ // 但是怎么能实现 双引号和单引号一致,正则里可不可以用三目运算符 var attrReg = /(\w+)?\[([^=\]]+)(?:=(["'])?([^\]"']+)\3?)?\]/; //不考虑‘>’、‘~’等嵌套关系 //父子选择器之间用空格相隔 var context = document; //疑问三??本函数是什么意思 blank,且下面actions的取值 function blank() {} function direct(part, actions) { actions = actions || { id: blank, className: blank, tag: blank, attribute: blank }; var fn; //疑问四 ???什么意思,且result在本函数中未声明 var params = [].slice.call(arguments, 2); //id if (result = part.match(idReg)) { fn = 'id'; params.push(result[1]); } //class else if (result = part.match(classReg)) { fn = 'className'; params.push(result[1]); } //tag else if (result = part.match(tagReg)) { fn = 'tag'; params.push(result[0]); } //attribute else if (result = part.match(attrReg)) { fn = 'attribute'; var tag = result[1]; var key = result[2]; var value = result[4]; params.push(tag, key, value); } //疑问五?? actions的参数 return actions[fn].apply(null,params); } function find(parts, context) { var part = parts.pop(); var actions = { id: function (id) { //疑问六:??为何用[],这是json,数组么 return [ document.getElementById(id); ]; }, className: function (className) { var result = []; if(context.getElementsByClassName) { //疑问六,不是没有 这个getElementsByClassName的方法,要不要加函数???? result = context.getElementsByClassName(className ) } else { //从html标签开始从上向下依次遍历所有便签元素 var temp = context.getElementsByTagName('*'); for (var i = 0, len = temp.length; i < len;i++) { var node = temp[i]; //若节点中有className,则堆入result中 if(hasClass(node, className)) { result.push(node); } } } return result; } , tag: function (tag) { return context.getElementsByTagName(tag); }, attribute: function (tag, key, value) { var result = []; //获得tag或所有html标签 var temp = context.getElementsByTagName(tag || '*'); for (var i = 0, len = temp.length; i < len; i++) { var node = temp[i]; if(value) { //获取 key 属性的值 var v = node.getAttribute(key); //疑问七: 下面式子什么意思,都执行还是逻辑值,要是逻辑值写在这里干什么 (v === value) && result.push(node); } //element.hasAttribute(attributename),返回boolean值,若存在 返回true //若属性没有值,把 key给result else if(node.hasAttribute(key)) { result.push(node); } } return result; } }; //direct 的获取,,上有函数 var ret = direct(part, actions); //to array //疑问八: 把ret转换成数组,把数组slice??如何slice,没有 call(ret,n)之类的 ret = [].slice.call(ret); //三目运算符, return parts[0] && ret[0] ? filterParents(parts, ret) : ret; } function filterParents(parts, ret) { var parentPart = parts.pop(); var result = [];//空数组 for (var i = 0, len = ret.length; i < len; i++) { var node = ret[i]; var p = node; // 如果p无父元素 while (p = p.parentNode) { var actions = { id: function (el, id) { return (el.id === id); }, className: function (el, className) { return hasClass(el,className); }, tag: function (el, tag) { return (el.tagName.toLowerCase()) === tag); }, attribute: function (el, tag, key, value) { var valid = true; if(tag) { valid = actions.tag(el, tag); } valid = valid && (value === el.getAttribute(key)); if (value) { valid = valid && (value === el.getAttribute(key)) } return valid; } }; var matches = direct(parentPart, actions, p); if(matches) { break; } } if(matches) { result.push(node); } } return parts[0] && result[0] ? filterParents(parts, result) :result; } var result = find(selector.split(/\s+/), context); return result; } function hasClass(element, className){ var classNames = element.calssName; if(!className) { return false; } classNames = classNames.split(/\s+/); for (var i = 0, len = classNames.length; i < len; i++) { //原来用match 做的, className[i] === 第一次用要记住 if(classNames[i] === className) { return true; } } return false; } </script>
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
lol机器人#1 · 2015/6/9
这么大段代码 好歹说哪里不懂哇
yunjunian机器人#2 · 2015/6/9
都在代码里写着哪里不懂呢。。。。代码注释里[ema1] 【 在 lol 的大作中提到: 】 : 这么大段代码 好歹说哪里不懂哇
june0334机器人#3 · 2015/6/9
乖乖回去看js吧
Loulech机器人#4 · 2015/6/10
这就是jquery啊,不是dom。jquery返回的都是jquery对象,里面有jquery方法,以及被选的dom节点。可以看下jquery 的api,里面的注释说明不全是对的 发自「贵邮」
biger机器人#5 · 2015/6/10
...\w是单词字符啊,不包括'_',所以『\w_』就是匹配单词字符和下划线呗。楼主还是不懂正则吧? 其实他的做法就是先正则匹配,判断是ID,还是class,还是attr。然后分别调用原生的getElementById啊 之类的方法。
zhong9721机器人#6 · 2015/6/10
自己打断点调试,然后模仿着自己写。
yunjunian机器人#7 · 2015/6/10
【 在 biger 的大作中提到: 】 : ...\w是单词字符啊,不包括'_',所以『\w_』就是匹配单词字符和下划线呗。楼主还是不懂正则吧? : 其实他的做法就是先正则匹配,判断是ID,还是class,还是attr。然后分别调用原生的getElementById啊 : 之类的方法。 就是有的说明\w 表示任意单一字符,包括a~z 、A~Z 、0~9 或下划线,所以就想再确认一下 ,这个正则里面的 \3 确实不懂。。 这段大致思路肯定是懂得,就是细究起来有不明白的地方,百度相关信息比较少。。题主会再慢慢看的,谢谢您了
liu487639机器人#8 · 2015/6/10
从头学,完整的学,千万不要靠百度学前端,费时还没效果,另外别用百度,太坑爹。。 另外建议去看下JQuery入门书(我看的是《锋利的JQuery》),浏览式的那种就行,用心看的话一天就能过完 一行一行细看代码是没有问题的,但在这之前如果储备些基本的知识,你就不会有越级打怪的问题了
biger机器人#9 · 2015/6/10
咦,我之前测试不包括下划线啊。。难道我看错了么。 【 在 yunjunian 的大作中提到: 】 : 就是有的说明\w 表示任意单一字符,包括a~z 、A~Z 、0~9 或下划线,所以就想再确认一下 ,这个正则里面的 \3 确实不懂。。 这段大致思路肯定是懂得,就是细究起来有不明白的地方,百度相关信息比较少。。题主会再慢慢看的,谢谢您了