Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] Select se vacía

Estas en el tema de Select se vacía en el foro de Javascript en Foros del Web. Hola Llevo toda la mañana ofuscado con un problema al que no le veo el fallo... a ver si me ayudáis, por favor. Tengo dos ...
  #1 (permalink)  
Antiguo 18/03/2013, 05:38
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Select se vacía

Hola

Llevo toda la mañana ofuscado con un problema al que no le veo el fallo... a ver si me ayudáis, por favor.

Tengo dos selects:

Código PHP:
Ver original
  1. <select name="country" id="country" onmouseover="loadCountry(this);" onchange="manageCountry(this);"></select>
  2. <select name="city" id="city"></select>

Y estas dos funciones:

Código Javascript:
Ver original
  1. function loadCountry(e){
  2.     k='country';
  3.    
  4.     if(e.options.length>0){
  5.         return false;
  6.     }
  7.    
  8.     getEv('country', 'c=');//llamada AJAX con "eval()". El retorno es:
  9.  
  10. /*
  11. retorno:
  12. G_country=[value|code, ...]
  13. */
  14.  
  15.  
  16.     for(i=0;i<G_country.length;i++){//ge es una función que retorna el elemento con ese id
  17.         gc = G_country[i].split('|');
  18.         opt = document.createElement("OPTION");
  19.         opt.innerText = gc[1];
  20.         opt.value = gc[0];
  21.         ge(k).add(opt, 0);
  22.     }
  23. }
  24.  
  25. function manageCountry(e){
  26.     getEv('country', 'c='+e.options[e.selectedIndex].value);
  27.     k='city';
  28.     for(i=0;i<G_country.length;i++){
  29.         gc = G_country[i].split('|');
  30.         opt = document.createElement("OPTION");
  31.         opt.innerText = gc[1];
  32.         opt.value = gc[0];
  33.         ge(k).add(opt, 0);
  34.     }
  35. }

El "onmouseover" funciona bien. Pero cuando selecciono algo en "country", me carga la lista de city (manageCountry, bien), pero la opción de "country" se me cambia al primer valor... y no entiendo porqué.

¿No se supone que al tener varias opciones, haría un return y detendría la función loadCountry?

Gracias por la ayuda.
  #2 (permalink)  
Antiguo 18/03/2013, 06:10
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Select se vacía

Tema movido desde PHP a Javascript
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 18/03/2013, 06:13
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Select se vacía

No entiendo porque pones ese onmouseover...
Cada vez que pases por encima de ese selec se va a ejecutar la función... usa loadCountry(); una sola vez quizas en el onload del fichero...

Simplemente carga la lista de paises sin depender de nada mas luego para que ejecutar la función cada vez aun que termine en el return false....

Código Javascript:
Ver original
  1. function loadCountry(e){
  2.     k='country';
  3.    
  4.     if(e.options.length>0){
  5.         return false;
  6.     }else{////<----
  7.    
  8.     getEv('country', 'c=');//llamada AJAX con "eval()". El retorno es:
  9.  
  10. /*
  11. retorno:
  12. G_country=[value|code, ...]
  13. */
  14.  
  15.  
  16.     for(i=0;i<G_country.length;i++){//ge es una función que retorna el elemento con ese id
  17.         gc = G_country[i].split('|');
  18.         opt = document.createElement("OPTION");
  19.         opt.innerText = gc[1];
  20.         opt.value = gc[0];
  21.         ge(k).add(opt, 0);
  22.     }
  23. }////<---
  24. }


o des de el onload id='country'.


