Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Onclick en radio button

Estas en el tema de Onclick en radio button en el foro de Javascript en Foros del Web. Hola, estoy utilizando radio button para ver y ocultar div presentes en una pagina, cada radio esta asignado a una funcion javascript que hace visible ...
  #1 (permalink)  
Antiguo 19/02/2015, 13:01
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 10 meses
Puntos: 0
Onclick en radio button

Hola, estoy utilizando radio button para ver y ocultar div presentes en una pagina, cada radio esta asignado a una funcion javascript que hace visible a un div y oculta el resto, hasta ahi todo bien, el problema se da cuando pongo visible a un div desde una funcion externa ya que el formulario que contiene los radio button viene con uno de estos con el valor "checked" (es el que esta asignado a como se visualiza la pagina por defecto) por lo tanto un div es visualizado pero en el formulario esta marcada una opcion para ver otro div.

Código HTML:
Ver original
  1.             <p>
  2.                 <label style="margin-left: 4px">Ver Detalles:</label>
  3.                 <input type="radio" name="rad" checked="checked" onclick="mostrarDetalle()" />
  4.                 <label style="margin-left: 4px">Ver Asistencia:</label>
  5.                 <input type="radio" name="rad" onclick="mostrarAsistencia()" />
  6.                 <label style="margin-left: 4px">Ver Productos requeridos:</label>
  7.                 <input type="radio" name="rad" onclick="mostrarRequerido()" />
  8.                 <label style="margin-left: 4px">Ver Empleados en Obra:</label>
  9.                 <input type="radio" name="rad" onclick="mostrarEmpleado()" />
  10.             </p>
  11.         </form>
Código Javascript:
Ver original
  1. function mostrarDetalle() {
  2.         document.getElementById("mostrarDetalle").style.display = 'block';
  3.         document.getElementById("mostrarAsistencia").style.display ='none';
  4.         document.getElementById("mostrarRequeridos").style.display ='none';
  5.         document.getElementById("mostrarEmpleados").style.display ='none';
  6.     }  
  7.     function mostrarAsistencia() {
  8.         document.getElementById("mostrarAsistencia").style.display ='block';
  9.         document.getElementById("mostrarDetalle").style.display = 'none';
  10.         document.getElementById("mostrarRequeridos").style.display ='none';
  11.         document.getElementById("mostrarEmpleados").style.display ='none';
  12.     }
  13.     function mostrarRequerido() {
  14.         document.getElementById("mostrarRequeridos").style.display ='block';
  15.         document.getElementById("mostrarAsistencia").style.display ='none';
  16.         document.getElementById("mostrarDetalle").style.display = 'none';
  17.         document.getElementById("mostrarEmpleados").style.display ='none';
  18.     }
  19.     function mostrarEmpleado() {
  20.         document.getElementById("mostrarEmpleados").style.display ='block';
  21.         document.getElementById("mostrarRequeridos").style.display ='none';
  22.         document.getElementById("mostrarAsistencia").style.display ='none';
  23.         document.getElementById("mostrarDetalle").style.display = 'none';
  24.     }

Un ejemplo para que se entienda: La pagina por defecto pone al div "mostrarDetalle" como visible y el resto como oculto, si accedo de manera externa a "mostrarRequeridos" este se muestra bien pero en el formulario aun sigue marcada la opcion "mostrarDetalle". ¿alguna idea de como hacer que el radio button correcto se marque?
  #2 (permalink)  
Antiguo 19/02/2015, 13:18
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 10 años, 4 meses
Puntos: 44
Respuesta: Onclick en radio button

Podrías hacer algo así (te lo muestro con dos divs nomás pero creo que se entiende la idea):

Código HTML:
<form>
    <p>
        <label for="detalle" style="margin-left: 4px">Ver Detalles:</label>
        <input id="detalle" type="radio" name="rad" checked="checked" onclick="mostrarDetalle()" />
        <label for="asistencia" style="margin-left: 4px">Ver Asistencia:</label>
        <input id="asistencia" type="radio" name="rad" onclick="mostrarAsistencia()" />
    </p>
    <div id="mostrarDetalle">Mostrar detalle</div>
    <div id="mostrarAsistencia">Mostrar asistencia</div>
</form>
<script type="text/javascript">
  function mostrarDetalle() {
      document.getElementById("mostrarDetalle").style.display = 'block';
      document.getElementById("mostrarAsistencia").style.display ='none';
      document.getElementById("asistencia").checked = false;
      document.getElementById("detalle").checked = true;
  }  

  function mostrarAsistencia() {
      document.getElementById("mostrarAsistencia").style.display ='block';
      document.getElementById("mostrarDetalle").style.display = 'none';
      document.getElementById("asistencia").checked = true;
      document.getElementById("detalle").checked = false;
  }

  mostrarAsistencia();
</script> 
Y de paso al agregar el for a tus label, cliqueando sobre el nombre de los radiobutton también se seleccionan (es algo incómodo tener que cliquear solamente en el circulito que es muy chico).
  #3 (permalink)  
Antiguo 19/02/2015, 13:38
Avatar de GeekGirl  
Fecha de Ingreso: julio-2014
Mensajes: 423
Antigüedad: 10 años, 4 meses
Puntos: 44
Respuesta: Onclick en radio button

Y otro detalle, hay mucho código similar que podría obviarse. Se podría compactar en muchas menos líneas con algo como esto:

Código HTML:
 <form>
      <p>
          <label for="detalle" style="margin-left: 4px">Ver Detalles:</label>
          <input id="detalle" type="radio" name="rad" checked="checked" onclick="mostrarDiv('mostrarDetalle', this.id)" class="muestraOculta" />
          <label for="asistencia" style="margin-left: 4px">Ver Asistencia:</label>
          <input id="asistencia" type="radio" name="rad" onclick="mostrarDiv('mostrarAsistencia', this.id)" class="muestraOculta" />
          <label for="requeridos" style="margin-left: 4px">Ver Productos requeridos:</label>
          <input id="requeridos" type="radio" name="rad" onclick="mostrarDiv('mostrarRequeridos', this.id)" class="muestraOculta" />
          <label for="empleados" style="margin-left: 4px">Ver Empleados en Obra:</label>
          <input id="empleados" type="radio" name="rad" onclick="mostrarDiv('mostrarEmpleados', this.id)" class="muestraOculta" />
      </p>
      <div id="mostrarDetalle" class="muestraDiv">Mostrar detalle</div>
      <div id="mostrarAsistencia" class="muestraDiv">Mostrar asistencia</div>
      <div id="mostrarRequeridos" class="muestraDiv">Mostrar requeridos</div>
      <div id="mostrarEmpleados" class="muestraDiv">Mostrar empleados</div>
  </form>
  <script type="text/javascript">
    function clearSelection(current) {        
      var allInputs = document.getElementsByTagName("input");
      for (var a = 0; a < allInputs.length; a++) {
        if (allInputs[a].type == 'radio' && allInputs[a].className == 'muestraOculta') {
          allInputs[a].checked = false;
        }
      }

      document.getElementById(current).checked = true;
    }

    function mostrarDiv(divId, radioId) {
        var allDivs = document.getElementsByTagName("div");
        for (var a = 0; a < allDivs.length; a++) {
          if (allDivs[a].className == 'muestraDiv') {
            allDivs[a].style.display = 'none';
          }
        }

        document.getElementById(divId).style.display = 'block';
        clearSelection(radioId);
    }  

    mostrarDiv('mostrarAsistencia', 'asistencia');
  </script> 
Hay muchas otras formas de hacerlo, esta es simplemente una solución rápida que se me ocurrió para este caso. Incluyo una llamada externa a la función principal como ejemplo.
  #4 (permalink)  
Antiguo 19/02/2015, 13:57
 
Fecha de Ingreso: enero-2015
Ubicación: Valparaiso
Mensajes: 88
Antigüedad: 9 años, 10 meses
Puntos: 0
Respuesta: Onclick en radio button

Muchas gracias, lo implementé de la primera forma y funciona sin problemas hasta el momento. Con mas tiempo intentare implementar el segundo código, en este momento no lo entiendo muy bien, lo analizare con mas detalle.
  #5 (permalink)  
Antiguo 19/02/2015, 15:26
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: Onclick en radio button

Otra forma de hacerlo sería mediante una clase en la hoja de estilos que haga visible al elemento que corresponda con la opción marcada. Luego, cuando selecciones otra opción, solamente tienes que tomar al elemento que posea dicha clase y se la quitas para luego asignársela al elemento que corresponda con la nueva opción marcada.

Un ejemplo:

Código HTML:
Ver original
  1. Mostrar el primero <input type = "radio" name = "opcion" value = "opc1" checked />
  2. Mostrar el segundo <input type = "radio" name = "opcion" value = "opc2" />
  3. Mostrar el tercero <input type = "radio" name = "opcion" value = "opc3" />
  4.  
  5. <div id = "opc1" class = "visible">Primer Div</div>
  6. <div id = "opc2">Segundo Div</div>
  7. <div id = "opc3">Tercer Div</div>

Código CSS:
Ver original
  1. div{
  2.     width: 250px;
  3.     height: 50px;
  4.     opacity: 0;
  5. }
  6.  
  7. .visible{
  8.     opacity: 1;
  9. }

Código Javascript:
Ver original
  1. [].forEach.call(document.querySelectorAll("[name=opcion]"), function(radio){
  2.     radio.addEventListener("click", function(){
  3.         document.querySelector(".visible").className = "";
  4.         document.querySelector("#" + this.value).className = "visible";
  5.     }, false);
  6. });

Como verás, las opciones tienen por valor el id del <div> que le corresponde, además, por defecto marco a la primera opción y asigno la clase CSS 'visible' al primer <div>. En la hoja de estilos, asigno las respectivas dimensiones a los <div> y los hago opacos para que no se vean, pero como la clase 'visible' quita esa opacidad, al haberla asignado inicialmente al primer <div>, este estará visible desde el principio y así será con los demás <div> cuando se marquen las respectivas opciones.

En el código JavaScript, itero sobre el conjunto de elementos con el nombre 'opcion', es decir, las opciones. A cada una, le delego una función por cada vez que se le de un clic. En dicha función, tomo al <div> del documento que posea la clase 'visible', se la quito y se la asigno al <div> cuyo id corresponda con el valor de la opción marcada.

DEMO

Saludos
__________________
«Juro por mi vida y mi amor por ella, que jamás viviré para el provecho de otro hombre, ni le pediré a otro hombre que viva para el mío».

Ayn Rand

Etiquetas: button, formulario, funcion, input, onclick, radio, valor
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:18.