2012-03-21 17 views
7

las siguientes obras:Conjunto document.getElementById a la variable

$ = document.form; 
    x = $.name.value; 

Esto no significa:

$ = document.getElementById; 
    x = $("id").value; 

¿Alguna idea sobre por qué esto no funciona o cómo hacer que sea así?

+0

Usted puede encontrar su respuesta entre las líneas en este post/respuesta: http://stackoverflow.com/a/9612657/77047 –

+0

no estoy seguro de que es un correo xact duplicar per se, pero esto cubre el mismo terreno que http://stackoverflow.com/questions/6398787/javascript-shorthand-for-getelementbyid – lonesomeday

Respuesta

0

Si está tratando de lograr algo así sugiero usar jQuery. Su notación $ es mucho más poderosa que solo obtener un elemento por id.

Además, si está utilizando una plataforma que ya usa $ como variable (ASP .Net a veces usa esto) puede tener un resultado impredecible.

10

El valor de this depende de cómo llame a la función.

Cuando llame al document.getElementById, entonces getElementById obtiene this === document. Cuando copia getElementById en una variable diferente y luego lo llama como $ entonces this === window (porque window es la variable predeterminada).

Esto hace que busque la identificación en el objeto de la ventana en lugar de en el objeto del documento, y que falla terriblemente porque las ventanas no son documentos y no tienen los mismos métodos.

Debe mantener el document en la llamada. Puede usar funciones de contenedor para esto, p.

function $ (id) { return document.getElementById(id); } 

... pero no utilice $. Es un nombre horrible. No tiene ningún significado y confundirá a las personas que lo vean y piensen "¡Ah, lo sé, jQuery!" o "¡Ah! Sé prototipo", etc. etc.

+1

$ tiene el significado de "método selector de id", por lo que todo está bien con eso. – Bergi

+1

@Bergi - No, no es así. En jQuery, por ejemplo, significa "Obtener una colección de elementos de un selector CSS ** o ** generar una colección de nodos a partir de un fragmento de HTML ** o ** ejecutar esta función cuando se desencadena el evento DOMReady". – Quentin

+1

Eche un vistazo a [estos comentarios] (http://stackoverflow.com/a/6398800/1048572). Además, jQuery es un muy buen ejemplo de por qué no debes sobrecargar las funciones del selector de colecciones super-duper. – Bergi

1

getElementById es un método del prototipo HTMLDocument (del cual document es una instancia). Por lo tanto, al llamar a la función en un contexto global, seguramente obtendrás un "Error incorrecto" o algo así.

Es posible utilizar

var $ = document.getElementById.bind(document); 

pero

function $(id) { return document.getElementById(id); } 

también es normal y tal vez mejor entender.

1

no saben lo que quiere lograr, pero esto se puede hacer trabajando así

$ = document.getElementById; 
x = $.call(document, "id").value; 

PORQUE getElementById sólo funciona cuando se trata de una función de document debido al alcance que necesita.

Pero yo recomendaría la respuesta de @ Quentin.

+0

Demo: http://jsfiddle.net/5V5w3/ – Zeta

4

El objeto de contexto es diferente.Cuando se obtiene una referencia de una función que se está cambiando objeto de contexto:

var john = { 
    name : "john", 
    hello : function() { return "hello, I'm " + this.name } 
} 

var peter = { name : "peter" }; 

peter.hello = john.hello; 

peter.hello() // "hello, I'm peter" 

Si desea una función de referencia ligado a un objeto de contexto específico, usted tiene que utilizar bind:

peter.hello = john.hello.bind(john); 

peter.hello(); // "hello, I'm john" 

Así en su caso, será:

var $ = document.getElementById.bind(document); 
Cuestiones relacionadas