getElementsByClassName& IE

时间:2010-01-15 21:21:56

标签: javascript regex

我正在尝试使用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)返回一个空数组仍然会很有趣

4 个答案:

答案 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');

然而,这仍然是错误的,因为:

  1. 它不适用于包含非ASCII或非字母数字字符的任何类名,因为这会将字边界放在错误的位置;

  2. 类名可能包含在正则表达式中具有特殊含义的字符,例如.;这些都需要逃脱。

  3. 您可以在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;
}