Encienda su consola Firebug y pruebe esto.¿Es esto correcto? ¿Un error jQuery que borra el almacén de datos?
Compare esto:
$('body').data('x',1);
$(thisx).remove();
console.log($('body').data('x'));
a esto:
$('body').data('x',1);
$(this.x).remove();
console.log($('body').data('x'));
cuenta de la diferencia? Si thisx
no está definido, arrojará inmediatamente un error de referencia. Si x
es una propiedad indefinida de this
, jQuery devolverá el documento como su conjunto de resultados en su lugar. Luego jQuery intentará eliminar su documento (lo que no puede), pero antes de hacerlo eliminará todos los datos adjuntos a cualquier elemento secundario del documento. Por lo tanto, borrando su almacén de datos.
Nota: this
puede ser cualquier referencia de elemento u objeto. Solo necesita tener jQuery intente acceder a una propiedad indefinida.
(Hablando de un problema, falla silenciosamente, y estoy tratando de descubrir por qué mis datos faltan de repente. Lo rastreo a un caso especial donde una referencia de elemento no estaba definida en una situación específica.)
Así que a mis preguntas:
1) antes de enviarla un informe de error, ¿estoy analizando esto correctamente? Además, si alguien sabe que se trata de un problema conocido, házmelo saber. No pude encontrarlo en el rastreador de errores, pero la interfaz no es tan buena (o tal vez tengo esto mal).
2) ¿Por qué al final hay alguna diferencia? Supongo que thisx
se evalúa inmediatamente, lo que causa la excepción, mientras que this.x
es una referencia que se pasa y se evalúa en la función llamada, ¿verdad? (donde creo que la línea selector = selector || document
; es la culpable.
3) Sugerencias sobre cómo manejar esto? Supongo que debería verificar que cualquiera/cada elemento de referencia o propiedad de un objeto (por ejemplo, cadenas de selector almacenadas) se define antes de pasarlo a jQuery al eliminar algo.
Creo que se vuelve problemático cuando undefined se convierte en el elemento del documento. ¿Hay otros casos en que esto sea útil en jQuery? –
Hmm .... Me pregunto si se podría manejar mejor donde $ ('') se usa para ese caso. No es que lo cambien ahora por razones heredadas. Aún así, el código podría distinguir entre una cadena vacía y un valor indefinido. También podría verificar la longitud de los argumentos. Un valor indefinido aún tendría un arguments.length == 1, mientras que $() sería 0, ¿verdad? –
ah, buen punto. No pensé en la variable de argumentos. – cobbal