2010-07-07 7 views
7

html

<div contentEditable="true">testing....</div> 

jQuery

$(document).ready(function(){ 
    $('[contenteditable]').removeAttr('contenteditable'); 
}); 

por encima de códigos está bien y trabajando. puedes sentirlo here.¿es esto un error? Por favor, echa un vistazo

Ahora, intente esto

$('[contentEditable]').removeAttr('contentEditable'); 
// notice the CamelCase of the string contentEditable 

en FF 3.6, se da un error en la consola

una cadena no válida o ilegal se especifica "código:" 12
elem [nombre] = valor;

y el div aún se puede editar.

Sospeché que era el selector jQuery, pero no lo es. Por inspección adicional, fue el argumento pasado en el .removeAttr('contentEditable');. Funciona cuando todas las letras pequeñas. Entonces, pensé que deberían ser todas letras pequeñas. Tengo curiosidad así que traté de agregar CLass como un atributo y hacer .removeAttr('CLass');. Pero luego funciona sin error.

Entonces, ¿cómo es que contentEditable me está dando ese error?


actualización

de Kobi, parece que en realidad acepta ningún caso, excepto, contentEditable (Yo probé también).

CamelCase

+0

Es este tipo de documento HTML 5 o XHTML ? – airmanx86

Respuesta

2

No se trata de letras pequeñas, sino de la carcasa exacta. Cualquier otra carcasa que no sea contentEditable funciona, por ejemplo: removeAttr('ConTentEditable');.
No puedo encontrar la fuente exacta del problema, supongo que es una restricción de Firefox.

Parece jQuery sets the attribute to an empty string antes de eliminarlo, que es lo que está causando el error. Esto parece funcionar mejor:

$('[contentEditable]').attr('contentEditable', false); 
2

Podría llamarlo un error, pero realmente el marco está diseñado de esta manera. removeAttr, junto con otras funciones attr, apunta a jQuery.attr() para establecer el valor del atributo. Después de establecer el atributo en "", intenta eliminarlo. El código para attr() comprueba específicamente para ver si la cadena dada es un nombre de propiedad sobre el objeto por primera vez el operador in:

// If applicable, access the attribute via the DOM 0 way 
if (name in elem && notxml && !special) { 

(de jQuery 1.4, la línea 1452-1453)

Ya que estás suministrando el nombre de la propiedad camelCase, usa eso en lugar de elem.setAttribute(), que es específicamente la causa del problema.Para cualquier otro caso, name in elem devolvería falso (porque los nombres de propiedad son sensibles a las mayúsculas y minúsculas), por lo que es exitoso en ese momento. jQuery lo hace principalmente para solucionar problemas de navegador cruzado con setAttribute().

Parece que Firefox tiene un problema al configurar la propiedad en una cadena vacía, a menos que tenga el mismo problema en otros navegadores. Podría tratar de presentar un error en el sitio jQuery o MDC.

+2

+1. Debido a los errores tradicionales de IE, las funciones 'attr' de jQuery intentan ocultar la diferencia entre un atributo HTML (' contenteditable') y una propiedad DOM ('contentEditable'). Con resultados confusos, como de costumbre cuando tratas de ocultar una diferencia importante. – bobince

0

El contentEditablepropiedad (no atribuyen, ya que no es lo attr() y amigos suelen tratar con) espera un valor de cadena, una de "verdad" , "falso" y "heredar". Yo no usaría jQuery para apagar contentEditable, pero imaginar la siguiente funcionaría:

$('[contenteditable]').attr("contentEditable", "false"); 

o usted podría pasar por alto jQuery para establecer la propiedad real contentEditable:

$('[contenteditable]').each(function() { 
    this.contentEditable = "false"; 
}); 
Cuestiones relacionadas