javascript document.getElementsByClassName与IE的兼容性

Web*_*ner 75 javascript internet-explorer class classname internet-explorer-8

检索具有特定类的元素数组的最佳方法是什么?

我会使用document.getElementsByClassName,但IE不支持它.

所以我尝试了Jonathan Snook的解决方案:

function getElementsByClassName(node, classname) {
    var a = [];
    var re = new RegExp('(^| )'+classname+'( |$)');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}
var tabs = document.getElementsByClassName(document.body,'tab');
Run Code Online (Sandbox Code Playgroud)

......但IE仍然说:

Object不支持此属性或方法

任何想法,更好的方法,错误修复?

我宁愿不使用涉及jQuery或其他"笨重的javascript"的任何解决方案.

更新:

我得到了它的工作!

正如@joe提到的那样,函数不是一种方法document.

所以工作代码看起来像这样:

function getElementsByClassName(node, classname) {
    var a = [];
    var re = new RegExp('(^| )'+classname+'( |$)');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}
var tabs = getElementsByClassName(document.body,'tab');
Run Code Online (Sandbox Code Playgroud)


...此外,如果您只需要IE8 +支持,那么这将有效:

if(!document.getElementsByClassName) {
    document.getElementsByClassName = function(className) {
        return this.querySelectorAll("." + className);
    };
    Element.prototype.getElementsByClassName = document.getElementsByClassName;
}
Run Code Online (Sandbox Code Playgroud)

正常使用它:

var tabs = document.getElementsByClassName('tab');
Run Code Online (Sandbox Code Playgroud)

Joe*_*Joe 55

这不是文件的方法:

function getElementsByClassName(node, classname) {
    var a = [];
    var re = new RegExp('(^| )'+classname+'( |$)');
    var els = node.getElementsByTagName("*");
    for(var i=0,j=els.length; i<j; i++)
        if(re.test(els[i].className))a.push(els[i]);
    return a;
}

tabs = getElementsByClassName(document.body,'tab');  // no document
Run Code Online (Sandbox Code Playgroud)


小智 17

您可以为旧浏览器创建功能

if (typeof document.getElementsByClassName!='function') {
    document.getElementsByClassName = function() {
        var elms = document.getElementsByTagName('*');
        var ei = new Array();
        for (i=0;i<elms.length;i++) {
            if (elms[i].getAttribute('class')) {
                ecl = elms[i].getAttribute('class').split(' ');
                for (j=0;j<ecl.length;j++) {
                    if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
                        ei.push(elms[i]);
                    }
                }
            } else if (elms[i].className) {
                ecl = elms[i].className.split(' ');
                for (j=0;j<ecl.length;j++) {
                    if (ecl[j].toLowerCase() == arguments[0].toLowerCase()) {
                        ei.push(elms[i]);
                    }
                }
            }
        }
        return ei;
    }
}
Run Code Online (Sandbox Code Playgroud)


Mik*_*ien 13

function getElementsByClassName(className) {
if (document.getElementsByClassName) { 
  return document.getElementsByClassName(className); }
else { return document.querySelectorAll('.' + className); } }
Run Code Online (Sandbox Code Playgroud)

很确定这与Leonid的功能相同,但是document.getElementsByClassName它可以使用.


ken*_*bec 10

您无法真正复制getElementsByClassName,因为它返回一个nodeList,因此它的值是实时的,并随文档一起更新.

您可以返回共享相同类名的静态元素数组 - 但在文档更改时它不会"知道".

(这样的事情不需要太多使图书馆看起来很苗条......)

function getArrayByClassNames(classes, pa){
    if(!pa) pa= document;
    var C= [], G;
    if(pa.getElementsByClassName){
        G= pa.getElementsByClassName(classes);
        for(var i= 0, L= G.length; i<L; i++){
            C[i]= G[i];
        }
    }
    else{
        classes= classes.split(/\s+/);
        var who, cL= classes.length,
        cn, G= pa.getElementsByTagName('*'), L= G.length;
        for(var i= 0; i<cL; i++){
            classes[i]= RegExp('\\b'+classes[i]+'\\b');
        }
        classnameLoop:
        while(L){
            who= G[--L];
            cn= who.className;
            if(cn){
                for(var i= 0; i<cL; i++){
                    if(classes[i].test(cn)== false) {
                        continue classnameLoop;
                    }
                }
                C.push(who);
            }
        }
    }
    return C;
}
Run Code Online (Sandbox Code Playgroud)

//例

var A = getArrayByClassNames('sideBar local')

  • +1表示与实际的getElementsByClassName不同,兼容性技巧(包括querySelectorAll)提供静态快照,而不是实时集合。 (3认同)

Leo*_*nid 9

IE8:

document.getElementsByClassName = function (className) {
    return document.querySelectorAll('.' + className)
}
Run Code Online (Sandbox Code Playgroud)

  • @Phil,是doctype设置的吗? (3认同)