【问题标题】:getElementsByClassName & IE [duplicate]getElementsByClassName 和 IE [重复]
【发布时间】:2010-01-15 21:21:55
【问题描述】:

我正在尝试获取一些类名为“特殊”的元素。 我在网上找到了以下脚本,但它只返回一个空数组。

有谁知道出了什么问题?

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 个子节点,最后一个是 &lt;p class="special"&gt;Lorem&lt;/p&gt;,在 firebug 中我一直找到具有类名的节点,但随后它会跳过 a.push。我迷路了!

编辑: 好的,现在它确实可以工作了,但知道为什么 console.log(a) 返回一个空数组仍然很有趣

【问题讨论】:

  • 我想要做的是: if(wrap.getElementsByClassName('ar').length){ do.. } 如果 FF 可以正常工作,但不能在 ie 中工作,因为它不支持 getElementsByClassName
  • “ar a = new Array();”行...不应该是“var a = new Array();”吗?或者更好的是,“var a = [];”
  • 哦,'ar' 溜进来了,我认为 new Array 比 [] 好,我都试过了,没什么区别 =/

标签: javascript regex


【解决方案1】:
re = new RegExp('\b' + classname + '\b')

应该是

re = new RegExp('\\b' + classname + '\\b')

您还应该在变量声明的开头使用“var”。

【讨论】:

  • 不要难过,这是一个正常的错误 =) 您还应该查看他/她的回答中提到的点 bobince。实际上,您可以将其设为“已接受的答案”,因为它的信息比我的要多得多 =)
  • 你比我快 5 分钟!
  • 你不是一个好人吗 ;-) 把它交给 bobince,非常感谢你!
  • 在我的世界里,知识比速度更快。特别是如果时差低至 5 分钟。 ;)
【解决方案2】:

re = new RegExp('\b' + 类名 + '\b'),

\b 在字符串文字中是一个退格字符。他们的意思是:

var re= new RegExp('\\b' + classname + '\\b');

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

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

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

您可以在this question 中找到更符合标准document.getElementsByClassName 接口的替代实现。

【讨论】:

  • 关于各种角色的好点。 =)
  • 你完全正确,好点!那时我不会再使用它了,但 atm 我知道类名肯定是“特殊的”,没有别的,所以我想它在这种特殊情况下有效
【解决方案3】:

也许我弄错了,但我认为 re.test(els[i].className) 不会包含 \b 字边界,因此正则表达式失败。

也就是说,你只是传递“特殊”,没有任何空格、引号或其他边界字符。

【讨论】:

  • ...所以在没有 \b 的情况下尝试一下...哦,或者实际上您可能需要 '\\b' + 类名 + '\\b'。现在我只是在黑暗中射击。
  • 当我调试并使用 \\b + 类名 \\b 时,我得到:re = /\bspecial\b/
【解决方案4】:

我认为您需要做的是:

els = document.all ? node.all : node.getElementsByTagName("*")

我忘记了哪些版本的 IE 不喜欢 node.getElementsByTagName('*'),但我知道它肯定会在某些版本中失败。它会从字面上寻找带有星号标记名称的节点!

我过去使用的实际代码如下:

function getElementsByTagName(node, tag) {
    tag = tag || '*';
    var els = node.getElementsByTagName(tag);
    if( !els.length && (tag == '*' && node.all) ) els = node.all;
}

【讨论】:

  • 谢谢你,但你正在寻找标记名,我是在类名之后..
  • 在 IE6 中修复了 getElementsByTagName("*") 错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-19
  • 2012-10-27
  • 1970-01-01
  • 2017-10-03
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多