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.
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. –