Duda en javascript

Er_Cheru

Hola gente! Tenía un pequeño problemilla a la hora de cambiar el src de una imagen que tengo en 1 html desde un script que tengo en un archivo js (lo pretendo cambiar al hacer click sobre el). El codigo que tengo es este:

El html:
[...]
<head>
<script type="text/javascript" src="Ejercicio.js"></script>
</head>
<form name="f">
<img src="rojo.gif" id="im1"/> //Puse id porque intento utilizar el getElementbyId
</br>
[...]

En el js:
[...]
document.getElementById("im1").src = "rojo2.gif";
[...]

Que hago mal?? Alguien sabe como hacerlo aunque sea de otra forma?? Muchas gracias por adelantado ;)

r2d2rigo

Pon el codigo completo, asi vemos como llamas a la funcion que cambia la imagen y tal.

Dod-Evers

tienes el javascript y la imagen al mismo nivel de carpetas? Mira a ver si cambiando "*.gif" por "images/loquesea.gif"

Er_Cheru

El html:
<html>
<head>
<script type="text/javascript" src="Ejercicio.js"></script>
</head>
<body>
<form name="f">
<img src="rojo.gif" id="im1"/>
<input type="button" value=" JUGAR! " name="jugar" onClick="comienzo()">
</form>
</body>
</html>

El js:

function comienzo(){
ponerImagen()
}

function ponerImagen(){
document.getElementById("im1").src = "roBlanco.gif"
}

Hay bastantes mas funciones pero bueno esto es todo lo que atañe al cambio de src de la imagen. Gracias por intentar ayudarme.

PD:#3 si...tengo todas las imagenes en el mismo sitio.

SiNSoNiDo

No lo he probado, ¿pero podría ser poque estás asignando "roBlanco.gif" al elemento "im1" antes de que este exista? Vamos que llamas a la función de ponerImagen() pero aun no existe la propia imagen ya que no ha llegado a esa parte del código y no a cargado el img con la id.

Er_Cheru

No se si he cambiado algo pero el caso es que ahora me cambia las imagenes...en fin...no lo entiendo pero bueno :S
Gracias a todos y perdonad las molestias

ZaO

deberia de funcionar a mi no me aparece ningun error :s

Fr4nk0

Er_Cheru para curarte en salud, en vez de acceder directamente al atributo con .src , usa la funcion que hay para ello.

function ponerImagen(){
document.getElementById("im1").setAttribute('src', 'roBlanco.gif');
}

De esta forma, aunque no exista el src, te lo creara en ese elemento, añadiendo a ese elemento html el atributo src='roBlanco.gif'.

Accediendo con el .src , si el elemento al q estas accediendo no tiene definido (escribiendolo en html) el src, no te dejará cambiarlo.

Así que yo te recomendaría que usaras las funciones setAttribute('nom_atributo', 'valor') y getAttribute('nom_atributo') (para obtener el valor del atributo, y hacer una cosa u otra dependiendo de ese valor, como cambiar el src sólo si el valor que tenía erauno determinado).

Prueba eso y ya me cuentas

DaNiTeLLo

<td class=\"quetengassuerte\"> <img src=\"images/rojo.gif\" id=\"im1\" align=\"bottom\" height=\"25\" alt=\"error\"onclick=\"javascript:ejercicio1(document);\"></td>

kitale los caracteres de escape

function ejercicio1(document)
{
var im1 = document.getElementById('im1');
im1.setAttribute('src', 'images/rojo2.gif');
}

Riu

pon el evento onClick para ver como lo llamas al javascript puede que el problema este ahi...

NeB1

si no veo el código completo dificil de saber (por saber el orden de las cosas), pero te proponga que cambies la linea de getelementbyid... por un alert("hola") solo para ver si entra dentro de la función.

Er_Cheru

Para los que me proponen ver el codigo completo este es:

HTML:
<html>
<head>
<script type="text/javascript" src="EjCp1.js"></script>
</head>
<body bgcolor="black">
<form name="f">
<img src="rojo.gif" id="im1" onMousedown="click(1)"/><img src="azul.gif" id="im2" onMousedown="click(2)"/>
</br>
<img src="amarillo.gif" id="im3" onMousedown="click(3)"/><img src="verde.gif" id="im4" onMousedown="click(4)"/>
</br>
<input type="button" value=" JUGAR! " name="jugar" onClick="comienzo()">
</form>
</body>
</html>

JS:
var nivel=0
var cont
var cuantasQuedan=0
var usuario=false
var clicksPc=new Array();
var clicksUsuario=new Array();

function comienzo(){

if(!usuario){ //Con esto se comprueba que el usuario no esta respondiendo
            cont=0
            //Lo ponemos a true para no poder volver a pulsar JUGAR sin haber jugado
            usuario=true;
	nivel++
	var aleat
	var ficha
	var x
	for(x=0;x<nivel;x++){
		aleat = Math.random() * 3 //Jugamos con 4 teclas
		aleat = Math.round(aleat)
		ficha = parseInt(1) + aleat
		marcarFicha(ficha) //Se pretende marcar 1 sola ficha
		setTimeout("", 1000)
		clicksPc[x]=ficha //Almacenamos en el array la ficha escogida por el PC
		cuantasQuedan++
	}
}

}

function marcarFicha(ficha){
switch(ficha){
case 1:
ponerImagen(1) //"Iluminar" imagen
setTimeout("ponerImagenOrig(1)", 1000) //Poner la imagen original
break;
case 2:
ponerImagen(2)
setTimeout("ponerImagenOrig(2)", 1000)
break;
case 3:
ponerImagen(3)
setTimeout("ponerImagenOrig(3)", 1000)
break;
case 4:
ponerImagen(4)
setTimeout("ponerImagenOrig(4)", 1000)
break;
}
}

