开发者

Don't show more than one div at a time Javascript

I currently have four divs, which are each linked to a hidden div:

div1 - div1hidden div2 - div2hidden div3 - div3hidden div4 - div4hidden

When a user clicks on one of the divs the hidden div appears. When clicked on again the div disappears.

The problem I have is if all four divs are clicked on all four hidden will appear. What I would like to do is only show one at a time.

For Example if 'div1hidden' is showing and the user clicks on div2 before hiding div1hidden, div1hidden will hide and div2hidden will appear.

This is the code I have so far:

function hide_menu(id){document.getElementById(id).style.display = "none";}
function show_menu(id){document.getElementById(id).style.display = "block";}
<div class="div1" onclick="if (document.getElementById('div1hidden').style.display=='none') show_menu('div1hidden'); else hide_menu('div1hidden');">&开发者_Go百科lt;/div>

<div class="div2" onclick="if (document.getElementById('div2hidden').style.display=='none') show_menu('div2hidden'); else hide_menu('div2hidden');"></div>

<div class="div3" onclick="if (document.getElementById('div3hidden').style.display=='none') show_menu('div3hidden'); else hide_menu('div3hidden');"></div>

<div class="div4" onclick="if (document.getElementById('div4hidden').style.display=='none') show_menu('div4hidden'); else hide_menu('div4hidden');"></div>

Thanks in advance

Rick


Try something like this:

Add a function:

function hide_all() {
    hide_menu('div1hidden');
    hide_menu('div2hidden');
    hide_menu('div3hidden');
    hide_menu('div4hidden');
}

Now call that function before you show any hidden div:

<div class="div1" onclick="if (document.getElementById('div1hidden').style.display=='none') {hide_all(); show_menu('div1hidden'); } else { hide_menu('div1hidden'); }"></div>


I'm not sure what's wrong with just hiding all other divs before opening the one your need:

<div class="div1" onclick="if (document.getElementById('div1hidden').style.display=='none') { hide_menu('div2hidden'); hide_menu('div3hidden'); hide_menu('div4hidden'); show_menu('div1hidden');} else hide_menu('div1hidden');"></div>

<!-- and so on -->

I must say that this isn't exactly the best approach to do the comparison in the onclick - instead I suggest putting it inside the function, something like this:

<script type="text/javascript">
function flipDiv(id)
{
    var vis = document.getElementById('div' + id + 'hidden').style.display;
    if(vis == 'none')
    {
        document.getElementById('div1hidden').style.display = 'none';
        document.getElementById('div2hidden').style.display = 'none';
        document.getElementById('div3hidden').style.display = 'none';
        document.getElementById('div4hidden').style.display = 'none';
        document.getElementById('div' + id + 'hidden').style.display = 'block';
    }
    else
    {
        document.getElementById('div' + id + 'hidden').style.display = 'block';
    }
}
</script>

...

<div class="div1" onclick="flipDiv(1)">...</div>
...


The easiest way will be to cache the current open menu.

<head>
<script type="text/javascript">
var current = null; //current is stored here
function hide_current(){
    if(current !=null){
        document.getElementById(current).style.display = "none";
    }
}
function show_menu(id){
    if(current == id){
       hide_current();  //current is already open, close it
       current = null;  //reset current
    } else {
       document.getElementById(id).style.display = "block";
       current = id;
    }
}
</script>
</head>
<body>
<div class="div1" onclick="hide_current();show_menu('div1hidden');"></div>
<div class="div2" onclick="hide_current();show_menu('div2hidden');"></div>
<div class="div3" onclick="hide_current();show_menu('div3hidden');"></div>
<div class="div4" onclick="hide_current();show_menu('div4hidden');"></div>
</body>


Although the other suggested answers will accomplish what you want, none of them are very robust. This is based on the fact that your sample code is not very robust. It relies on inline javascript calls and hard coding to your elements.

Something like this will be easily extendable and less prone to breakage. Please note that some modifications will be necessary to accommodate old versions of IE (attachEvent support and getElementsByClassName support). But the concepts are the important thing.

Basically we get all the parent divs. Attach an event to their click. When they are clicked we hide all the divs that are supposed to be hidden and show the one we want.

http://jsfiddle.net/mrtsherman/8sgC2/2/

var divs = document.getElementsByClassName('menu');

for (var index = 0; index < divs.length; index++) {
    divs[index].addEventListener('click', function() {
        var contentDiv = null;
        //hide all other divs
        for (var i = 0; i < divs.length; i++) {
            contentDiv = document.getElementById(divs[i].id + 'content');
            contentDiv.style.display = 'none';
        }
        //show current item
        contentDiv = document.getElementById(this.id + 'content');
        contentDiv.style.display = 'block';
    }, false)
}

<div class="menu" id="div1">one</div>
<div class="menu" id="div2">two</div>
<div class="menu" id="div3">three</div>
<div class="menu" id="div4">four</div>

<div class="content" id="div1content">one content</div>
<div class="content" id="div2content">two content</div>
<div class="content" id="div3content">three content</div>
<div class="content" id="div4content">four content</div>

Note that libaries like jQuery can do this in far less code, without having to account for browser differences and with cool effects like sliding or fading in.

http://jsfiddle.net/mrtsherman/8sgC2/3/

//bind to click event on the div
$('.menu').click( function() {
    //get content div associated with the clicked div
    var contentDiv = $(this).attr('id') + 'content';

    //if no items are visible yet then show current
    if ($('.content').filter(':visible').length == 0) {
        $('#' + contentDiv).slideDown();  
        return;      
    }

    //hide visible divs and show new div
    $('.content').filter(':visible').slideUp('fast', function() {
        $('#' + contentDiv).slideDown();
    });
});


You can create the Display Div & Hidden div
at the same time and creating the click event in loop
This is source code which you can use to apply for unlimited divs

var n = 10;
var did = 'divDisplay';
var hid = 'divHidden';
function divDisplayOnclick()
{
  for(var i=0; i<n; i++)
  {
    document.getElementById(did+i+hid).style.display = 'none';
  }
  document.getElementById(this.id+hid).style.display = 'block';
}
function createDivDisplay()
{
  
  for(var i=0; i<n;i++)
  {
    var divDisplay = document.createElement('div');
    divDisplay.id  = did+i;
    divDisplay.innerHTML = 'Click to display hidden div '+i;
    divDisplay.className = did;
    divDisplay.onclick = divDisplayOnclick;
    document.body.appendChild(divDisplay);
    
    var divHidden = document.createElement('div');
    divHidden.id  = did+i+hid;
    divHidden.innerHTML = 'This is hidden div '+i;
    divHidden.className = hid;
    document.body.appendChild(divHidden);
    
  }
}
createDivDisplay();
.divDisplay
{
  border: 1px solid powderblue;
  margin-bottom: 5px;
  cursor: pointer; 
}

.divHidden
{
  border: 1px solid red;
  margin-left: 20px;
  margin-bottom: 10px;
  display: none;
}

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