Foros del Web » Programando para Internet » Javascript »

[SOLUCIONADO] propiedad no definida??

Estas en el tema de propiedad no definida?? en el foro de Javascript en Foros del Web. hola, estoy intentando añadir un nodo al DOM. Este es el codigo que utilizo: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Javascript : Ver original < script > function ...
  #1 (permalink)  
Antiguo 06/12/2016, 11:50
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
Pregunta propiedad no definida??

hola,
estoy intentando añadir un nodo al DOM. Este es el codigo que utilizo:

Código Javascript:
Ver original
  1. <script>
  2. function anyadir(){
  3. var f=document.createElement('form');
  4. this.parentNode.appendChild(f);
  5.  
  6. var in1=document.createElement('select');
  7. var opt2=document.createElement('option');
  8. opt.setAttribute('value','España');
  9. var opt1=document.createElement('option');
  10. opt.setAttribute('value','Francia');
  11. ...........................
  12.  
  13. <body>
  14. <p class='url' onclick="anyadir()">Pulsa aquí para proceder</p>
  15. </body>
al llegar a la propiedad parentNode me dice que no puede leerla porque parentNode no esta definida¡¡
Supongo k el error se debe a que el objeto this no apunta al elemento "p", pero ¿como hago para que pase la referencia al objeto con la llamada a la funcion anyadir() ?


Lo he revisado varias veces y comparado con otros ejemplos pero no se een que falla:)¿Me podeis echar una mano para sacar el error?

Gracias, saludos:D
__________________
1os pasaos con xAMP en Windows
programando en PERL

Última edición por alfa18; 06/12/2016 a las 12:37
  #2 (permalink)  
Antiguo 06/12/2016, 13:26
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 5 meses
Puntos: 86
Respuesta: propiedad no definida??

Claro que está indefinido. Piensas que this en ese contexto se refiere al elemento <p>, pero en realidad, se refiere al objeto window. Para que this sea el elemento <p>, debes pasarselo como parámetro a la función ya que la invocación está en línea o registrar el evento con addEventListener. Todo esto se explica aquí
Código Javascript:
Ver original
  1. <!DOCTYPE html>
  2. <html dir="ltr" lang="es-es">
  3.     <head>
  4.         <title></title>
  5.         <meta charset="utf-8">
  6.         <meta name="viewport" content="user-scalable=yes, width=device-width, initial-scale=1">
  7.         <style>
  8.  
  9.         </style>
  10.         <script>
  11.             function anyadir(elem){
  12.                 console.log(this);
  13.                 console.log(this.parentNode);
  14.                 console.log(elem);
  15.             }
  16.         </script>
  17.     </head>
  18.     <body>
  19.         <p class='url' onclick="anyadir(this)">Pulsa aquí para proceder</p>
  20.         <p class='url2'>Pulsa aquí para proceder 2</p>
  21.  
  22.         <script>
  23.             document.querySelector('.url2').addEventListener('click', anyadir, false);
  24.         </script>
  25.     </body>
  26. </html>
  #3 (permalink)  
Antiguo 07/12/2016, 07:20
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
De acuerdo Respuesta: propiedad no definida??

Muchas gracias por tu clara respuesta y por tu codigo mpozo, se ve muy claro k efectivamente en invocaciones 'manuales' al evento se debe pasar la referencia al objeto this

Tengo dos dudas respecto a tu codigo. ¿Me podrias explicar?

A la hora de seleccionar un objeto del DOM, veo k utilizas el metodo querySelector¿cuando usar uno u otro(getElementByyClassName)o son completamente iguales? ¿alguna diferencia/ventaja entre los distintos metodos de seleccion (por CSS/ID/name/clase)?
mediante queySelector podriamos seleccionar cualquier objeto DOM(ID/tag/name/class),¿porque los otros metodos si este(querySelector) "se come" a todos?

¿En este ejemplo que hace el 3er parametro del método addEventListener? se que el valor false activa el "bubling" de eventos pero en este caso no tiene mucho sentido al no haber una jerarquia de eventos,¿no?

