Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript getElementsByClassName&;即_Javascript_Regex - Fatal编程技术网

Javascript getElementsByClassName&;即

Javascript getElementsByClassName&;即,javascript,regex,Javascript,Regex,我试图得到一些类名为“特殊”的元素。 我在网上找到了以下脚本,但它只返回一个空数组 有人知道怎么了吗 getElementsByClassName = function (node, classname){ var a = [], re = new RegExp('\b' + classname + '\b'), els = node.getElementsByTagName("*"), l = els.length, i; for (i = 0; i &l

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

有人知道怎么了吗

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')
getElementsByClassName=函数(节点,类名){
变量a=[],
re=new RegExp('\b'+classname+'\b'),
els=node.getElementsByTagName(“*”),
l=els.长度,
我
对于(i=0;i
wrap包含22个子节点,最后一个是

Lorem

,在firebug中,我一直在寻找具有类名的节点,但随后它跳过了a.push。我迷路了

编辑:
好吧,现在它确实可以工作了,但是知道为什么console.log(a)返回一个空数组还是很有趣的,也许我错了,但是我不认为
re.test(els[I].className)
会包含
\b
单词边界,所以正则表达式失败

也就是说,您只是传递“special”,周围没有任何空格、引号或其他边界字符

re = new RegExp('\b' + classname + '\b')
应该是

re = new RegExp('\\b' + classname + '\\b')
此外,您还应在变量偏差的开头使用“var”

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

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

var re= new RegExp('\\b' + classname + '\\b');
但这仍然是错误的,因为:

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

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


  • 您可以找到一个与标准
    文档匹配的替代实现。GetElementsByCassName
    接口更好。

    我认为您需要做的是:

    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;
    }
    

    我想做的是:if(wrap.getElementsByClassName('ar').length){do..}如果FF可以正常工作,但不在ie中,因为它不支持getElementsByClassName“ar a=new Array();”行。。。它不应该是“var a=new Array();”或者更好,“var a=[];“哦,'ar'插入我认为新数组比[]更好无论如何,我两个都试过了,没有区别=/…所以请在没有\b的情况下试一下。。。哦,或者实际上您需要'\\b'+classname+'\\b'。现在我对此一无所知。当我调试并使用\\b+classname\\b时,我得到了:re=/\bspecial\b/关于各种字符的好观点。=)你完全正确,说得好!我不会再使用这个了,但是我确信类名是“特殊的”而不是别的,所以我想它在这个特殊的情况下是有效的。别难过,这是一个正常的错误=)你也应该检查一下bobince在回答中提到的要点。事实上,你可以让这个答案成为“被接受的答案”,因为它比我的答案有更多的信息!你不是个好人吗;-)把它给了bobince,竖起了你的大拇指,谢谢!在我的世界里,知识胜过速度。尤其是当时差低至5分钟时谢谢你这么做,但是你在寻找标记名,我在寻找类名。
    getElementsByTagName(“*”)
    错误在IE6中得到了修复。