2009-05-27 53 views
5

Me gustaría mostrar un div basado en el evento Onclick de un enlace.Uso de JQuery para mostrar y ocultar diferentes div en el evento onClick

primer clic - Mostrar div1
segundo clic - Ocultar restante del div y Mostrar Div2
tercer clic - Ocultar restante del div y mostrar div3
Cuarta Click - Hide restante del div y mostrar div1 => repetir el bucle y continúa ..

código sigue:

<div class="toggle_button"> 
     <a href="javascript:void(0);" id="toggle_value">Toggle</a> 
</div> 


<div id='div1' style="display:none;"> 
    <!-- content --> 
</div> 

<div id='div2' style="display:none;"> 
    <!-- content --> 
</div> 

<div id='div3' style="display:none;"> 
    <!-- content --> 
</div> 

Código Jquery:

$(document).ready(function() { 
     $("#toggle_value").click(function(){ 
      $("#div1").show("fast"); 
      $("#div2").show("fast"); 
      $("#div3").show("fast"); 
     }); 
}); 

El código anterior muestra todos los divs en primer lugar, haga clic en sí, sino que debe mostrar div1 en primera posición como se ha mencionado.

Respuesta

5

Voy a tratar mi tiro.


EDIT: Después de segundos, sin embargo, para evitar el uso variable global que es mejor hacer lo siguiente

$(document).ready(function() { 
     $("#toggle_value").click((function(){ 
     var counter = 0; 
     return function() 
     { 
      $("#div" + counter).hide("fast"); 
      counter = (counter % 3) + 1; 
      $("#div" + counter).show("fast"); 
     } 
     })()); 
}); 
+0

Hmm ... eso es interesante. Pero el 4º clic oculta todo el div y en el 5º clic muestra de nuevo el div1. ¿Te molestan los estuches? – Webrsk

+0

He perdido el punto de que tiene que iterar todo el tiempo. Fijo. –

+0

Artem mientras funcionaba bien cuando la var es global, después de que probé el código publicado recientemente deja de funcionar ... – Webrsk

1

Debe agregar un contador en la función.

$(document).ready(function() { 
    var count = 0; 

    $("#toggle_value").click(function(){ 
     if (count == 0) { 
      $("#div1").show("fast"); 
      $('#div2').hide(); 
      count++; 
     } 
     else if (count == 1) { 
      $("#div2").show("fast"); 
      ... 
      count++; 
     } 
     else if (count == 2) { 
      $("#div3").show("fast"); 
      .... 
      count++; 
     } 
     else { 
      $('div').hide(); 
      count=0; 
     } 
    }); 
}); 
+0

que la última declaración else probablemente también debería mostrar el primer div, ya que quiere que se repita. – peirix

+0

Gracias Peter. Y como peirix te ha mencionado, es necesario que muestres el primer div como un bucle. Pero en ese cuarto clic, ocultará todos los div en lugar de mostrar el primer div. – Webrsk

+0

Sí, este código es una mierda. –

0

Una forma sencilla sería introducir una variable que dio seguimiento a los clics, por lo menos así:

var tracker = 0;  
$(document).ready(function() { 
    $("#toggle_value").click(function(){ 
     if(tracker == 0) 
     { 
      $("#div1").show("fast"); 
     }else if(tracker ==1) 

     etc etc 

     tracker ++; 

    }); 
}); 
0

Mi solución es un poco diferente - lo haría dependiente del estado de la divs en el momento actual (al hacer clic). Vea a continuación lo que quiero decir con esto.

$(document).ready(function() { 
    $("#toggle_value").click(function(){ 
     if ($("#div1).is(':visible')) { // Second click 
      // Hide all divs and show d2 
      $("#div1").hide(); 
      $("#div2").show("fast"); 
      $("#div3").hide(); 
      $("#div4").hide(); 
     } else if ($("#div2").is(':visible')) { // Third click 
      // follow above example for hiding all and showing div3 
     } else if ($("#div3").is(':visible')) { // Fouth click 
      // follow above example for hiding all and showing div1 
     } else { // first click 
      // All divs should be hidden first. Show div1 only. 
      $("#div1").show("fast"); 
     } 
    }); 
}); 

Sólo para advertirle - No he probado este código :) En base a la siguiente para determinar la visibilidad: http://docs.jquery.com/Frequently_Asked_Questions#How_do_I_determine_the_state_of_a_toggled_element.3F

creo que sirve

+1

No codifique con fuerza algo que puede ser dinámico. ¿Qué pasa si quiere cambiar este código para incorporar 100 divs? ¿Vas a codificar 400 líneas de ifs confusos y código repetido? –

+0

Bueno, esa sería una pregunta diferente, y no lo que se preguntó. Lo interpreté más en el sentido de que solo había 3 divs, y los nombres div no se numeraban normalmente y pueden ser nombres reales. Tomo tu punto sin embargo. –

0
var c = 1; 
$("#toggle_value").click(function() 
{ 
    $("#div" + c).hide("fast");   
    $("#div" + ++c).show("fast"); 
    if (c > 3) c=1;  
}); 
+0

Gracias por publicarlo. Simplemente corrigió el error de sintaxis del código que publicó y probó. var c = 1; $ ("# toggle_value"). Haga clic en (función() { $ ("# div" + c) .hide ("rápido"); if (c> 3) c = 1; $ ("# div "+ C++). show (" rápido "); }); Primero 3 clics funciona bien después de que muestra 2 divs al mismo tiempo ... – Webrsk

+0

uso mi segunda solución en esta página en lugar de ... –

+0

He editado este - debería funcionar ahora ... –

0