Gracias de nuevo y un saludo:D
__________________
1os pasaos con xAMP en Windows
programando en PERL
  #4 (permalink)  
Antiguo 07/12/2016, 14:49
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 5 meses
Puntos: 86
Respuesta: propiedad no definida??

Cita:
Iniciado por alfa18 Ver Mensaje
A la hora de seleccionar un objeto del DOM, veo k utilizas el metodo querySelector¿cuando usar uno u otro(getElementByyClassName)o son completamente iguales? ¿alguna diferencia/ventaja entre los distintos metodos de seleccion (por CSS/ID/name/clase)?
mediante queySelector podriamos seleccionar cualquier objeto DOM(ID/tag/name/class),¿porque los otros metodos si este(querySelector) "se come" a todos?
Se trata de versatilidad, no de rapidez de ejecución o por que sobrecarge menos. De hecho, mientras que con getElement se obtiene la información cuando se necesita, con querySelector se almacena en el cliente.
Un ejemplo básico de su versatilidad
Código Javascript:
Ver original
  1. <!DOCTYPE html>
  2. <html dir="ltr" lang="es-es">
  3.     <head>
  4.         <title></title>
  5.         <meta charset="utf-8">
  6.         <meta name="viewport" content="user-scalable=yes, width=device-width, initial-scale=1">
  7.         <style>
  8.  
  9.         </style>
  10.         <script>
  11.             document.addEventListener('DOMContentLoaded', function() {
  12.  
  13.                 console.log(document.querySelector('.yes, #no').textContent);
  14.                 console.log(document.querySelector('.yes1, #no').innerHTML);
  15.                 console.log(document.querySelector('.yes, #no1'));
  16.                 console.log(document.querySelector('.yes1, #no1'));
  17.                 console.log(document.querySelector('input[name="numero"]'));
  18.  
  19.             }, false);
  20.         </script>
  21.     </head>
  22.     <body>
  23.  
  24.         <div class="si yes">texto 1</div>
  25.         <div id="no">texto 2 <input value="0" name="numero"></div>
  26.         <div class="si yes">texto 1</div>
  27.  
  28.     </body>
  29. </html>
Cita:
Iniciado por alfa18 Ver Mensaje
¿En este ejemplo que hace el 3er parámetro del método addEventListener? se que el valor false activa el "bubling" de eventos pero en este caso no tiene mucho sentido al no haber una jerarquia de eventos,¿no?
Como sabes cuando se produce el evento sobre el elemento, el evento se propaga en dos fases - fase de captura y fase de propagación -. La fase de captura va desde el elemento padre hasta elemento hijo - donde se produjo el evento - y la fase de propagación va desde el elemento hijo - donde se produjo el evento - hasta el elemento padre. Con el parámetro de captura se controla la primera fase.
Por defecto el parámetro es false. Omitiendo este parámetro o declararlo como false, podemos saltar la fase de captura.
Si ejecutas este ejemplo y después omites el tercer parámetro o lo estableces a false, comprobarás lo que te explico
Código Javascript:
Ver original
  1. <!DOCTYPE html>
  2. <html dir="ltr" lang="es-es">
  3.     <head>
  4.         <title></title>
  5.         <meta charset="utf-8">
  6.         <meta name="viewport" content="user-scalable=yes, width=device-width, initial-scale=1">
  7.         <style>
  8.  
  9.         </style>
  10.         <script>
  11.             function foo(){
  12.                 console.log(this);
  13.             }
  14.        
  15.             document.addEventListener('DOMContentLoaded', function() {
  16.  
  17.                 document.querySelector('body').addEventListener('click', foo, true);
  18.                 document.querySelector('div').addEventListener('click', foo, true);
  19.                 document.querySelector('span').addEventListener('click', foo, true);
  20.  
  21.             });
  22.         </script>
  23.     </head>
  24.     <body>
  25.  
  26.         <div>
  27.             <span>Pulsame</span>
  28.         </div>
  29.  
  30.     </body>
  31. </html>
  #5 (permalink)  
