Vamos a ver el funcionamiento del efecto jQuery toggle(), mayoritariamente se usa en casos para ocultar y mostrar elementos de una página web, aunque también funciona como switch entre 2 funciones.
Cuando hablamos de mostrar no lo confundáis con jQuery load(), ya que esta función de jQuery carga un html externo en un div.
Este efecto de jQuery es muy parecido en su sintaxis a jQuery .click(). El efecto .toggle() solo te permite alternar entre 2 acciones mientras que .click() hace una acción concreta por cada click.
Otros efectos básicos similares son jQuery slideDown(), slideUp() y slideToggle(), jQuery fadeIn(), fadeOut() y fadeTo() y jQuery show() & hide() y jQuery animate().
Os pongo las 4 maneras que hay para invocar el efecto extraídas de su documentación oficial:
.toggle( ) .toggle( [duration] [, callback] ) .toggle( [duration] [, easing] [, callback] ) .toggle( showOrHide )
Ahora os describo los parámetros:
Según la documentación oficial de jQuery .toggle():
Muestra u oculta los elementos seleccionados
En esta primera demo de ejemplo voy a esconder y mostrar un botón cada vez que se haga click en otro bóton, así vemos cómo muestra y oculta el elemento.
<!-- Libreria jQuery --> <script type='text/javascript' src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("#boton").on( "click", function() { $('#target').toggle(); }); }); </script> <input id="target" type="button" value="ESTE BOTÓN APARECE Y DESAPARECE"> <input id="boton" type="button" value="toggle()">
Explico el código de la primera demo:
Tras ver como es la llamada básica ahora toca usar los parámetros ‘slow’, ‘fast’ y los milisegundos. Con estos parámetros haremos que la animación del elemento se haga de una forma lenta o rápida dependiendo de la opción escogida.
Os pongo el código de la segundo ejemplo en la que mostraremos u ocultaremos una imagen.
<!-- Libreria jQuery --> <script type='text/javascript' src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("#boton").click(function () { $('#target').toggle("slow"); }); $("#boton1").click(function () { $('#target').toggle("fast"); }); $("#boton2").click(function () { $('#target').toggle(5000); }); }); </script>
Explico los diferentes parámetros pasados en las funciones tras hacer click en cada uno de los 3 botones:
Aquí el código de los botones y la imagen:
<img src="/wp-content/uploads/2012/12/jquery.jpg" id="target"> <input id="boton" type="button" value="toggle() con efecto slow"> <input id="boton1" type="button" value="toggle() con efecto fast"> <input id="boton2" type="button" value="toggle() con efecto de 5000 milisegundos">
Hasta ahora hemos visto el funcionamiento de la función con los parámetros básicos. Vamos enriquecer nuestro script invocando una función en el callback del efecto toggle(), es decir, al término de la animación.
Para verlo en funcionamiento he creado esta tercera demo de ejemplo para ocultar o mostrar una imagen con callback.
<!-- Libreria jQuery --> <script type='text/javascript' src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $('#boton').click(function() { $('#target').toggle(1000, function() { alert ('Efecto terminado!'); }); }); }); </script>
Y de nuevo comento la jugada…
Aquí el código de la imagen y botón:
<img src="/wp-content/uploads/2012/12/jquery.jpg" id="target"> <input id="boton" type="button" value="toggle() con callback">
Con el uso del callback podéis hacer en vuestras webs otras operaciones en cadena una vez finalizado el efecto toggle().
En esta cuarta demo vamos a ver 2 nuevos parámetros (no se usan demasiado) para cambiar el efecto levemente:
<!-- Libreria jQuery --> <script type='text/javascript' src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function() { $("#boton").click(function () { $('#target').toggle("swing"); }); $("#boton2").click(function () { $('#target').toggle("linear"); }); }); </script>
El código HTML de la imagen y botones es el siguiente:
<img src="/wp-content/uploads/2012/12/jquery.jpg" id="target"> <input id="boton" type="button" value="linear"> <input id="boton2" type="button" value="swing">
Este parámetro fuerza el efecto a realizar, oculta o muestra.
$('#target').toggle(showOrHide);
El parámetro es equiparable al efecto de la función jQuery show() y hide().
if ( showOrHide == true ) { $('#foo').show(); } else if ( showOrHide == false ) { $('#foo').hide(); }
Quinta demo donde podemos ver cómo intercambiar 2 funciones con jQuery toggle.
<!-- Libreria jQuery --> <script type='text/javascript' src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $('#boton').toggle( function () { alert('Primera función'); }, function () { alert('Segunda función'); } ); }); </script>
En el código se ve cómo la función ejecutará un alert u otro dependiento de la última ejecución de la misma.
Sexta y última demo del efecto toggle(), esta vez vamos a ver como ocultar elementos de nuestra web, bien sean párrafos, imágenes o elementos con determinadas clases.
Hasta ahora solo había puesto ejemplos que ocultaban elementos con determinados ids.
<!-- Libreria jQuery --> <script type='text/javascript' src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function(){ $("#boton1").click(function () { $('p').toggle("slow"); }); $("#boton2").click(function () { $('img').toggle("slow"); }); $("#boton3").click(function () { $('.prueba').toggle("slow"); }); }); </script>
Explico las líneas superiores tras el click de los 3 botones:
El código HTML es el siguiente:
<p>Esto es un párrafo Esto es un párrafo Esto es un párrafo Esto es un párrafo Esto es un párrafo Esto es un párrafo Esto es un párrafo </p> <p> <img height="250" src="/wp-content/uploads/2012/12/jquery.jpg"> </p> <p class="prueba">Esto es un párrafo con class="prueba" Esto es un párrafo con class="prueba" Esto es un párrafo con class="prueba"</p> <input id="boton1" type="button" value="ocultar/mostrar parrafo"> <input id="boton2" type="button" value="ocultar/mostrar imagen"> <input id="boton3" type="button" value="ocultar/mostrar clase 'prueba'">
En caso de trabajar con otras librerías distintas a jQuery os recomiendo en caso de problemas usar jQuery noConflict().
Para la detección, control o selección de elementos con jQuery os recomiendo leer este post: