Foros del Web » Programando para Internet » Javascript »

Quien llamó mi FUNCION???

Estas en el tema de Quien llamó mi FUNCION??? en el foro de Javascript en Foros del Web. Holas a todos... Les tengo una pregunta para variar...:P, se trata de si es posible de alguna forma ubicar ""QUIEN"" llamó a mi funcion de ...
  #1 (permalink)  
Antiguo 04/09/2008, 13:07
 
Fecha de Ingreso: julio-2008
Mensajes: 25
Antigüedad: 16 años, 4 meses
Puntos: 0
Quien llamó mi FUNCION???

Holas a todos...

Les tengo una pregunta para variar...:P, se trata de si es posible de alguna forma ubicar ""QUIEN"" llamó a mi funcion de JAVASCRIPT???


supongamos que tenemos un TD y TEXT aplicando un "onclick" y llama a una funcion delcarda en el head que solamente muestra una alert avisando "unclick", mi pregunta es si es posible que yo sepa cual de los dos elementos llamo a mi funcion???

GRACIAS
  #2 (permalink)  
Antiguo 04/09/2008, 13:12
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
Exclamación Respuesta: Quien llamó mi FUNCION???

No, no es posible a menos que pases por un parámetro el objeto que llamó a la función.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 04/09/2008, 15:30
 
Fecha de Ingreso: julio-2008
Mensajes: 25
Antigüedad: 16 años, 4 meses
Puntos: 0
De acuerdo Respuesta: Quien llamó mi FUNCION???

GRACIAS...
me lo suponia...
  #4 (permalink)  
Antiguo 04/09/2008, 17:34
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años
Puntos: 45
Respuesta: Quien llamó mi FUNCION???

Bueno, yo diría que sí se puede. Si se trata de eventos:

Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>Página nueva</title>
<
style type="text/css">

</
style>
</
head>

<
body>

<
div id="uno" onclick="alerta(event)">uno</div>
<
div id="dos" onclick="alerta(event)">dos</div>

<
script type="text/javascript">
<!--


function 
alerta(ev) {
    var 
src window.event window.event.srcElement ev.target;
    
alert"Has hecho click en la capa con id \""+src.id+"\"" );
}

// -->
</script>

</body>
</html> 
Y si se trata de funciones que llaman a funciones se averigua la función que llamó a la actual con nombreDeLaFuncion.caller.


Saludos.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #5 (permalink)  
Antiguo 04/09/2008, 19:12
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 18 años
Puntos: 122
Respuesta: Quien llamó mi FUNCION???

si, si se puede. No eh probado pero se que si pasas this como parámetro a la función luego puedes capturar ese this y obtener su info...
algo como:

function clickado(cual){

}

<a onclick="clickado(this)">click</a>
Saludos.
__________________
twitter: @imbuzu
  #6 (permalink)  
Antiguo 04/09/2008, 19:26
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años, 7 meses
Puntos: 1284
Respuesta: Quien llamó mi FUNCION???

Hola:

Sí que se puede, pero averiguarlo a veces es bastante complejo... me refiero a asignaciones dinámicas de eventos (addEventListener/attachEvent)... creo que en safari puede obtenerse como generador del evento un nodo de texto... y no hablemos del burbujeo

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #7 (permalink)  
Antiguo 05/09/2008, 06:28
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Quien llamó mi FUNCION???

Un par de matices. Esto no es del todo práctico, ya que dependiendo del donde hagamos click podemos obtener resultados inesperados. En este html es bastante visible, ya que si hacemos click sobre el texto obtenemos span, cuando nuestro objetivo era en realidad el tag div, que es donde asignamos el evento:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>P&#225;gina nueva</title>
<style type="text/css">

</
style>
</
head>

<
body>

<
div id="uno" onclick="alerta(event)"><span>uno</span></div>
<
div id="dos" onclick="alerta(event)"><span>dos</span></div>

<
script type="text/javascript">
<!--


function 
alerta(ev) {
    var 
src window.event window.event.srcElement ev.target;
    
alert"Has hecho click en el elemento \""+src.nodeName+"\"" );
    
//devuelve span o div
}

// -->
</script>

</body>
</html> 
Tampoco podemos usar this dentro de la función que maneja el evento, porque this no tiene sentido en ese contexto:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>P&#225;gina nueva</title>
<style type="text/css">

</
style>
</
head>

<
body>

<
div id="uno" onclick="alerta(event)"><span>uno</span></div>
<
div id="dos" onclick="alerta(event)"><span>dos</span></div>

<
script type="text/javascript">
<!--


function 
alerta(ev) {
    
alert"Has hecho click en el elemento \""+this.nodeName+"\"" );
    
//devuelve undefined
}

// -->
</script>

</body>
</html> 
Ahora, si aplicamos la función addEvent de Scott Andrew y usamos this, en este caso funciona bien en todos los navegadores excepto en Explorer, para el cual this sigue sin tener sentido:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>P&#225;gina nueva</title>

</head>

<
body>

<
div id="uno"><span>uno</span></div>
<
div id="dos"><span>dos</span></div>

<
script type="text/javascript">
<!--

function 
addEvent(elmevTypefnuseCapture) {
    if (
elm.addEventListener) {
        
elm.addEventListener(evTypefnuseCapture);
        return 
true;
    }
    else if (
elm.attachEvent) {
        var 
elm.attachEvent('on' evTypefn);
        return 
r;
    }
    else {
        
elm['on' evType] = fn;
    }
}

function 
alerta(ev) {
    
alert"Has hecho click en el elemento \""+this.nodeName+"\"" );
    