Antiguo 09/12/2016, 07:21
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
Respuesta: propiedad no definida??

Veo k sabes mucho de JS(y lo mejor es que sabes explikar, de eso no hay muchos en este foro), pero yo estoy empezando, asi que vamos por partes:

Cita:
Iniciado por mpozo Ver Mensaje
Se trata de versatilidad, ....[/HIGHLIGHT]
te refieres a comodidad de poner IDs y/o clases con el mismo metodo(querySelector)??

Cita:
Iniciado por mpozo Ver Mensaje
con getElement se obtiene la información cuando se necesita, con querySelector se almacena en el cliente.
¿A que te refieres con eso?No entiendo, ¿me podrias explicar?

En tu 2º ejemplo,
Cita:
Iniciado por mpozo Ver Mensaje
el evento se propaga en dos fases - fase de captura y fase de propagación -.
en el codigo del ejemplo el evento se propaga en las dos fases. ¿pork al ejecutarlo solo veo la captura(del padre al hijo) pero no la propagacion(del hijo al padre)?

, no deberia ver además un span-div-body(del hijo al padre)??
__________________
1os pasaos con xAMP en Windows
programando en PERL

Última edición por alfa18; 09/12/2016 a las 07:43
  #6 (permalink)  
Antiguo 10/12/2016, 07:45
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 5 meses
Puntos: 86
Respuesta: propiedad no definida??

Cita:
Iniciado por alfa18 Ver Mensaje
te refieres a comodidad de poner IDs y/o clases con el mismo metodo(querySelector)??
Sí, es un método muy potente

Cita:
Iniciado por alfa18 Ver Mensaje
¿A que te refieres con eso?No entiendo, ¿me podrias explicar?
Los nodeList pueden estar vivos o ser estáticos. Los getElement retornan colecciones vivas, mientra que querySelector retorna colecciones estáticas. ¿Qué quiere decir esto? Pues que querySelector almacena en el cliente el nodeList y aunque este varíe su largo, no será detectado. Los getElement sí detecta el cambio.
Con este ejemplo podemos observarlo
Código Javascript:
Ver original
  1. <!DOCTYPE html>
  2. <html dir="ltr" lang="es-es">
  3.     <head>
  4.         <title></title>
  5.         <meta charset="utf-8">
  6.         <meta name="viewport" content="user-scalable=yes, width=device-width, initial-scale=1">
  7.         <style>
  8.  
  9.         </style>
  10.         <script>
  11.             function isNodelistLive(nList) {
  12.  
  13.                 var body = document.getElementsByTagName('body')[0],
  14.                 largo1 = nList.length,
  15.                 clon = nList.item(0).cloneNode();
  16.  
  17.                 body.appendChild(clon);
  18.                 var largo2 = nList.length;
  19.                 return largo1 !== largo2;
  20.                 //return (largo1 + ' - ' + largo2);
  21.             }
  22.         </script>
  23.     </head>
  24.     <body>
  25.  
  26.         <input type="text" class="input" name="input">
  27.  
  28.         <script>
  29.             var gEBTN = document.getElementsByTagName('input'),
  30.             gEBCN = document.getElementsByClassName('input'),
  31.             gEBN = document.getElementsByName('input'),
  32.             qSA = document.querySelectorAll('.input');
  33.  
  34.             console.log(isNodelistLive(gEBTN)); // true (1 - 2)
  35.             console.log(isNodelistLive(gEBCN)); // true (2 - 3)
  36.             console.log(isNodelistLive(gEBN)); // true (3 - 4)
  37.             console.log(isNodelistLive(qSA)); // false (1 - 1)
  38.         </script>
  39.     </body>
  40. </html>
Este código hace que cada vez que es invocada la función, clona el elemento <input> y retorna true o false arreglo a si el largo del nodeList es igual o desigual al largo del nodeList una vez clonado el elemento. Si después comentas el primer return y descomentas el segundo, verás que los getElement leen el nuevo largo del nodeList, mientras que el largo que retorna querySelector siempre es 1

