如何使用JavaScript getElementByClass而不是GetElementById?

Ala*_*lan 88 javascript class getelementbyid toggle getelementsbyclassname

我正在尝试根据每个DIV的类别切换网站上某些DIV元素的可见性.我正在使用基本的JavaScript代码段来切换它们.问题是该脚本仅使用getElementById,因为getElementByClassJavaScript不支持.不幸的是,我必须使用class而不是id来命名DIV,因为DIV名称是由我的XSLT样式表使用某些类别名称动态生成的.

我知道某些浏览器现在支持getElementByClass,但由于Internet Explorer不支持,我不想走那条路.

我发现脚本使用函数来按类获取元素(例如本页#8:http://www.dustindiaz.com/top-ten-javascript/),但我无法弄清楚如何集成它们与我的切换脚本.

这是HTML代码.DIV本身缺失,因为它们是在使用XML/XSLT加载页面时生成的.

主要问题:如何获取以下Toggle脚本以获取逐个元素而不是按ID获取元素?

<html>

<head>

<!--This is the TOGGLE script-->
<script type="text/javascript">
<!--
    function toggle_visibility(id) {
       var e = document.getElementById(id);
       if(e.style.display == 'block')
          e.style.display = 'none';
       else
          e.style.display = 'block';
    }
//-->
</script>

</head>

<!--the XML/XSLT page contents will be loaded here, with DIVs named by Class separating dozens of li's-->

<a href="#" onclick="toggle_visibility('class1');">Click here to toggle visibility of class 1 objects</a>

<a href="#" onclick="toggle_visibility('class2');">Click here to toggle visibility of class 2 objects</a>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 86

getElementsByClassName方法现在由最新版本的Firefox,Safari,Chrome,IE和Opera本机支持,您可以创建一个函数来检查本机实现是否可用,否则使用Dustin Diaz方法:

function getElementsByClassName(node,classname) {
  if (node.getElementsByClassName) { // use native implementation if available
    return node.getElementsByClassName(classname);
  } else {
    return (function getElementsByClass(searchClass,node) {
        if ( node == null )
          node = document;
        var classElements = [],
            els = node.getElementsByTagName("*"),
            elsLen = els.length,
            pattern = new RegExp("(^|\\s)"+searchClass+"(\\s|$)"), i, j;

        for (i = 0, j = 0; i < elsLen; i++) {
          if ( pattern.test(els[i].className) ) {
              classElements[j] = els[i];
              j++;
          }
        }
        return classElements;
    })(classname, node);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

function toggle_visibility(className) {
   var elements = getElementsByClassName(document, className),
       n = elements.length;
   for (var i = 0; i < n; i++) {
     var e = elements[i];

     if(e.style.display == 'block') {
       e.style.display = 'none';
     } else {
       e.style.display = 'block';
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 为什么使用内部函数而不仅仅是普通代码? (2认同)

Sam*_*son 74

现代浏览器都支持document.getElementsByClassName.您可以在caniuse上看到哪些供应商提供此功能的完整细分.如果您希望将支持扩展到旧版浏览器,您可能需要考虑使用jQuery或polyfill中的选择器引擎.

较旧的答案

你想要检查jQuery,它将允许以下内容:

$(".classname").hide(); // hides everything with class 'classname'
Run Code Online (Sandbox Code Playgroud)

Google提供了一个托管的jQuery源文件,因此您可以参考它并立即启动并运行.在您的页面中包含以下内容:

<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript">
  $(function(){
    $(".classname").hide();
  });
</script>
Run Code Online (Sandbox Code Playgroud)

  • @Paulo:跨站点脚本不适用于`<script>`标签.谷歌托管的jQuery专为生产网站(作为CDN)而设计.如果您的站点是https,请确保使用https版本以避免混合内容警告. (21认同)
  • 事实上,`<script>`标签注入是跨站点JSONP请求的基础. (3认同)
  • 您也可以从jQuery.com下载源文件并在本地引用它. (2认同)
  • 保罗,你确实意识到,一旦你用<script>标签包含jQuery,就没有跨站点限制吗? (2认同)

Vis*_*hwa 6

document.getElementsByClassName('CLASSNAME')[0].style.display = 'none';
Run Code Online (Sandbox Code Playgroud)

通常,通过使用getElementsByClassName可以返回多个类的数组。因为同一类名可以在同一HTML页面中的多个实例中使用。我们使用数组元素ID来定位所需的类,在我的例子中,它是给定类名的第一个实例。因此,我使用了[0]