entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

0voto

recuperar valores con parametros de funcion

hola a todos no entiendo porque me da el siguiente error en la consola del navegador, el error varia segun el elemento afectado
prova.php:24 Uncaught ReferenceError: elemento is not defined
at HTMLLIElement.onmouseover (prova.php:24)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
    <meta name="description" content="">
    <meta name="keywords" content="">

</head>
<body>
    <?php

     $estructura = scandir("../beta");
     print_r($estructura);
     for($x = 0; $x<sizeof($estructura); $x++){
        echo "<li onmouseover='escanear($estructura[$x])'>$estructura[$x]</li></br>";
     }

    ?>

    <script type="text/javascript">
        function escanear(directorio){
            console.log(directorio)
        }
    </script>
</body>
</html>

con esto puedo obtener mi codigo renderizado de la siguiente manera

<li onmouseover="escanear(.)">.</li><br>
<li onmouseover="escanear(..)">..</li><br>
<li onmouseover="escanear(estudio)">estudio</li><br>
<li onmouseover="escanear(pendientes)">pendientes</li><br>
<li onmouseover="escanear(prepros.cfg)">prepros.cfg</li><br>
<li onmouseover="escanear(prova.php)">prova.php</li><br>
<li onmouseover="escanear(random)">random</li><br>
<li onmouseover="escanear(templates)">templates</li><br>
<li onmouseover="escanear(test)">test</li><br>

    <script type="text/javascript">
        function escanear(directorio){
            console.log(directorio)
        }
    </script>

el problema es que mi funcion escanear no me devuelve el valor que esta presente como parametro en la llamada a esta misma funcion, lo que quiero es que cuando pase por cada elemento el valor que lleve dentro mi funcion se imprima en consola, logicamente esto debe de cambiar segun el elemento afectado

2 Respuestas

3votos

carlossevi Puntos59970

El mensaje es muy claro: Uncaught ReferenceError: estudio is not defined. Supongo que se refiere a la línea:

<li onmouseover="escanear(estudio)">estudio</li><br>

Es decir, al código JS escanear(estudio). ¿Qué es estudio en tu código? Lo estás pasando como si fuera un objeto pero JS se queja de que no lo conoce. ¿Quieres decir escanear('estudio')?

steven comentado Abr 11

todos los elementos li son los nombres cada carpeta, cuando paso por un elemento li automaticamente deberia llamar a la funcion que procederia a listar el contenido

carlossevi comentado Abr 11

¿A dónde vas? patatas traigo.

No tiene nada que ver que sean elementos <li>, nombres de carpeta o versos alejandrinos. El objeto estudio no está definido antes de la llamada a escanear(estudio).

steven comentado Abr 11

el mensaje de error varia segun el elemento afectado, esto significa que si paso por otro elemento por ejemplo random obtengo
prova.php:24 Uncaught ReferenceError: random is not defined
at HTMLLIElement.onmouseover (prova.php:24)

carlossevi comentado Abr 11

¡Efectivamente! Vas pillando el funcionamiento. Apuesto a que si pasas el ratón por el siguiente elemento:

<li onmouseover="escanear(bufanda)">¡Andanda que bufanda!</li><br>

El resultado es:
Uncaught ReferenceError: bufanda is not defined.

Atención, porque el resultado será diferente de este otro elemento:

<li onmouseover="escanear('Esto es una cadena')">¡Acabáramos!</li><br>

¿Aprecias la diferencia?

steven comentado Abr 11

si lo puedo notar, pero acaso no se pueden pasar variables por parametros, siempre y cuando bufanda sea reconocida como una variable

carlossevi comentado Abr 11

Efectivamente, pero en estos casos ni bufanda, ni estudio ni random son reconocidos como variables. De ahí el error "is not defined".

steven comentado Abr 11

que extraño, porque razon pasa esto, acabo de hacer una modificacion pero sigue con lo mismo

    <script type="text/javascript">
        function escanear(var elemento){
            console.log(elemento)
        }
    </script>