que probablemente hacer algo como: (Lo siguiente asume todas sus <div> s están en un contenedor con id "contenedor")

$(document).ready(function() { 
    var $allDivs = $("#container > div"); 
    var counter = 0; 

    $("#container > div").click(function(){ 
    counter = counter < $allDivs.length - 1 ? counter + 1 : 0; 
    $allDivs.not(":eq("+counter +")").hide("fast"); 
    $allDivs.eq(counter).show("fast"); 
    }); 
}); 
+0

aquí haces muy fuerte asunción de que div's se ordena en contenedor de acuerdo con el número de identificación, lo que podría ser falso en general –

+0

¿no crees que hay más divs en el contenedor que los descritos? –

+0

Pensando en eso, tienes razón. Por otro lado, si deben mostrarse secuencialmente en un orden en particular, ¿por qué no presentarlos en ese orden particular de inmediato? En lugar de crear atributos de id "ordenados" para un conjunto desordenado de elementos. – Tomalak

0

Prefiero usar método de "filtro" y hacer el trabajo un poco más fácil con contador:

(function() { 
    var divCounter = 0, divs; 

    $(function() { 
     divs = $('#div1, #div2, #div3'); 
     $('#toggle_value').click(function (e) { 
      divs.hide() // hide other divs 
       .filter(function (index) { return index == divCounter % 3; }) // select appropriate div 
       .show('fast'); // and show it 

      divCounter++; 
     }); 
    }); 

})(); 
0

La función .toggle en jQuery toma cualquier número de argumentos de funciones, por lo que el problema ya está resuelto. Ver los documentos en Eventos.

0
$("#toggle_value").click(function() 
{ 
    $("#div" + (++c) % 3).show().siblings().hide();   
} 
+0

y qué pasa si esos divs no son hermanos? –

+0

Están en el ejemplo. Es como decir qué pasa si no están en la misma página? ¿Qué pasa si son cuadros de texto? ¿Qué pasa si estás ejecutando esto en el iPhone? –

+0

Gracioso O_o. En el ejemplo tienes la muestra del código de acortamiento, que creo que en realidad es mucho más complicado en general, por lo que con tu código ocultarás a todos los hermanos sin importar nada. –

1

¿Qué tal esto

Working Example here - añadir /editar a URL para editar el código

$('html').addClass('js'); // prevent hiding divs on DOM ready from 'flashing' 

$(function() { 

    var counter = 1; 

    $('#toggle_value').click(function() { 
    $('div','#container') 
     // to stop current animations - clicking really fast could originally 
     // cause more than one div to show 
     .stop() 
     // hide all divs in the container 
     .hide() 
     // filter to only the div in question 
     .filter(function() { return this.id.match('div' + counter); }) 
     // show the div 
     .show('fast'); 

    // increment counter or reset to 1 if counter equals 3 
    counter == 3? counter = 1 : counter++; 

    // prevent default anchor click event 
    return false; 

    }); 

}); 

y HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> 
<head> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 
<title>Div Example</title> 
<meta http-equiv="Content-type" content="text/html; charset=utf-8" /> 
<style type="text/css" media="screen"> 

    body { background-color: #fff; font: 16px Helvetica, Arial; color: #000; } 
    .display { width:300px; height:200px; border: 2px solid #000; } 
    .js .display { display:none; } 

</style> 
</head> 
<body> 
<div class="toggle_button"> 
     <a href="#" id="toggle_value">Toggle</a> 
</div> 
<br/> 
<div id='container'> 
    <div id='div1' class='display' style="background-color: red;"> 
     div1 
    </div> 

    <div id='div2' class='display' style="background-color: green;"> 
     div2 
    </div> 

    <div id='div3' class='display' style="background-color: blue;"> 
     div3 
    </div> 
<div> 

</body> 
</html> 

Esto podría ser fácilmente envuelto arriba en un plugin

0

primero hay que añadir la consulta de archivos básica:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script> 

Después hay que añadir el siguiente código:

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#hide").click(function(){ 
      $(".slider_area").hide(1000); 
      $("#show").css("display","block"); 
      $("#hide").css("display","none"); 
     }); 
     $("#show").click(function(){ 
      $(".slider_area").show(1000); 
      $("#show").css("display","none"); 
      $("#hide").css("display","block"); 
     }); 
    }); 
</script> 

Añadir el código anterior en la parte de la cabecera y el código de abajo en la porción del cuerpo.

<img src="images/hide-banner.png" id="hide" class="link right"/> 
<img src="images/show-banner.png" id="show" class="link right dis" /> 

El código está listo para la imagen diferente haga clic para mostrar y ocultar div.

0
<div id="div_<%=id>"> 
</div> 
<div id="Hide_<%=id>" style="display:none;"> 
</div> 
<div id="div_<%=id>"> 
</div> 
<div id="Hide_<%=id>" style="display:none;"> 
</div> 
<div id="div_<%=id>"> 
</div> 
<div id="Hide_<%=id>" style="display:none;"> 
</div> 
<div id="div_<%=id>"> 
</div> 
<div id="Hide_<%=id>" style="display:none;"> 
</div> 
<script> 
var temp = 0; 
var temp1 = 0; 
$("#div_<%=id>").click(function(){ 
    if (temp1 == 0) { 
     $('#' + temp).hide(); 
     temp = 'Hide_<%=id>'; 
     $('#Hide_<%=id>').show(); 
     temp1 = 1; 
     } 
     else{ 
     $('#' + temp).hide(); 
     temp = 'Hide_<%=id>'; 
     $('#Hide_<%=id>').show(); 
     temp1 = 0; 
     } 
}); 
</script>