//devuelve undefined en explorer y div en resto
}

addEvent(document.getElementById('uno'), 'click'alertafalse);
addEvent(document.getElementById('dos'), 'click'alertafalse);
// -->
</script>

</body>
</html> 
Y con la misma función, pero sin this e intentando referenciar el elemento dependiendo de srcElement o target, volvemos a la misma indefinición de antes: en un caso entrega div, en otro span, pese a haber asignado la función manejadora a el elemento div:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>P&#225;gina nueva</title>

</head>

<
body>

<
div id="uno"><span>uno</span></div>
<
div id="dos"><span>dos</span></div>

<
script type="text/javascript">
<!--

function 
addEvent(elmevTypefnuseCapture) {
    if (
elm.addEventListener) {
        
elm.addEventListener(evTypefnuseCapture);
        return 
true;
    }
    else if (
elm.attachEvent) {
        var 
elm.attachEvent('on' evTypefn);
        return 
r;
    }
    else {
        
elm['on' evType] = fn;
    }
}

function 
alerta(ev) {
        var 
src window.event window.event.srcElement ev.target;
        
alert"Has hecho click en el elemento \""+src.nodeName+"\"" );
        
//devuelve span o div
}

addEvent(document.getElementById('uno'), 'click'alertafalse);
addEvent(document.getElementById('dos'), 'click'alertafalse);
// -->
</script>

</body>
</html> 
Pero, si modificamos un poco la función de Scott Andrew, podemos lograr que this tenga sentido en todos los navegadores y entonces obtengamos siempre el resultado que esperamos:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"
>
<
html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<
head>
<
meta http-equiv="Content-type" content="text/html;charset=iso-8859-1" />
<
meta name="Author" content="derkeNuke" />
<
title>P&#225;gina nueva</title>

</head>

<
body>

<
div id="uno"><span>uno</span></div>
<
div id="dos"><span>dos</span></div>

<
script type="text/javascript">
<!--

function 
addEvent(elmevTypefnuseCapture) {
    if (
elm.addEventListener) {
        
elm.addEventListener(evTypefnuseCapture);
    }
    else if (
elm.attachEvent) {
        var 
f=function(){
            
fn.call(elm,window.event);
        }
        
elm.attachEvent('on' evTypef);
    }
    else {
        
alert('nop')
    }
}

function 
alerta(ev) {
    
alert"Has hecho click en el elemento \""+this.nodeName+"\"" );
    
//devuelve siempre div
}

addEvent(document.getElementById('uno'), 'click'alertafalse);
addEvent(document.getElementById('dos'), 'click'alertafalse);
// -->
</script>

</body>
</html> 
  #8 (permalink)  
Antiguo 05/09/2008, 08:44
Avatar de derkenuke
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: self.location.href
Mensajes: 2.665
Antigüedad: 21 años
Puntos: 45
Respuesta: Quien llamó mi FUNCION???

Qué bueno Panino, creo que nos estamos encontrando con muchos problemas aquí.
__________________
- Haz preguntas inteligentes, y obtendrás más y mejores respuestas.
- Antes de postearlo Inténtalo y Búscalo.
- Escribe correctamente tus mensajes.
  #9 (permalink)  
Antiguo 05/09/2008, 12:52
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 18 años
Puntos: 122
Respuesta: Quien llamó mi FUNCION???

jajaja.... Por alguna razón panino es favorito de muchos. La verdad que a mi me habría dado flojera hacer tantos experimentos. Bien por esa panino.

Sin embargo, a lo que yo me refería con el this era a lo siguiente:

Código HTML:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="es" lang="es">
<head>
	<meta http-equiv="content-type" content="text/html; charset=utf-8" />
	<title>Untitled</title>
	<script type="text/javascript">
		function detectaElem(cual){
			alert(cual.id);
		}
	</script>
</head>
<body>
<div onclick="detectaElem(this)" id="elemento">
<p><span>Elementos</span> otra cosa mas.</p>
</div>
</body>
</html> 
Sin duda mas sencillo que cualquiera de las soluciones de panino (no digo que sea mejor). Hasta ahora lo eh probado en FF Safari, IE 5.2 para mac y funciona de perlas.
__________________
twitter: @imbuzu
  #10 (permalink)  
Antiguo 05/09/2008, 12:57
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 7 meses
Puntos: 839
De acuerdo Respuesta: Quien llamó mi FUNCION???

Exactamente a eso me refería yo buzu en el primer mensaje, y concuerdo contigo, creo que es la mejor solución en este caso.
Cita:
Iniciado por David el Grande Ver Mensaje
No, no es posible a menos que pases por un parámetro el objeto que llamó a la función.
Excelente aportación Panino5001, por lo que debo corregir el mensaje, sí es posible aún sin pasar por parámetro el objeto.

Saludos .
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #11 (permalink)  
Antiguo 05/09/2008, 13:04
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años, 5 meses
Puntos: 834
Respuesta: Quien llamó mi FUNCION???

Gracias, me voy a poner colorado
  #12 (permalink)  
Antiguo 05/09/2008, 13:04
Avatar de buzu  
Fecha de Ingreso: octubre-2006
Ubicación: San Francisco, CA
Mensajes: 2.168
Antigüedad: 18 años
Puntos: 122
Respuesta: Quien llamó mi FUNCION???

OK, probado en IE 6, 7, y 8 (versión beta 1) y ya como extra en el 5.5 y en todos anda de perlas. No es tan sofisticada pero funciona.
__________________
twitter: @imbuzu
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 18:32.