jQuery: ¿por qué da un array el selector de ID?

elkaoD

¿Por qué #("tag#nombreid" ) me devuelve un array?

Es decir, ¿por qué tengo que hacer #("a#left" )[0].click()? No le veo sentido, ya que los IDs son únicos. Supongo que es por consistencia con los selectores en general, pero esto no me suena que estuviera en jQuery, ¿es de versiones recientes o estoy haciendo algo mal?

m0rG

Es una buena pregunta. Yo casi siempre que he utilizado un selector de ID ha sido para leer/escribir su valor ($("#idquesea").val()) o alguno de sus atributos. En ese caso si que funciona como se podría esperar (no es necesario indicar que estás tratando el primer elemento).

Según leo en realidad el selector no devuelve un array sino un objeto JQuery en todos los casos (no es un array pero se comporta como tal). Este objeto contiene los objetos DOM reconocidos por el selector (cero o uno en caso del selector por ID). Por esa razón tienes que hacer el ("a#left" )[0] (para acceder al elemento en sí). La razón por la que otras funciones JQuery como val() o attr() funcionan sin especificar el número de elemento es por que actúan siempre sobre el primer elemento del conjunto reconocido.

Supongo que en la API de JQuery habrá más información sobre esto pero en estos links de stackoverflow se explica bastante bien: http://stackoverflow.com/questions/7183704/jquery-id-selector-id-returns-array , http://stackoverflow.com/questions/5140919/jquery-returns-a-list-using-id-selector

1 respuesta
elkaoD

#2 humm, curioso, osea que es por el método que llamo. Entonces, ¿por qué click no afecta al primer elemento? Sigo pensando que ya he hecho esto antes sin el [0].

1 respuesta
EnZo

#1 A tí te pega más usar mootools :P

1 respuesta
Khanser

#3 El problema es que estás usando un selector compuesto y aunque estás usando un id dentro, el detecta que es compuesto. Si solo usas $('#<id>') puedes usar .click sin problemas. El problema viene que si usas un selector como $('div.miclase a') puede haber varios anchors y varios divs que cumplan esa regla, por eso con 'a#id' tienes que hacer$('a#id')[0].click(), pero puedes hacer $('#id').click() sin problemas porque al ser un id no necesitas meterle más mierda al selector :)

2 respuestas
scumah

Funciona también sin poner el [0], igual que funcionaría en el caso de usar una clase que por, lo que sea, fuera única. El .click se aplica a todos los elementos que devuelva el selector, y si es uno sólo, pues sólo en uno se aplica. Si pones un poco más de código podríamos ver donde está el problema, pero algo así te funciona seguro:

$("a#left").click(function(){
  // Lo que tu quieras
});

ED: #5, al leerte me has puesto en duda y he tenido que hacer la prueba xD Parece que funciona por muy compuesto que sea el selector :P -> http://jsfiddle.net/dGJrW/

Khanser

Yo he hecho la prueba aqui en MV y con el selector del texto de responder no funcionaba hasta que le he puesto un id o el [0] xD

elkaoD

#4 y eso?

#5 tiene sentido lo del selector compuesto, no sé cómo no lo he visto antes, gracias!

PD: Qué negro me pone lo de method("string"). ¡Arreglad el bug, señores de MV!

1 respuesta
EnZo

#8 Porque mootools es más para programadores puros. Es mas flexible, mas modular, es más un framework de javascript en definitiva.

Aunque para hacer cosas rapidas o encontrar plugins por inet a jQuery no le gana nadie. Es más practico.

Usuarios habituales

  • EnZo
  • elkaoD
  • Khanser
  • scumah
  • m0rG