carlossevi comentado Abr 11

No es extraño, es que no has entendido el error. ¿Qué tiene que ver que bufanda no esté definido como variable con la defición de la función escanear()? Da igual cómo esté definida la función.

steven comentado Abr 11

no entiendo, se supone que en mi funcion escanerar los parametros son variables, y pueden tomar cualquier valor segun la llamada de la funcion, hice algo parecido hace tiempo con numeros y no me causo este problema, en definitiva que puedo hacer para solucionarlo

carlossevi comentado Abr 11

No lo entiendes porque no tienes la más mínima base teórica en ni un solo lenguaje de programación, y esto es un constante en cada pregunta que haces. La definición de la función no influye en la definión de las variables que le pasas como parámetros. Sobre este ejemplo:

var butifarra = 'Esto es una cadena de texto';
asar(butifarra);
cocer(butifarra);
asar(pimiento);
cocer(pimiento);

Independientemente de cómo estén definidas las funciones asar() y cocer(), sabemos seguro que las líneas asar(pimiento) y cocer(pimiento) van a fallar porque la variable pimiento no existe.

¿Qué puedes hacer para solucionarlo?

Respuesta corta: define la variable o pasa como variable una cadena de texto. Ejemplo:

<li onmouseover="escanear('estudio')">estudio</li><br>

Respuesta adecuada: ¡¡¡Por favor estudia!!!

steven comentado Abr 11

hubiese usado desde el principio el valor por parametro pero no puedo hacerlo porque tengo un problema con las comillas, osea que no puedo usar mas de dos comillas en una linea

echo "<li onmouseover='escanear('$estructura[$x]')'>$estructura[$x]</li></br>";

lo renderiza mal de la siguiente manera

<li onmouseover="escanear(" estudio')'="">estudio</li>

respecto a la declaracion de la variable, he probado a definirlo dentro de mi funcion y dentro de la llamada pero no resuelve nada

elemento = ""
        function escanear(elemento){
            console.log(elemento)
        }
        function escanear(elemento = "elemento"){
            console.log(elemento)
        }

carlossevi comentado Abr 11

