2010-07-07 16 views
7

html

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

jQuery

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

powyżej kodów jest w porządku i działa. możesz to poczuć here.czy to błąd? Proszę to sprawdzić

Teraz spróbuj tego

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

w FF 3.6, daje błąd na konsoli

nieprawidłowy lub nielegalny łańcuch został określony "kod:" 12
elem [name] = wartość;

i div jest nadal edytowalny.

Podejrzewałem, że jest to selektor jQuery, ale nie jest. Przez dalszą inspekcję był to argument przekazany na .removeAttr('contentEditable');. Działa, gdy wszystkie małe litery. Więc pomyślałem, że powinny to być wszystkie małe litery. Jestem ciekawy, więc próbowałem dodać CLass jako atrybut i zrobić .removeAttr('CLass');. Ale działa bezbłędnie.

Dlaczego więc contentEditable daje mi ten błąd?


aktualizacja

od Kobi, wydaje się, że faktycznie ponosi żadnej sprawy z wyjątkiem, contentEditable (Próbowałem też).

CamelCase

+0

Czy to HTML5 doctype lub XHTML ? – airmanx86

Odpowiedz

2

Tu nie chodzi o małe litery, ale o dokładnym obudowy. Każda inna obudowa niż contentEditable działa, na przykład: removeAttr('ConTentEditable');.
Nie mogę znaleźć dokładnego źródła problemu, domyślam się, że jest to ograniczenie przeglądarki Firefox.

Wydaje się, że jQuery sets the attribute to an empty string przed usunięciem, co jest przyczyną błędu. To wydaje się lepiej pracować:

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

Można nazwać to bug, ale naprawdę ramy została zaprojektowana w ten sposób. removeAttr, wraz z innymi funkcjami attr, wskazuje na jQuery.attr(), aby ustawić wartość atrybutu. Po ustawieniu atrybutu na "", następnie próbuje go usunąć. Kod dla attr() szczególności sprawdza, czy dany ciąg jest nazwa właściwości na obiekt pierwszym użyciem operatora in:

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

(z jQuery 1.4, zgodne 1452-1453)

Skoro jesteś dostarczając nazwę właściwości camelCase, używa jej zamiast elem.setAttribute(), co jest konkretnie przyczyną problemu.W każdym innym przypadku name in elem zwróci wartość false (ponieważ w nazwach właściwości rozróżniana jest wielkość liter), dlatego jest to skuteczne. jQuery robi to głównie w celu obejścia problemów z przeglądarką internetową pod numerem setAttribute().

Wygląda na to, że Firefox ma problem z ustawieniem właściwości na pusty ciąg znaków, chyba że masz taki sam problem w innych przeglądarkach. Możesz spróbować zgłosić błąd na stronie jQuery lub MDC.

+2

+1. Ze względu na tradycyjne błędy IE, funkcje 'attr' jQuery próbują ukryć różnicę między atrybutem HTML (" contenteditable ") i własnością DOM (" contentEditable "). Z mylącymi wynikami, jak zwykle, gdy starasz się ukryć ważną różnicę. – bobince

0

contentEditablenieruchomość (nie atrybutów, ponieważ nie jest to, co attr() i przyjaciele zazwyczaj do czynienia z) spodziewa się wartość ciągu, jeden z „true” , "false" i "dziedziczą". Nie chciałbym używać jQuery wyłączyć contentEditable, ale wyobrażam sobie, co następuje będzie działać:

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

Albo można ominąć jQuery ustalania rzeczywistej contentEditable właściwość:

$('[contenteditable]').each(function() { 
    this.contentEditable = "false"; 
}); 
Powiązane problemy