Cita:
Iniciado por alfa18 Ver Mensaje
no deberia ver además un span-div-body(del hijo al padre)??
En el momento en que omitas o cambies el 3º parámetro a false lo obtendrás
  #7 (permalink)  
Antiguo 11/12/2016, 15:44
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
De acuerdo Respuesta: propiedad no definida??

Cita:
Iniciado por mpozo Ver Mensaje
Los nodeList pueden estar vivos o ser estáticos. Los getElement retornan colecciones vivas, mientra que querySelector retorna colecciones estáticas.
OK, asi da gusto con gente que sabe esxplicarGracias por tus ejemplos, se entienden perfectamente

Cita:
Iniciado por mpozo Ver Mensaje
En el momento en que omitas o cambies el 3º parámetro a false lo obtendrás
me refiero sin cambiar a false el valor del parametro, es decir 6 lineas con true(body-div-span + span-div-body) y 3 para false(span-div-body), por tu anterior post me parecio que al dar true al parametro se daban las dos fases juntas(captura+ propagacion), pero ¿no es mas bien que el evento se propaga en UNA Y SOLO UNA DE ESTAS DOS(no se dan las dos a la vez con true) dos fases, captura o propagacion??
__________________
1os pasaos con xAMP en Windows
programando en PERL

Última edición por alfa18; 11/12/2016 a las 16:00
  #8 (permalink)  
Antiguo 12/12/2016, 07:53
 
Fecha de Ingreso: noviembre-2015
Mensajes: 231
Antigüedad: 8 años, 5 meses
Puntos: 86
Respuesta: propiedad no definida??

Tienes razón, de mis palabras se puede deducir esa conclusión.

El 3º parámetro es useCapture, un boleano (true/false). En el proceso interno de addEventListener se te pregunta; ¿Quieres que se inicie la fase de captura? Y tú respuesta es
  • true --> sí
  • false (omitido) --> no
En caso que la respuesta sea no, no se inicia la fase de captura, sino la fase de burbuja.
La única opción para que ambas fases concurran en un mismo elemento es que tengan distintos eventos o distinto parámetro de captura. Siguiendo el ejemplo anterior
Código Javascript:
Ver original
  1. <!DOCTYPE html>
  2. <html dir="ltr" lang="es-es">
  3.     <head>
  4.         <title></title>
  5.         <meta charset="utf-8">
  6.         <meta name="viewport" content="user-scalable=yes, width=device-width, initial-scale=1">
  7.         <style>
  8.  
  9.         </style>
  10.         <script>
  11.             function foo(){
  12.                 console.log(this);
  13.             }
  14.        
  15.             document.addEventListener('DOMContentLoaded', function() {
  16.  
  17.                 document.querySelector('body').addEventListener('click', foo, true);
  18.                 document.querySelector('div').addEventListener('click', foo, true);
  19.                 document.querySelector('span').addEventListener('click', foo, true);
  20.  
  21.                 document.querySelector('body').addEventListener('click', foo);
  22.                 document.querySelector('div').addEventListener('click', foo);
  23.                 document.querySelector('span').addEventListener('click', foo);
  24.  
  25.             });
  26.         </script>
  27.     </head>
  28.     <body>
  29.  
  30.         <div>
  31.             <span>Pulsame</span>
  32.         </div>
  33.  
  34.     </body>
  35. </html>
  #9 (permalink)  
Antiguo 22/12/2016, 06:10
 
Fecha de Ingreso: diciembre-2007
Mensajes: 299
Antigüedad: 16 años, 4 meses
Puntos: 2
De acuerdo Respuesta: propiedad no definida??

OK, la verdad es que asi tiene mas sentido asi(que el 3er parametro 'pregunte el sentido' de propagacion del evento), simplemente lo entendi mal

Gracias por tu ayuda @mpozo, saludos:D
__________________
1os pasaos con xAMP en Windows
programando en PERL

Etiquetas: propiedad
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:41.