function ponerImagen(img){ //Metodo para iluminar imagenes
switch(img){
case 1:
document.getElementById("im1").src = "roBlanco.gif"
break;
case 2:
document.getElementById("im2").src = "azBlanco.gif"
break;
case 3:
document.getElementById("im3").src = "amBlanco.gif"
break;
case 4:
document.getElementById("im4").src = "veBlanco.gif"
break;
}
}

function ponerImagenOrig(img){//Metodo para poner las imagenes originales
switch(img){
case 1:
document.getElementById("im1").src = "rojo.gif";
break;
case 2:
document.getElementById("im2").src = "azul.gif";
break;
case 3:
document.getElementById("im3").src = "amarillo.gif";
break;
case 4:
document.getElementById("im4").src = "verde.gif";
break;
}
}

function click(img){//Metodo que gewstiona el onMouseDown
switch(img){
case 1:
ponerImagen(1)
setTimeout("ponerImagenOrig(1)", 1000)
break;
case 2:
ponerImagen(2)
setTimeout("ponerImagenOrig(2)", 1000)
break;
case 3:
ponerImagen(3)
setTimeout("ponerImagenOrig(3)", 1000)
break;
case 4:
ponerImagen(4)
setTimeout("ponerImagenOrig(4)", 1000)
break;
default:
document.write("ERROR");
}
clicksUsuario[cont]=img //Guardamos la pulsacion del usuario
cont++
cuantasQuedan--
if(cuantasQuedan==0){ //Si hemos clickao tantas veces como pulsaciones hizo el pc...
var booleana = comprobarResultados();//Comprobamos...
if(booleana){
alert("BIEN HECHO!!")
}
else{
alert("MALLLL!!")
nivel--

	}
	usuario=false
}

}

function comprobarResultados(){
var x
for(x=0;x<nivel;x++){
if(clicksPc[x]!=clicksUsuario[x]){
return false
}
}
return true
}

No lo puse desde un principio porque me parece bastante código y no creo que tengais tanto tiempo para dedicarme. Para el que se digne a leerlo...tengo 1 par de preguntas...si sabe contestarme le estaría muy agradecido. En el FF se puede jugar perfectamente pero al incrementar de nivel las iluminaciones no se hacen de 1 en 1...si no todas a bloque siendo imposible quedarse con la secuencia, es como si ignorase el setTimeOut. En IE7 directamente me ignora el onMouseDown. Gracias de antemano!!
#8 probare a hacerlo como tu me dices, no lo hice hasta ahora porque estuve muy liado, tiene mejor pinta la verdad. Gracias ;)

PD. #8 ya lo probe y la verdad es que es mucho más limpio y más legible el código de esta forma. Me gusta, cambia todo perfectamente. Muchas gracias. Ahora el problema son las otras 2 cuestiones...

Fr4nk0

Er_Cheru todas esas cosas que utilizan temporizadores son un coñazo de hacer y suponen un gran esfuerzo. Mirate la libreria JQuery, porque creo que cosas como las que tu quieres hacer, con un método de JQuery te las hace. Por ejemplo, abrir una ventana de transparente a opaca, con transiciones, te costaria tener que hacer un bucle con tiempos etc. Con la funcion fadeIn de JQuery te hace eso (por poner un ejemplo).

Si tienes tiempo, echale un vistazo. Yo lo hacía (y suelo seguir haciendo) cosas a pelo (ya que de paso aprendo como se hacen) pero con JQuery te ahorraras mucho trabajo. Ya me cuentas.

Er_Cheru

He echao 1 ojo al jquery y creo que es algo complejo para lo simple que debería ser este trabajo. Yo simplemente quiero hacer el típico juego simon (el de seguir 1 secuencia que te marca la máquina)...y me repatea que no salga si no empiezo a meter alerts para que no se me iluminen todas a la vez :S. Lo he probao todo, he metido bucles inutiles en medio para raletinzarlo, meter mas setTimeOut, incluso llegue a meter un semáforo para evitar que entrasen 2 fichas a iluminarse simúltaneamente...pero nada, se me iluminan todas las fichas que precisa a la vez. Y sobre el error de IE7...cambie el onMouseDown por onClick para ver si así funciona, y ni con esas. Gracias por intentar ayudarme

Er_Cheru

Por fin he conseguido que funcione en FF he puesto temporizadores a mas no poder y ha quedado perfect. El problema sigue estando en IE7...no hay manera de que me haga caso en los onMouseDown al hacer click encima de las imágenes. Alguien ha usado el onMouseDown con IE7??

NeB1

Realmente deberías gastar jQuery, el programa serían 5 lineas.

p.e.

$("#capaquequiere").animate({opacity:0.5},tiempoenmilisegundos,function(){todo lo que pongas aquí se ejecutará cuando termine la animación de opacidad});

Más que nada porque es CrossBrowser y porque dá un rendimiento muxo mayor a la hora de hacer este tipo de cosas, y porque a la larga se agradece haber aprendido jQuery.

además las cosas se ejecutan una despues de otra y no todas a la vez si vas encadenando funciones. No tendrás el problema de que todo se ejecute a la vez.

Usuarios habituales

  • NeB1
  • Er_Cheru
  • Fr4nk0
  • Riu
  • DaNiTeLLo
  • ZaO
  • r2d2rigo