Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] visualizar textos según lo que se elija

Estas en el tema de visualizar textos según lo que se elija en el foro de Javascript en Foros del Web. Buenos días, a ver si me echáis una mano. En una página de pulseras, se puede elegir si tiene plata, oro u oro negro y ...
  #1 (permalink)  
Antiguo 05/03/2018, 03:03
 
Fecha de Ingreso: junio-2011
Mensajes: 151
Antigüedad: 13 años, 4 meses
Puntos: 2
visualizar textos según lo que se elija

Buenos días,

a ver si me echáis una mano.

En una página de pulseras, se puede elegir si tiene plata, oro u oro negro y según lo que se elija, pues aparece la info sobre eso.

El caso es que cuando están las 3 variantes el javascript funciona, pero si por ejemplo, solo existe plata y oro, el javascript deja de funcionar

Código PHP:
                <!--Para el titulo-->
                {% for 
option in product.options_with_values %}
                  {% if 
forloop.index0 == %}
                    {% for 
value in option.values %}
                      {% 
assign valor_label value escape %}
                      {% if 
valor_label == 'Silver' %}
                        <
div id="title-silver" class="large--one-half right">
                          <
h2 style=" font-family: 'SofiaPro-Bold'; font-size: 22px; margin-bottom: 20px; padding-top: 60px;">{{ product.title append' Men Beaded Wristband with Silver' }}
                          </
h2>
                        </
div>
                      {% endif %}
                      {% if 
valor_label == 'Gold' %}
                        <
div id="title-gold" class="large--one-half right" style="display: none;">
                          <
h2 style=" font-family: 'SofiaPro-Bold'; font-size: 22px; margin-bottom: 20px; padding-top: 60px;">{{ product.title append' Men Beaded Wristband with Gold' }}
                          </
h2>
                        </
div>
                      {% endif %}
                      {% if 
valor_label == 'Black Gold' %}
                        <
div id="title-black-gold" class="large--one-half right" style="display: none;">
                          <
h2 style=" font-family: 'SofiaPro-Bold'; font-size: 22px; margin-bottom: 20px; padding-top: 60px;">{{ product.title append' Men Beaded Wristband with Black Gold' }}
                          </
h2>
                        </
div>
                      {% endif %}
                    {% endfor %}
                  {% endif %}
                {% endfor %}
                <
div class="large--one-half right">
                  <
hr class="hr--small hr--small-black" style="margin-bottom: 40px;">
                    {{ 
product.description }}

                <!--
Para la tabla-->
                  <
div class="tablas">
                    {% 
assign short_title product.title remove'Essential 10' remove'Essential 08' remove'Premium 10' remove'Premium 12' %}
                    {% for 
option in product.options_with_values %}
                      {% if 
forloop.index0 == %}
                        {% for 
value in option.values %}
                          {% 
assign valor_label value escape %}
                          {% if 
valor_label == 'Silver' %}
                            <
div id="table-silver">
                              <
table>
                                <
tbody>
                                  <
tr>
                                    <
td colspan="2" style="font-family: 'SofiaPro-Bold">Bracelet Specifications</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Stone</td>
                                    <
td>{{ short_title }}</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Noble Metal</td>
                                    <
td>Sterling Silver 925</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Size</td>
                                    <
td>Custom Fit</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Package</td>
                                    <
td>Luxury Jewelery Box</td>
                                  </
tr>
                                </
tbody>
                              </
table>
                            </
div>
                          {% endif %}
                          {% if 
valor_label == 'Gold' %}
                            <
div id="table-gold" style="display: none;">
                              <
table>
                                <
tbody>
                                  <
tr>
                                    <
td colspan="2" style="font-family: 'SofiaPro-Bold">Bracelet Specifications</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Stone</td>
                                    <
td>{{ short_title }}</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Noble Metal</td>
                                    <
td>Silver 925 Heavy Gold Plated</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Size</td>
                                    <
td>Custom Fit</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td>Package</td>
                                    <
td>Luxury Jewelery Box</td>
                                  </
tr>
                                </
tbody>
                              </
table>
                            </
div>
                          {% endif %}
                          {% if 
valor_label == 'Black Gold' %}
                            <
div id="table-black-gold" style="display: none;">
                              <
table>
                                <
tbody>
                                  <
tr>
                                    <
td colspan="2" style="font-family: 'SofiaPro-Bold">Bracelet Specifications</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Stone</td>
                                    <
td>{{ short_title }}</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Noble Metal</td>
                                    <
td>Silver 925 Heavy Black Rodhium</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Size</td>
                                    <
td>Custom Fit</td>
                                  </
tr>
                                  <
tr class="linea">
                                    <
td class="columna-table">Package</td>
                                    <
td>Luxury Jewelery Box</td>
                                  </
tr>
                                </
tbody>
                              </
table>
                            </
div>
                          {% endif %}
                        {% endfor %}
                      {% endif %}
                    {% endfor %}
                  </
div
Este es el javascript
Código:
<script>
  function cambio(auxiliar) {
    var met = document.getElementsByName('Variantes')[auxiliar+1].value;
    if(met === "Silver" || met === "Silver Alt"){
      document.getElementById('title-silver').style.display="block";
      document.getElementById('title-gold').style.display="none";
      document.getElementById('title-black-gold').style.display="none";
      document.getElementById('table-silver').style.display="block";
      document.getElementById('table-gold').style.display="none";
      document.getElementById('table-black-gold').style.display="none";
    }
    if(met === "Gold" || met === "Gold Alt"){
      document.getElementById('title-silver').style.display="none";
      document.getElementById('title-gold').style.display="block";
      document.getElementById('title-black-gold').style.display="none";
      document.getElementById('table-silver').style.display="none";
      document.getElementById('table-gold').style.display="block";
      document.getElementById('table-black-gold').style.display="none";
    }
    if(met === "Black Gold" || met === "Black Gold Alt"){
      document.getElementById('title-silver').style.display="none";
      document.getElementById('title-gold').style.display="none";
      document.getElementById('title-black-gold').style.display="block"; 
      document.getElementById('table-silver').style.display="none";
      document.getElementById('table-gold').style.display="none";
      document.getElementById('table-black-gold').style.display="block";
    }  
  }