Código Javascript:
Ver original
  1. function loadCountry(id){
  2.    
  3.    e=ge(id);//ge es una función que retorna el elemento con ese id
  4.     if(e.options.length==0){
  5.  
  6.     getEv(id, 'c=');//llamada AJAX con "eval()". El retorno es:
  7.  
  8. /*
  9. retorno:
  10. G_country=[value|code, ...]
  11. */
  12.  
  13.  
  14.     for(i=0;i<G_country.length;i++){
  15.         gc = G_country[i].split('|');
  16.         opt = document.createElement("OPTION");
  17.         opt.innerText = gc[1];
  18.         opt.value = gc[0];
  19.         e.add(opt, 0);
  20.     }
  21. }
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 18/03/2013 a las 06:23
  #4 (permalink)  
Antiguo 18/03/2013, 06:13
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Select se vacía

Ufff, vaya... con el cabreo que llevaba encima no me he fijado en qué foro he posteado...

Pongo el mouseover porque viene de una llamada AJAX, así que no tengo de otra... o al menos eso creo
  #5 (permalink)  
Antiguo 18/03/2013, 06:19
 
Fecha de Ingreso: septiembre-2011
Mensajes: 219
Antigüedad: 12 años, 7 meses
Puntos: 31
Respuesta: Select se vacía

Cita:
Iniciado por DoHITB Ver Mensaje
Ufff, vaya... con el cabreo que llevaba encima no me he fijado en qué foro he posteado...

Pongo el mouseover porque viene de una llamada AJAX, así que no tengo de otra... o al menos eso creo
Estan entrando en conflicto los dos eventos.
Como bien te mencionaron antes, el evento de carga de paises, aunque lo hagas por ajax, deberás hacerlo por ejemplo al cargar el select, no ante un evento del mismo.
  #6 (permalink)  
Antiguo 18/03/2013, 06:21
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Select se vacía

El conflicto de eventos lo veo, es decir, que antes del "onchange" siempre se producirá el "onmouseover". Pero si estoy comprobando la longitud de los campos del select no se supone que debería salir de la función en el primer "if"?

Inciso: el problema que me surge es que al seleccionar un valor en "country", el "city" me carga, y a la vez el "country" se vacía. He añadido el "else" que indica @quimfv, y también he movido la llamada a "loadCountry" a donde se llama al AJAX para generar esto.

Última edición por DoHITB; 18/03/2013 a las 06:39
  #7 (permalink)  
Antiguo 19/03/2013, 03:42
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Select se vacía

Problema arreglado. El select "country" se vacía por la llamada AJAX (no se porque).

Así que he cambiado las siguientes cosas:

- Cada una de las dos funciones tendrá su variable
- Cambiado el modo en el que se añaden las options (ahora uso new Option())
- Cuando salta "onchange" de "country", ejecuto lo siguiente:

Código Javascript:
Ver original
  1. - Obtengo el índice seleccionado de 'country' => variable it
  2. - Obtengo la lista de ítems para 'city' mediante AJAX (aquí se vacía 'country')
  3. - Relleno 'city'
  4. - Relleno 'country de nuevo, comparando con it para saber si es el seleccionado

Y ya. Cuando descubra porqué AJAX me vacía el select lo arreglaré mejor. Mientras, ya funciona.
  #8 (permalink)  
Antiguo 19/03/2013, 05:15
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: Select se vacía

Después de llamar por AJAX el formulario debes ejecutar la función que carga los países... si para cargar las ciudades llamas otra vez todo el formulario es logico que países este otra vez vacío... podrías cargar por AJAX en el onchange de pais un php solo con el select de ciudades que reciba como parámetro el país y solo refresque un div donde solo haya el select de las ciudades.... como esta en el formulario si le das a submit después de elegir ciudad lo tendrá en cuenta como si no se hubiese cambiado... no se si me explico.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #9 (permalink)  
Antiguo 19/03/2013, 05:52
 
Fecha de Ingreso: abril-2012
Ubicación: 41°37′00″N, 00°37′00″E
Mensajes: 462
Antigüedad: 12 años, 1 mes
Puntos: 33
Respuesta: Select se vacía

No cargo todo el formulario de nuevo.

La función "getEv()" hace una llamada AJAX que luego hace un "eval()" del resultado.

Entonces, en "loadCountry()" se que el retorno es "G_country=[value|text, ...]" y en "manageCountry()" el retorno es "G_city=[value|text, ...]".

De ahí a que se vacíe "country" cuando llamo al AJAX, no se qué pasa; pero desde luego si cargara todo el formulario de nuevo ya se que tendría que volver a cargarlo todo.

Desde luego hasta ayer tenía bien la función, haciendo una llamada AJAX "corriente" y luego haciendo un innerHTML, pero resulta que a IE no le da la gana de cargar de esa manera el select, por lo que me vi obligado a hacer todo lo del "eval()" y demás, dándome así el fallo...

Las funciones anteriores eran bien sencillas:

Código Javascript:
Ver original
  1. funcion loadCountry(e){
  2.   if(e.options.length==0){
  3.     get('country', 'c='); //cambia el elemento con id "country"
  4.   }
  5. }
  6.  
  7. function getCountry(e,c){
  8.   getDtc('country', 'c='+e, 'city'); //cambia el elemento con id "city"
  9. }

En fin, a ver si veo el fallo real... jejeje

Gracias por contestar.

Etiquetas: php, select
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 01:19.