兼容IE8的getElementsByClassName为何会报错?

发布于 2022-09-03 23:38:11 字数 1613 浏览 18 评论 0

代码

因为getElementByClassName不兼容IE8,如下function封装了支持IE8的getElementByClassName函数

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div class="haha">
    dddddddddd
    <div class="wawa">
      ggggggg
    </div>
  </div>
  <script>
   function getElementsByClassName(element, names) {   
        if (element.getElementsByClassName) {
            return element.getElementsByClassName(names);
        } else {
            var elements = element.getElementsByTagName('*');
            var result = [];
            var element,
                classNameStr,
                flag;
            names = names.split(' ');
            for (var i = 0; element = elements[i]; i++) {
                classNameStr = ' ' + element.className + ' ';
                flag = true;
                for (var j = 0, name; name = names[j]; j++) {
                    if (classNameStr.indexOf(' ' + name + '') == -1) {
                        flag = false;
                        break;
                    }
                }
                if (flag) {
                    result.push(element);
                }
            }
            return result;
        }
    }

var t=getElementsByClassName(document,'haha');
var b=getElementsByClassName(t,'wawa');
console.log(t);
console.log(b); 
  </script>
</body>
</html>

报错

Uncaught TypeError: element.getElementsByTagName is not a function

请问问题出在哪?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

杯别 2022-09-10 23:38:11

报错是因为element.getElementsByTagNameelement是一个数组,不是节点对象。所以说

is not a function

我觉得这个方法的设计有点不合理,传入的参数(element, names)element 不要传数组,传一个父对象或者document就好使了。另外帮你简化一下代码,希望有助。

var getElementsByClassName = function(element, names) {        
    var result = [];
    var element = element != undefined ? element : document;            
    var all = element.getElementsByTagName('*');
    for(var i = 0;i < all.length; i++){
        if ((new RegExp('(\\s|^)' + names + '(\\s|$)')).test(all[i].className)) {
            result.push(all[i]);
        }
    }
    return result;
    
}

var t = getElementsByClassName(document,'haha');
var b = getElementsByClassName(t[0],'wawa');  //不能传数组,一定要的话要判断是document还是数组,再去遍历
console.log(t);
console.log(b[0].innerHTML);
满身野味 2022-09-10 23:38:11

没有getElementsByTagName这个方法。

冷情 2022-09-10 23:38:11
var elements = element.getElementsByTagName('*');
// 这里的element你只考虑了他是一个节点的情况,那多个节点呢,非节点呢?

var t=getElementsByClassName(document,'haha');
var b=getElementsByClassName(t,'wawa'); // 这里你传进去的t不就是多个节点么
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文