2009-08-31 20 views
8

kod tutaj nie zwraca czego oczekuje:Czy JQuery (...). Html() buggy w jQuery 1.3.2?

jQuery('<div>Look here: [ jQuery0="null" ]</div>').html() 

Raczej masz:

Look here: [ ] 

Kod źródłowy jQuery w pytaniu:

html: function(value) { 
     return value === undefined ? 
       (this[0] ? 
         this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : 
         null) : 
       this.empty().append(value); 
}, 

Jaka byłaby motywacja za .replace? Nie mam czasu, aby przejrzeć resztę jQuery, ale taki kod sprawia, że ​​zastanawiam się, czy w ogóle powinienem używać jQuery do produkcji.

Odpowiedz

4

Ten kod jest nowy w wersji 1.3.2, nie był w wersji 1.3.1. Wygląda mi na to, że jQuery używa atrybutów, których nazwy zaczynają się od "jQuery" do przechowywania danych na elementach, i to jest sposób, aby nie ujawniać tego, gdy poprosisz o html.

Oczywiście nie jest to błąd. Autor chciał usunąć ten kod HTML, zanim zwróci ci ciąg znaków.

Czy ma to wpływ na kod? Podobnie jak w przypadku każdej biblioteki, przed wdrożeniem należy dokładnie przetestować swój kod produkcyjny.

+1

To prawda, nie ma to jeszcze wpływu na mój kod, ale łamie on niezmiennik 'x.html (y) .html() == y', który wywołuje dzwonek alarmowy. Dziękuję za informację, kiedy to zostało wprowadzone. Masz rację, to nie błąd, ale wątpliwa decyzja projektowa. – t0yv0

11

Jaka byłaby motywacja .replace?

Aby ukryć atrybuty używane przez jQuery do wewnętrznych celów.

Kod taki sprawia, że ​​zastanawiam się, czy w ogóle powinienem używać jQuery do produkcji.

Tak, miałem dokładnie taką samą reakcję. Jest po prostu niesamowicie niechlujny. Próba przetworzenia kodu HTML za pomocą regexp jest rodzajem naiwnego hacka, jakiego oczekujesz od pierwszych plakatów pytań, a nie tego rodzaju zachowania, które miałbyś nadzieję zobaczyć w ramach tak wielu użytkowników SO wydaje się czcić.

To nie jedyne miejsce, w którym jQuery uruchamia się, próbując analizować znaczniki za pomocą regex; niektóre elementy selektora też są uszkodzone. Mogą to być niejasne przypadki narożne, ale dla mnie jest to ogromna czerwona flaga wskazująca na niewłaściwe podejście.

+4

Nawiasem mówiąc, jest łatwa do rozwiązania. IE zawiera tylko właściwości expando w serializacji 'innerHTML', gdy ich wartości są prostymi typami jak' String' i 'Number'. Inne obiekty, takie jak Tablica, nie pojawiają się. Więc wszystko, co jQuery musi zrobić, to ustawić 'node [expando] = [uuid];' zamiast 'node [expando] = uuid;' i całe to bezsensowne przetwarzanie wyrażeń regularnych może zniknąć. – bobince

+0

Czy kiedykolwiek powiedziałem wam, jak bardzo was kocham? :-P Jesteś bogiem nieczytelnych poprawek IE, czy coś w tym stylu. –