如何按类名得到子元素?
我试图得到具有class = 4的子跨度。下面是一个示例元素:
<div id="test"> <span class="one"></span> <span class="two"></span> <span class="three"></span> <span class="four"></span> </div>
我有可用的工具是JS和YUI2。 我可以做这样的事情:
doc = document.getElementById('test'); notes = doc.getElementsByClassName('four'); //or doc = YAHOO.util.Dom.get('#test'); notes = doc.getElementsByClassName('four');
这些在IE中不起作用。 我得到一个错误,对象(doc)不支持这个方法或属性(getElementsByClassName)。 我已经尝试了一些getElementsByClassName的跨浏览器实现的例子,但我无法让他们工作,仍然有这个错误。
我想我需要的是跨浏览器getElementsByClassName或我需要使用doc.getElementsByTagName('span')并循环直到我find类4.我不知道如何做到这一点,虽然。
使用doc.childNodes
遍历每个span
,然后过滤className
等于4
那个:
var doc = document.getElementById("test"); var notes = null; for (var i = 0; i < doc.childNodes.length; i++) { if (doc.childNodes[i].className == "4") { notes = doc.childNodes[i]; break; } }
被接受的答案是这个问题的一个可怕的普遍答案。 它只检查直接的孩子。 很多时候,我们正在寻找任何有这个class名的孩子:
function findClass(element, className) { var foundElement = null, found; function recurse(element, className, found) { for (var i = 0; i < element.childNodes.length && !found; i++) { var el = element.childNodes[i]; var classes = el.className != undefined? el.className.split(" ") : []; for (var j = 0, jl = classes.length; j < jl; j++) { if (classes[j] == className) { found = true; foundElement = element.childNodes[i]; break; } } if(found) break; recurse(element.childNodes[i], className, found); } } recurse(element, className, false); return foundElement; }
对我来说,好像你想要第四个跨度。 如果是这样,你可以这样做:
document.getElementById("test").childNodes[3]
要么
document.getElementById("test").getElementsByTagName("span")[3]
这最后一个确保没有任何隐藏的节点可以搞砸了。
但请注意,旧的浏览器不支持getElementsByClassName
。
那么,你可以做
function getElementsByClassName(c,el){ if(typeof el=='string'){el=document.getElementById(el);} if(!el){el=document;} if(el.getElementsByClassName){return el.getElementsByClassName(c);} var arr=[], allEls=el.getElementsByTagName('*'); for(var i=0;i<allEls.length;i++){ if(allEls[i].className.split(' ').indexOf(c)>-1){arr.push(allEls[i])} } return arr; } getElementsByClassName('4','test')[0];
它似乎有效,但要注意一个HTML类
- 必须以字母:AZ或az开头
- 可以跟随字母(A-Za-z),数字(0-9),连字符(“ – ”)和下划线(“_”)
你可以尝试:
notes = doc.querySelectorAll('.4');
要么
notes = doc.getElementsByTagName('*'); for (var i = 0; i < notes.length; i++) { if (notes[i].getAttribute('class') == '4') { } }
使用带有getElementById
的id的名称,前面没有#
号。 然后,您可以使用getElementsByTagName
获取span
子节点,并循环遍历它们以find具有正确类的节点:
var doc = document.getElementById('test'); var c = doc.getElementsByTagName('span'); var e = null; for (var i = 0; i < c.length; i++) { if (c[i].className == '4') { e = c[i]; break; } } if (e != null) { alert(e.innerHTML); }
演示: http : //jsfiddle.net/Guffa/xB62U/
我将这样做使用jQuery的方式是这样的..
var targetedchild = $(“#test”)。children()。find(“span.four”);
这是一个相对简单的recursion解决scheme。 我认为这是一个宽度优先的search。 这将返回匹配find的类的第一个元素。
function getDescendantWithClass(element, clName) { var children = element.childNodes; for (var i = 0; i < children.length; i++) { if (children[i].className && children[i].className.split(' ').indexOf(clName) >= 0) { return children[i]; } } for (var i = 0; i < children.length; i++) { var match = getDescendantWithClass(children[i], clName); if (match !== null) { return match; } } return null; }
以前的答案升级到ES6
<div id="test"> <span class="es5">es5</span><span class="es6">es6</span> </div> let className = "es6" let elemArray = Array.from(document.getElementById("test").childNodes) elemArray .filter(childNode => typeof childNode.className !== 'undefined') .filter(childNode => childNode.className.includes(className) )
YUI2有一个getElementsByClassName
的跨浏览器实现 。
这是我如何使用YUIselect器。 感谢汉克·盖伊的build议。
notes = YAHOO.util.Dom.getElementsByClassName('four','span','test');
其中four = classname,span =元素types/标签名称,test =父级id。
从这里使用YAHOO.util.Dom.getElementsByClassName()
。