</script>
La llamada a la función cambio se hace en el (input type="radio") que hay más arriba en donde le paso los valores de "Silver", "silver Alt", "Gold", "Gold Alt", "Black Gold" y "Black Gold Alt"

Lo que he pegado tiene como dos partes,
Para el título
Para la tabla

La parte del título funciona siempre, da igual que solo existan plata u oro, que siempre funciona y al cambiar el metal se cambia también el título.
El problema es con la tabla, que solo funciona si existen los 3 metales, en el momento en que oro negro deja de existir, ya no cambia, se queda siempre con los datos de la plata.

Si no me he explicado bien, dejo dos url, para que veais:
Pulsera que funciona
Pulsera que no funciona

Gracias y un saludo
  #2 (permalink)  
Antiguo 05/03/2018, 06:48
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.511
Antigüedad: 16 años, 2 meses
Puntos: 188
Respuesta: visualizar textos según lo que se elija

Tienes que comprobar que existen en el DOM los elementos con el id indicado o de lo contrario saltará un error de javascript al intentar modificar sus propiedades (el típico null pointer)

Si lo haces con jQuery no sería necesario ya que la librería te evita esa comprobación.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 05/03/2018, 08:48
 
Fecha de Ingreso: junio-2011
Mensajes: 151
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: visualizar textos según lo que se elija

Buenas tardes,

quieres decir que si por ejemplo el elemento con ID "title-black.gold" no existe salta error de javascript??? y no continua con la sentencia???

Algo así imaginaba, pero cómo le digo si existe??? con algo así valdría???
if(document.getElementById('title-black-gold') != null)

Mientras se ve la respuesta voy a probar a ver
  #4 (permalink)  
Antiguo 05/03/2018, 09:54
Avatar de Alexis88
Philosopher
 
Fecha de Ingreso: noviembre-2011
Ubicación: Tacna, Perú
Mensajes: 5.552
Antigüedad: 13 años
Puntos: 977
Respuesta: visualizar textos según lo que se elija

Efectivamente, si un elemento indicado en el código no existe en el documento, se produce un error. Ahora, lo que puedes hacer es: tomar el camino más largo, el cual consiste en realizar comprobaciones sucesivas mediante el uso de condiciones (N comprobaciones por cada N elementos), o tomar el camino más corto: utilizar una clase la cual se asignaría al bloque que se desea visualizar y, cuando se elija otra opción, se comprueba la existencia de algún bloque con dicha clase, se le retira la clase, se oculta a dicho bloque y, al bloque que se desea visualizar, se le asigna la clase de visualización y se lo hace visible.

Código Javascript:
Ver original
  1. document.addEventListener("DOMContentLoaded", function(){
  2.   var select = document.querySelector("#id_del_select"), //El <select>
  3.       valor, antiguo, nuevo;
  4.  
  5.   //Cuando se elija un valor diferente en el <select>
  6.   select.addEventListener("change", function(){
  7.  
  8.     //Si existe el valor elegido, se trabaja con él, caso contrario, con el valor booleano "false"
  9.     valor = this.value ? this.value : false;
  10.  
  11.     //Tomamos al elemento visible, si lo hay
  12.     antiguo = document.querySelector(".la_clase");
  13.  
  14.     //Tomamos al bloque que corresponda con el valor elegido si este existe o se establece un valor nulo
  15.     nuevo = valor ? document.querySelector("#" + valor) : null;
  16.      
  17.     //Si existe un bloque visible
  18.     if (antiguo){
  19.       //Le retiramos la clase y automáticamente se ocultará
  20.       antiguo.className = "";
  21.     }
  22.  
  23.     //Si el valor de la opción elegida existe
  24.     if (valor){      
  25.       //Al nuevo se le añade la clase y automáticamente se hará visible
  26.       nuevo.className = "la_clase";
  27.     }
  28.   }, false);
  29. });

Para este ejemplo estoy considerando que, inicialmente, todos los bloques están ocultos. Eso puedes hacerlo desde la hoja de estilos (CSS) estableciendo el par atributo-valor display: none para todos los bloques. La clase es fundamental ya que, mediante CSS, hará visible al bloque elegido.

DEMO

__________________
«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

Última edición por Alexis88; 05/03/2018 a las 12:12 Razón: Corrección
  #5 (permalink)  
Antiguo 07/03/2018, 04:46
 
Fecha de Ingreso: junio-2011
Mensajes: 151
Antigüedad: 13 años, 4 meses
Puntos: 2
Respuesta: visualizar textos según lo que se elija

Buenos días, y perdón por contestar tarde.

Teníais razón, he comprobado primero que el valor existe y ya funciona perfectamente.

Como es una tienda online que está en funcionamiento, corría prisa y no son muchos los valores que mirar lo he hecho a mano pero ahora miro la respuesta que ha comentado Alexis88.

Voy a poner como solucionado el tema y a darle vueltas al tema este

Muchas gracias por la ayuda y un saludo

Etiquetas: input, java, según, textos
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:35.