我正在尝试使用classname“special”获得一些元素。 我在网上找到了以下脚本,但它只返回一个空数组。
有人看到了什么问题吗?
getElementsByClassName = function (node, classname){
var a = [],
re = new RegExp('\b' + classname + '\b'),
els = node.getElementsByTagName("*"),
l = els.length,
i;
for (i = 0; i < l; i += 1) {
if (re.test(els[i].className)) {
a.push(els[i]);
}
}
console.log(a)
return a;
}
var wrap = document.getElementById('wrap');
getElementsByClassName(wrap, 'special')
wrap包含22个子节点,最后一个是<p class="special">Lorem</p>
,在firebug中我一直到找到带有classname的节点,但随后它跳转了a.push。我输了!
修改 好的,所以它现在可以工作了,虽然知道为什么console.log(a)返回一个空数组仍然会很有趣
答案 0 :(得分:5)
re = new RegExp('\b' + classname + '\b')
应该是
re = new RegExp('\\b' + classname + '\\b')
此外,您应该在变量declerations的开头使用“var”。
答案 1 :(得分:3)
字符串文字中的re = new RegExp('\ b'+ classname +'\ b'),
\b
是退格字符。他们的意思是:
var re= new RegExp('\\b' + classname + '\\b');
然而,这仍然是错误的,因为:
它不适用于包含非ASCII或非字母数字字符的任何类名,因为这会将字边界放在错误的位置;
类名可能包含在正则表达式中具有特殊含义的字符,例如.
;这些都需要逃脱。
您可以在this question中找到更符合标准document.getElementsByClassName
界面的替代实施。
答案 2 :(得分:1)
也许我错了,但我不认为re.test(els[i].className)
会包含\b
字边界,所以正则表达式失败了。
也就是说你只是传递“特殊”而没有任何空格或引号或其他边界字符。
答案 3 :(得分:0)
我认为你需要做的是:
els = document.all ? node.all : node.getElementsByTagName("*")
我忘了哪些版本的IE不喜欢node.getElementsByTagName('*'),但我知道它肯定会在某些版本中失败。它将逐字寻找tagNames为星号的节点!
过去我用过的实际代码如下:
function getElementsByTagName(node, tag) {
tag = tag || '*';
var els = node.getElementsByTagName(tag);
if( !els.length && (tag == '*' && node.all) ) els = node.all;
}