Te enlazo una lectura muy interesante sobre las secuencias de escape en PHP. Cosas como estas se encuentran en la documentación. La solución para poder escribir unas comillas dentro de una cadena de texto que a su vez se define con comillas es escaparlas (\"):

echo "<li onmouseover=\"escanear('$estructura[$x]')\">$estructura[$x]</li></br>";

El resto de tu comentario voy a obviarlo porque vuelve la burra al trigo y otra vez hablas de la definición de la función cuando esa parte es irrelevante con el error que tienes.

steven comentado Abr 11

bendito seas @carlossevi por fin puedo poner multiples comillas, sin embargo antes de tu respuesta he probado con lo siguiente teniendo en cuenta tu sugerencia pero me devuelvoia el mismo error

<li onmouseover="escanear(estudio)">estudio</li><br>
        function escanear(elemento = "test"){
            console.log(elemento)
        }

se supone que deberia devolver por consola el texto test sin importar que elemento fue afectado

carlossevi comentado Abr 11

¿Estás de broma? TIENES EL MISMO ERROR TODO EL RATO. La variable estudio NO EXISTE. ¿Dónde está la cámara oculta?

Peter comentado Abr 11

@carlossevi el problema es que @steven solo sabe que no le funciona, pero no sabe cual es el error en ninguna de sus preguntas. Entonces por esa razón aunque se lo expliques mil veces y le digas "TIENES EL MISMO ERROR TODO EL RATO", da igual, el no sabe cual es el error, , ni que dice el error, ni en que linea sale el error, ni nada, solo sabe que no le funciona... Y vuelve a preguntar y así en un loop interminable.

Animo! :P

steven comentado Abr 11

no puedo entender porque razon no reconoce mi variable si en mi funcion lo inicializo y le asigno una cadena, para mi la logica es que mi variable estudio u otro elemento afectado por el hover que todavia no existe de todos modos deberia llegar a mi funcion y contener mi cadena.

<li onmouseover="escanear(estudio)">estudio</li><br>
         function escanear(elemento = "test"){
            console.log(elemento)
        }

normalmente si en la llamada le paso una cadena o un numero lo puedo rescatar sin nigun error, para que sepan que estudio esto en programacion se llama parametros por valor

<li onmouseover="escanear("cadena")">estudio</li><br>
         function escanear(elemento){
            console.log(elemento)
        }

con esto la cadena que pase en la llamada a mi funcion escanear se guarda en la variable elemento.
de acuerdo a esta logica si le paso a la llamada de mi funcion una variable por argumento, tecnicamente deberia ser posible recuperar almenos el nombre de la variable en mi funcion.
porque aunque no exista o no tenga ningun valor deberia llegar a mi funcion y luego en ese instante tomar el valor

<li onmouseover="escanear(estudio)">estudio</li><br>
        function escanear(elemento = "elemento"){
            console.log(elemento)
        }

sigo creyendo que la variable elemento toma el valor de mi variable pasada por argumento en la llamada a mi funcion porque no puedo explicarme porque el siguiente codigo funciona si mi variable estudio esta fuera de mi funcion y no tiene el mismo nombre de la variable elemento

    estudio = "prueba"
        function escanear(elemento){
            console.log(elemento)
        }

carlossevi comentado Abr 12

¡Y vuelta otra vez a empeñarte con la definición de la función! ¡Qué no! NO, no, N-O, no depende de eso. Depende de que la variable esté inicializada ANTES de hacer la llamada a la función. Ya no sé como escribírtelo.

Solo tengo una pregunta: ¿Entiendes la diferencia entre estas dos expresiones:

var mivar = estudio;
var mivar = 'estudio';

Hasta que no expliques cual es la diferencia no podemos continuar con el asunto.

steven comentado Abr 12

si la variable existe en mi funcion y lleva una cadena porque razon en la llamada esta variable no llega. si en la llamada a mi funcion le paso una variable que todavia no existe y en la definicion de mi funcion tengo como argumento una variable. esta varible se debe trasformar en la variable que paso en llamada, esto simplemente hace que la variable en la definicion de mi funcion cambie nombre dependiendo que nombre le pase en la llamada a mi funcion
supuestamente la variable inexistente que paso en la llamada prueba(ejemplo) y en mi la definicion de mi funcion tengo function prueba(nuevo) nuevo debe convertirse en ejemplo.
esta funcion no hace nada pero si igualo nuevo a una cadena todos las variables que paso en la llamada a mi funcion deben tomar la cadena

porque como decias tu si le paso una cadena a la llamada de funcion y en la definicion tengo una variable como argumento, automaticamente la variable se transforma en la cadena de la llamada. esto deberia ser igual para las variables si en la llamada a mi funcion le paso una variable y en mi definicion tengo otra variable de otrl nombre, esta variable debe de trasformarse en la variable que paso en la llamada.
en mi ultimo ejemplo de mi codigo si te das cuenta declaro antes de mi funcion la variable estudio y le asigno una cadena luego en la definicion de mi funcion le paso una variable con otro nombre, a pesar se esto mi funcion reconoce la variable estudio y elemento toma su nombre

en tu codigo la diferencia es que la variable toma el valor de otra variable y la otra toma jna cadena

carlossevi comentado Abr 12

Me salto tus dos primeros párrafos que no son mas que divagaciones y me voy a lo que interesa: "en tu codigo la diferencia es que la variable toma el valor de otra variable y la otra toma jna cadena"

Vale, ahora entiende la diferencia de:

cualquierFuncion(estudio);
cualquierFuncion('estudio');

steven comentado Abr 12

en la llamada a tal funcion le pasas una variable y en la otra una cadena.
si en la definicion de mi funcion tengo
cualquierfuncion(argumento)
la cadena que paso en la llamada a mi funcion se guarda en la variable argumento.

pero si en la llamada a mi funcion le paso una variable
cualquierfuncion(variable)

y en la definicion tengo otra variable de otro nombre
cualquierfuncion(otravariable)

otravariable debe cambiar nombre y concertirse en variable.

carlossevi comentado Abr 12

Esta parte es correcta: "en la llamada a tal funcion le pasas una variable y en la otra una cadena"

Al "entrar" en la función, los parámetros se convertirán en variables locales de la función, algo así como el cambio de nombre que tu dices.

Ahora sí, voy a tomar el ejemplo de tu función:

function escanear(elemento = "elemento"){
    console.log(elemento);
}

Empiezo por el segundo caso, le pasas un valor

escanear('estudio');
escanear(123);

Dentro de la función se va a crear una variable local elemento y le va a asignar el valor 'estudio', que es una cadena de texto. Ningún problema.

En el primer caso, le pasas una expresión (o variable)

escanear(estudio);

Dentro de la función se va a crear una variable local elemento y le va a asignar el valor estudio, que resulta que no es un valor. Al no tratarse de un valor, se busca que sea una variable (local, global o del ámbito que corresponda)... ¡pero no encuentra ninguna variable definida con el nombre estudio! De ahí el error "estudio is not defined". El programa no sabe qué quieres decir con estudio, para él es algo que no existe, no lo entiende y se ve obligado a fallar.

Esto pasa siempre que utilizas una expresión que no puede resolverse, independientemente de cómo esté definida la función a la que llamas.

Bonus

El valor por defecto que tratas de definir con escanear(elemento = "elemento") sirve para llamadas que NO pasan ningún parámetro, como escanear() pero no para llamadas con parámetros erróneos.

steven comentado Abr 12

entonces significa que a pesar del error la variable que pase en la llamada a la funcion llega y toma el puesto de mi variable definida en la funcion, pero como dicha variable no existe no lo toma en cuenta

carlossevi comentado Abr 12

Significa que no consigue llamar a la función porque falla en la identificación de los parámetros.

steven comentado Abr 12

ahora lo puedo entender, en ningun caso la variable elemento definida en mi funcion cambia,es capaz solo de guardar valores, variables y arreglos, yo creia al principio que esta variable elemeto podia ser sustituida por motra variable que paso en la llamada

carlossevi comentado Abr 12

Claro que puede ser sustituida por otra variable... ¡pero por otra variable que exista! ¿Lo entiendes? ¡¡Tiene que existir!! En el ejemplo anterior no había ninguna variable estudio.

Un caso que sí funcionaría:

var estudio = 'estudio';
escanear(estudio);

Creo que con esto podemos dar por terminada la conversación, y tu apuntarte a clases de programación y de comprensión lectora.

steven comentado Abr 12

no te preocupes lo acabo de entender, muchas gracias

1voto

gerko23 Puntos1870

hola la linea en tu php te quedaria mejor asi:

echo '<li onmouseover="escanear('.'valor = "'.$estructura[$x].' " '.')">'.$estructura[$x].'</li></br>';

luego ya en la lista "escanear(estudio)" "estudio" es una variable la cual debe tener un valor de lo contrario te da error si quiere que sea un texto debes de definirlo como ta el uso de comillas es importante, el JS lee a estudio como variable, si quieres que sea tu salida debes de definirselo como salida

steven comentado Abr 11

muchas gracias por la sugerencia, el error lo pude resolver usando la secuencia de escape sin embargo todavia me quedaron algunas dudas lo puedes ver en mi ultimo comentario

Por favor, accede o regístrate para responder a esta pregunta.

¿Conoces alguien que puede responder?
¡Comparte esta pregunta!


Actividad Reciente

¿Eres Usuario Apple?

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta