【问题标题】:How to Get Element By Class in JavaScript?如何在 JavaScript 中按类获取元素?
【发布时间】:2011-04-18 01:15:29
【问题描述】:

我想替换 html 元素中的内容,因此我使用以下函数:

function ReplaceContentInContainer(id,content) {
   var container = document.getElementById(id);
   container.innerHTML = content;
}

ReplaceContentInContainer('box','This is the replacement text');

<div id='box'></div>

上述方法效果很好,但问题是我想要替换其内容的页面上有多个 html 元素。所以我不能使用 id 而是使用类。有人告诉我,javascript 不支持任何类型的按类函数内置的 get 元素。那么如何修改上述代码以使其与类而不是 id 一起使用呢?

附:我不想为此使用 jQuery。

【问题讨论】:

    标签: javascript


    【解决方案1】:
    document.querySelectorAll(".your_class_name_here");
    

    这将适用于实现该方法的“现代”浏览器 (IE8+)。

    function ReplaceContentInContainer(selector, content) {
      var nodeList = document.querySelectorAll(selector);
      for (var i = 0, length = nodeList.length; i < length; i++) {
         nodeList[i].innerHTML = content;
      }
    }
    
    ReplaceContentInContainer(".theclass", "HELLO WORLD");
    

    如果您想为旧版浏览器提供支持,您可以加载一个独立的选择器引擎,如 Sizzle (4KB mini+gzip) 或 Peppy (10K mini),如果原生 querySelector 方法则回退到它没有找到。

    仅仅为了获取某个类的元素而加载选择器引擎是不是有点矫枉过正?大概。但是,脚本并没有那么大,您可能会发现选择器引擎在脚本的许多其他地方都很有用。

    【讨论】:

    • @Taylor:我认为它适用于 IE8(不是 100% 确定 - 懒得用谷歌搜索)。无论如何,我添加了一些关于使用第三方选择器引擎的向后兼容性的信息。
    • document.querySelector 适用于 IE8 及更高版本:caniuse.com/queryselector
    【解决方案2】:

    我认为是这样的:

    function ReplaceContentInContainer(klass,content) {
    var elems = document.getElementsByTagName('*');
    for (i in elems){
        if(elems[i].getAttribute('class') == klass || elems[i].getAttribute('className') == klass){
            elems[i].innerHTML = content;
        }
    }
    }
    

    会有用的

    【讨论】:

    • 如果页面中只有少数元素,否则这是 O(N) 解决方案
    • getAttribute('class') 似乎可以在除 IE 之外的所有地方工作,然后 getAttribute('className') 在 IE 中工作
    【解决方案3】:

    这应该适用于几乎任何浏览器...

    function getByClass (className, parent) {
      parent || (parent=document);
      var descendants=parent.getElementsByTagName('*'), i=-1, e, result=[];
      while (e=descendants[++i]) {
        ((' '+(e['class']||e.className)+' ').indexOf(' '+className+' ') > -1) && result.push(e);
      }
      return result;
    }
    

    你应该可以这样使用它:

    function replaceInClass (className, content) {
      var nodes = getByClass(className), i=-1, node;
      while (node=nodes[++i]) node.innerHTML = content;
    }
    

    【讨论】:

      【解决方案4】:

      此代码应该适用于所有浏览器。

      function replaceContentInContainer(matchClass, content) {
          var elems = document.getElementsByTagName('*'), i;
          for (i in elems) {
              if((' ' + elems[i].className + ' ').indexOf(' ' + matchClass + ' ')
                      > -1) {
                  elems[i].innerHTML = content;
              }
          }
      }
      

      它的工作方式是遍历文档中的所有元素,并在它们的类列表中搜索matchClass。如果找到匹配项,则替换内容。

      jsFiddle Example, using Vanilla JS (i.e. no framework)

      【讨论】:

      • +1 - 很好地抓住了空格,我总是忘记这样做......我会偷那个答案;)虽然类是javascript中的保留字;你不应该将它用作变量名,即使它确实没有任何危害(目前)。
      • @no 使用该功能,您不必在要替换的元素中包含任何内容。您可以在其中有一个字符串,也可以将其留空。无论哪种方式,调用函数时替换文本都会突然出现在那里。
      • Andrew, @no - 使用 class 作为变量名在 Safari 中不起作用,因此目前确实有影响。
      • getElementsBytagName 返回的数组也有一个length 属性,className/indexOf 测试也随之完成。虽然在这种情况下这不是问题,但常规的 for 循环会更正确。
      • 而不是带有空格的 indexOf,将 elems[i].className 保存在 var cn 中并使用 cn &amp;&amp; cn.match(new RegExp("(^|\\s)" + matchClass + "(\\s|$)")) 会更好,因为它匹配任何空格(空格、不间断空格、制表符等)同时还允许匹配第一个/最后一个类名。示例:jsfiddle.net/AXdtH/1636
      【解决方案5】:

      当然,所有现代浏览器现在都支持以下更简单的方式:

      var elements = document.getElementsByClassName('someClass');
      

      但请注意,它不适用于 IE8 或更早版本。见http://caniuse.com/getelementsbyclassname

      此外,并非所有浏览器都会像预期的那样返回纯 NodeList

      您最好还是使用您最喜欢的跨浏览器库。

      【讨论】:

      【解决方案6】:

      简单易行的方法

      var cusid_ele = document.getElementsByClassName('custid');
      for (var i = 0; i < cusid_ele.length; ++i) {
          var item = cusid_ele[i];  
          item.innerHTML = 'this is value';
      }
      

      【讨论】:

        【解决方案7】:

        当某些元素缺少 ID 时,我会这样使用 jQuery:

        $(document).ready(function()
        {
            $('.myclass').attr('id', 'myid');
        });
        

        这可能是一个奇怪的解决方案,但也许有人觉得它有用。

        【讨论】:

        • 如果有多个类为myclass的元素,它们都将获得id myid,但ids应该是唯一的!此外,OP 明确表示要避免使用 jQuery。
        • 如果您有多个同一个类的元素,添加 foreach() 子句和递增 ID 并不难。我添加了这个解决方案作为那些可以使用 jQuery 的人的替代方案。无论如何,OP已经得到了一堆合适的答案:-)
        【解决方案8】:

        我很惊讶没有使用正则表达式的答案。这几乎是Andrew's answer,使用RegExp.test 而不是String.indexOf,因为根据jsPerf tests,它似乎对多个操作执行得更好。
        还有seems to be supported on IE6

        function replaceContentInContainer(matchClass, content) {
            var re = new RegExp("(?:^|\\s)" + matchClass + "(?!\\S)"),
                elems = document.getElementsByTagName('*'), i;
            for (i in elems) {
                if (re.test(elems[i].className)) {
                    elems[i].innerHTML = content;
                }
            }
        }
        
        replaceContentInContainer("box", "This is the replacement text.");
        

        如果您经常查找相同的类,您可以通过将(预编译的)正则表达式存储在其他地方并将它们直接传递给函数而不是字符串来进一步改进它。

        function replaceContentInContainer(reClass, content) {
            var elems = document.getElementsByTagName('*'), i;
            for (i in elems) {
                if (reClass.test(elems[i].className)) {
                    elems[i].innerHTML = content;
                }
            }
        }
        
        var reBox = /(?:^|\s)box(?!\S)/;
        replaceContentInContainer(reBox, "This is the replacement text.");
        

        【讨论】:

          【解决方案9】:

          var elems = document.querySelectorAll('.one');
          
          for (var i = 0; i < elems.length; i++) {
              elems[i].innerHTML = 'content';
          };

          【讨论】:

          • 这不是一个真正的答案。请尝试explain your code。此外,它基本上是 5 年前发布的这个问题的另一个答案的更紧凑版本。
          • 我不知道是什么问题。这个答案可以。没有评论……什么?这不是黄金法则。你想在这里评论什么?还有But is it readable code?
          【解决方案10】:

          我认为在最初询问时这不是一个有效的选项,但您现在可以使用document.getElementsByClassName('');。例如:

          var elements = document.getElementsByClassName(names); // or:
          var elements = rootElement.getElementsByClassName(names);
          

          请参阅MDN documentation 了解更多信息。

          【讨论】:

            【解决方案11】:

            jQuery 处理这个很容易。

            let element = $(.myclass);
            element.html("Some string");
            

            它将所有 .myclass 元素更改为该文本。

            【讨论】:

            • PS:问题说“我不想为此使用 jQuery。”
            • 好吧,我没看到。
            【解决方案12】:

            get elements by class in javascript 有 3 种不同的方式。但是在这里您可以查询,因为您有多个具有相同类名的元素,您可以使用 2 种方法:

            1. getElementsByClassName 方法 - 它返回文档中或调用它的父元素中具有指定类的所有元素。

              function ReplaceContentInContainer(className, content) {
                  var containers = document.getElementsByClassName(className);
                  for (let i = 0; i < containers.length; i++) {
                      containers[i].innerHTML = content;
                  }
              }
              ReplaceContentInContainer('box', 'This is the replacement text');
              
              <div class='box'></div>
              
            2. querySelectorAll 方法 - 它在 CSS 选择器的基础上选择元素。用一个点将你的 CSS 类传递给它,它会将所有具有指定类的元素作为类似数组的对象返回。

              function ReplaceContentInContainer(className, content) {
                  var containers = document.querySelectorAll(`.${className}`);
                  for (let i = 0; i < containers.length; i++) {
                      containers[i].innerHTML = content;
                  }
              }
              ReplaceContentInContainer('box', 'This is the replacement text');
              
              <div class='box'></div>
              

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-03-09
              • 1970-01-01
              • 2020-09-28
              • 2011-12-11
              • 2020-10-03
              • 1970-01-01
              相关资源
              最近更新 更多