2013-04-15 11 views
5

Próbuję uaktualnić dużą liczbę witryn w pracy z bardzo starych wersji jQuery (1.2.6, 1.4.3) do najnowszej wersji wersja (1.9.1). Sprawy idą całkiem nieźle - skrypt migracji wykonuje większość prac, chociaż to tylko od wersji 1.6.4 do 1.9.1, myślę, że mam większość innych zmian, które wymagają sortowania.Uaktualnienie jQuery, .attr i .prop - 1.2.6 do 1.9.1

Istnieje kilka problemów Zabrakło mi chociaż, z których głównym jest zmian od .attr() do .prop() - jak wszystkie nasze kod wykorzystuje .attr() i kilka przerw czy po prostu zmienić go używać .prop() w szczególności niektóre łącza używane do filtrowania produktów w sklepie - wywołują wywołania AJAX i po kliknięciu wykonują inne przetwarzanie.

Moja początkowa „fix” (w bardzo dużych powietrznych cudzysłowów) oparto na po prostu przekierowanie połączeń z jednego do drugiego:

$.fn.attr = $.fn.prop; 

Jestem pewien, że to wprowadza cały świat błędów, choć naprawiono to, co zostało początkowo zepsute. Od tego czasu zauważyłem tylko jeden dodatkowy błąd (jak dotąd), który powoduje, że atrybut href (który może być kotwicą rozpoczynającą się w #) powoduje zwrócenie pełnego znormalizowanego adresu URL - http://jsfiddle.net/eT6xE/1/

<a href="#something"><span>Product Details</span></a> 
<div></div> 

$('div').append($('a').attr('href')); 
$('div').append('<br />' + $('a').prop('href')); 
// #something \n http://fiddle.jshell.net/eT6xE/1/show/#something 

Biorąc pod uwagę, że jest to jedyny błąd, jaki zauważyłem, grałem trochę i wymyśliłem obejście tego problemu - http://jsfiddle.net/M92CE/1/ - które wydaje się działać w ponownym wprowadzaniu oryginalnej funkcjonalności. Mimo że wydaje się to dość czystym rozwiązaniem problemu href attr/prop, nie mogę oprzeć się wrażeniu, że początkowa poprawka jest ... o wiele mniejsza niż mogłaby być.

Czy istnieje "standardowy" sposób na ponowne wprowadzenie tej funkcji, a jeśli nie, czy jest jakiś lepszy sposób na zrobienie tego?

Pozdrawiam.

+0

Zrobiłbym coś podobnego, jeśli chodzi o nadpisywanie funkcji, ale zamiast wykonywać zadanie ze starego kodu do nowego, utworzyłbym specjalną funkcję, która: deleguje do nowej funkcji, dba o wszelkie zmiany zachowań, i Zgłasza także pewną formę ostrzeżenia o wycofaniu (na przykład za pomocą konsoli), aby kod klienta mógł zostać przesunięty ze starego podejścia. –

Odpowiedz

5

jQuery 1.9 wyjął dużo starszych cech, które były przestarzałe w poprzednich wersjach. Przechodząc od jQuery 1.2 do 1.9, jesteś prawie pewien, że trafiłeś ich całkiem sporo, jak już odkryłeś.

Na szczęście jQuery 1.9 ma bibliotekę towarzyszącą o nazwie jQuery Migrate ze względu na wsteczną kompatybilność ze starszymi wersjami, która przywraca wszystkie stare przestarzałe funkcje, które zostały usunięte w wersji 1.9.

Jeśli chcesz odzyskać stary kod z najnowszą wersją jQuery, użyj jQuery Migrate, aby go uruchomić.

Należy jednak pamiętać, że celem biblioteki Migrate jest ułatwienie przejścia na nowsze funkcje, aby nie pozostawić kodu zablokowanego w przeszłości. Użyj Migrate, aby kod działał, ale musisz zacząć od zmiany kodu, aby nie było potrzeby migrowania.

Zależnie od tego, ile masz kodu, może to być trochę pracy, ale posiadanie Migrate pozwala ci wprowadzać te zmiany jeden po drugim, zamiast naprawiać wszystko naraz.

Nadzieję, że pomaga.