getElementsByClassName 和 IE8:对象不支持此属性或方法

IT技术 javascript internet-explorer-8
2021-02-26 07:52:55

我知道“ getElementsByClassName”是不支持的IE8你知道我可以用什么代替吗?我因错误而烦人

“对象不支持此属性或方法”。

HTML代码是:

function sumar() {
var elems = document.getElementsByClassName('verdana14 toAdd');
var myLength = elems.length;
total = 0;
for (var i = 0; i < myLength; ++i) {
   if (elems[i].value!="") {
       total += parseInt(elems[i].value,10);
       }
    }

var promedio = total/myLength;
parseFloat(document.getElementById('promediocal').value = promedio.toFixed(2));
}

这是调用 javascript 函数的输入文本:

<input name='AE_EA_1_BIV_003_2' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_2' style='width:50px' onChange='sumar()'/>
<input name='AE_EA_1_BIV_003_3' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_3' style='width:50px' onChange='sumar()'/>
<input name='AE_EA_1_BIV_003_4' type='text' class='verdana14 toAdd' id='AE_EA_1_BIV_003_4' style='width:50px' onChange='sumar()'/>
5个回答

使用document.querySelectorAll('.verdana14.toAdd').

另请参阅我的相关博客文章

我下载了 jQuery 并使用了 document.querySelectorAll('.verdana14.toAdd');
2021-04-20 07:52:55
谢谢,我通过用 qsA 替换 qs 更正了我的错字。
2021-05-08 07:52:55
这将提供最简单的解决方案,但您必须querySelectorAll获得多个元素。
2021-05-11 07:52:55
如果使用原生浏览器方法 ( document.querySelectorAll()),则不需要 jQuery 来使用它,反之亦然。
2021-05-15 07:52:55

getElementsByClassName IE8 不支持该方法。

您应该使用document.querySelectorAll('.classname')(在 IE8+ 中工作)或实现该功能的库 - 例如:

  • jQuery

  • Moo Tools

  • DOJO

  • YUI

  • Prototype

    ……其中……


querySelectorAll 支持:

http://www.quirksmode.org/dom/w3c_core.html#t13

getElementsByClassName 支持:

http://www.quirksmode.org/dom/w3c_core.html#t11

你可以自己写。就像是:

function GEBCN(cn){
    if(document.getElementsByClassName) // Returns NodeList here
        return document.getElementsByClassName(cn);

    cn = cn.replace(/ *$/, '');

    if(document.querySelectorAll) // Returns NodeList here
        return document.querySelectorAll((' ' + cn).replace(/ +/g, '.'));

    cn = cn.replace(/^ */, '');

    var classes = cn.split(/ +/), clength = classes.length;
    var els = document.getElementsByTagName('*'), elength = els.length;
    var results = [];
    var i, j, match;

    for(i = 0; i < elength; i++){
        match = true;
        for(j = clength; j--;)
            if(!RegExp(' ' + classes[j] + ' ').test(' ' + els[i].className + ' '))
                match = false;
        if(match)
            results.push(els[i]);
    }

    // Returns Array here
    return results;
}

会工作得很好,但如果你愿意,你可以写一个更快的。然后你可以改变:

document.getElementsByClassName('verdana14 toAdd');

到:

GEBCN('verdana14 toAdd');
@amnotiam 谢谢,是的,我被 PHP 弄糊涂了,忘记了哪个替换了所有没有 g 修饰符的。我特意从\s` `切换到` ` 因为我不认为这个函数会用制表符或换行符来调用。我修改了它以修剪尾随空格。
2021-04-25 07:52:55
@amnotiam cn.split 上也不需要g标志。它不会做任何事情,因为 split 无论如何都会找到所有匹配项。
2021-04-29 07:52:55
您需要更改,cn.replace(' ', '.')因为它只会替换第一个空格。您将需要一个global regex,它也会将相邻空间视为一个。与您的 相同cn.split(/ /),它应该是全局的,并测试相邻的空格,并且它应该包含其他空格字符,如制表符,所以\s可能更好。
2021-04-30 07:52:55
是的,你是对的分裂。
2021-05-03 07:52:55
是的,可能是关于标签/新行的安全赌注。
2021-05-12 07:52:55

使用 jQuery,或从 getElementsByTag 过滤结果

您可以尝试使用 jquery,因为它具有替代类选择器来通过类名获取元素。$(".testclass").each... 它将按类名为您提供所需的元素