最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - getElementsByClassName doesn't work - Stack Overflow

programmeradmin0浏览0评论

I try to hide some HTML elements onload and then show and manipulate them. The code works fine when I use element's individual IDs with getElementById() method. But when I try to do it more efficiently using the classes, it doesn't work. Here is the code:

<!DOCTYPE html>
<html>    
<head>
    <script src=".11.3/jquery.min.js"></script>    
</head>

<body onload="HideModals()">
    <p id="p1" class="MyModal99">1. I will disappear or not.</p>
    <p id="p2" class="MyModal99">2. I will disappear or not.</p>
    <button id="toggle">Toggle</button>
    <button id="hide">Hide</button>

    <script>
    $(document).ready(function(){
        $("#toggle").click(function(){
            $("#p1").toggle();
        });

        $("#hide").click(function(){
            $("#p2").hide();
        });
    });
    </script> 

    <script>
    function HideModals() {
        //document.getElementById("p1").style.display = 'none';
        //document.getElementById("p2").style.display = 'none';
        document.getElementsByClassName("MyModal99").style.display = 'none';
    }    
    </script>
</body>
</html>

I try to hide some HTML elements onload and then show and manipulate them. The code works fine when I use element's individual IDs with getElementById() method. But when I try to do it more efficiently using the classes, it doesn't work. Here is the code:

<!DOCTYPE html>
<html>    
<head>
    <script src="https://ajax.googleapis./ajax/libs/jquery/1.11.3/jquery.min.js"></script>    
</head>

<body onload="HideModals()">
    <p id="p1" class="MyModal99">1. I will disappear or not.</p>
    <p id="p2" class="MyModal99">2. I will disappear or not.</p>
    <button id="toggle">Toggle</button>
    <button id="hide">Hide</button>

    <script>
    $(document).ready(function(){
        $("#toggle").click(function(){
            $("#p1").toggle();
        });

        $("#hide").click(function(){
            $("#p2").hide();
        });
    });
    </script> 

    <script>
    function HideModals() {
        //document.getElementById("p1").style.display = 'none';
        //document.getElementById("p2").style.display = 'none';
        document.getElementsByClassName("MyModal99").style.display = 'none';
    }    
    </script>
</body>
</html>
Share Improve this question edited Nov 18, 2015 at 2:46 A J 4,02414 gold badges39 silver badges54 bronze badges asked Nov 18, 2015 at 2:04 AshAsh 1831 gold badge3 silver badges10 bronze badges 1
  • 1 Why not stick to jQuery instead of mixing it with vanilla like that? – dsgriffin Commented Nov 18, 2015 at 2:11
Add a ment  | 

7 Answers 7

Reset to default 2

You cannot apply properties in bulk like that. This is why using jQuery is preferred for things like this:

$('.MyModal99').css('display', 'none');

If you want to do this without jQuery:

var nodes = document.getElementsByClassName("MyModal99");
for(var i = 0; i < nodes.length; i++) {
  nodes[i].style.display = 'none';
}

It's because getElementsByClassName() returns an array-like object of elements. You need to access a specific element in order to change the style object.

You could iterate over the elements:

var elements = document.getElementsByClassName("MyModal99");
Array.prototype.forEach.call(elements, function (el) {
  el.style.display = 'none';
});

or:

var elements = document.getElementsByClassName("MyModal99");
for (var i = 0; i < elements.length; i++) {
  elements[i].style.display = 'none';
}

document.getElementsByClassName returns an array, which doesn't have a "style" property. You need to iterate over the array:

    function HideModals() {
        //document.getElementById("p1").style.display = 'none';
        //document.getElementById("p2").style.display = 'none';
        var modals = document.getElementsByClassName("MyModal99");
        for (var i=0; i < modals.length; i++) {
            modals[i].style.display = 'none';
        }
    }    

The issue here is that document.getElementsByClassName("MyModal99") returns a list of items, so you'd have to loop through them and apply your properties one at a time. Something like this:

var elements = document.getElementsByClassName("MyModal99");
for ( var e in elements ) {
    e.style.display = "none";
}

If you need to support older browsers, do it the old fashioned way without a for..in loop:

var elements = document.getElementsByClassName("MyModal99");
for ( var i = 0 ; i < elements.length ; ++i ) {
    elements[i].style.display = "none";
}

Thats because document.getElementsByClassName returns an array of nodes. You need to iterate each of the returned nodes to set their styles individually.

var eleArray = document.getElementsByClassName('MyModal99');

for(var i = 0; i < eleArray.length; i++) {
    eleArray[i].style.display = 'none';
}

You can use a for loop to cycle through all of the elements in the collection returned by getElementsByClassName like this:

var results = document.getElementsByClassName("MyModal99");
for (var i = 0; i < results.length; i++) {
    results[i].style.display = 'none';
}

working demo: http://jsfiddle/gratiafide/3qg308bq/2/

I had difficulties with this code because I didn't know how to name jQuery functions. Now i know. Here is the corrected code:

<!DOCTYPE html>
<html>    
<head>
    <script  src="https://ajax.googleapis./ajax/libs/jquery/1.11.3/jquery.min.js">
    </script>
</head>
<body onload="HideModals()">
<p id="p1" class="MyModal99">1. I will disappear or not.</p>
<p id="p2" class="MyModal99">2. I will disappear or not.</p>
<button id="toggle">Toggle</button>
<button id="hide">Hide</button>
<script>
    $(document).ready(function(){
    $("#toggle").click(function(){
    $("#p1").toggle(100);
    });
    $("#hide").click(function(){
    $("#p2").hide(100);
    });
    });
    function HideModals() {
        $('.MyModal99').css('display', 'none');
    }    
</script>

发布评论

评论列表(0)

  1. 暂无评论