Istnieje kilka pytań, które pytają o buforowanie obiektów jQuery, ale nie mogę znaleźć takiego, które pyta, gdzie dokładnie obiekty jQuery mogą i powinny być buforowane. Mam stronę internetową, która ma pojedynczy plik JavaScript z wieloma funkcjami, jak pokazano poniżej.Na jakim poziomie należy buforować wyniki kwerend DOM jQuery?
$(document).ready(function() {
// do some setup
});
/* function queries the DOM with the same selector multiple times without caching */
function myFunctionOne() {
$('#name_input').css("border","1px solid #ccc");
$('#name_input').val(someValue);
}
/* function uses cached object from a single query */
function myFunctionTwo() {
var nameInput = $('#name_input')
nameInput.css("border","1px solid #ccc");
nameInput.val(someValue);
// do some other stuff with cached selector
}
W myFunctionOne
I nieefektywnie zapytania DOM dwa razy, podczas gdy w myFunctionTwo
kwerendy DOM raz, buforuje wynik w zmiennej lokalnej, a następnie pracować z tej zmiennej. Rozumiem, że podejście w myFunctionTwo
jest bardziej wydajne, ale nie jestem pewien, gdzie faktycznie powinien być buforowanie tych obiektów. Z chwilą buforowania obiektu na poziomie metody, ale zastanawiam się, czy mogę faktycznie buforować go na wyższym poziomie, a następnie używać go w wielu funkcjach. W ten sposób zapytałbym DOM tylko raz, a następnie wykorzystałbym wynik we wszystkich funkcjach w tym pliku. Przykład tego, co sugeruję, pokazano poniżej.
$(document).ready(function() {
// do some setup
var nameInput = $('#name_input')
});
/* function uses cached query result from .ready function above */
function myFunctionOne() {
nameInput .css("border","1px solid #ccc");
nameInput .val(someValue);
}
/* function uses cached query result from .ready function above */
function myFunctionTwo() {
nameInput.val(someValue);
// do some other stuff with cached selector
}
Czy to podejście jest rozsądne, czy jest lepszy sposób na zrobienie tego? Być może używanie .ready jest złym miejscem do zrobienia tego rodzaju instalacji, ponieważ spowalnia to ładowanie strony? Czy istnieje alternatywny sposób buforowania obiektów jQuery na poziomie obiektu lub czy powinny one być buforowane tylko na poziomie funkcji?
Zgadzam się z twoim punktem, że ważne jest, aby nie optymalizować go przedwcześnie, aw moim przypadku nie jest to przedwczesne.Widzę problemy z wydajnością w IE8 i próbując to naprawić, patrzymy na niektóre z zalecanych najlepszych praktyk dla jQuery, z których jednym jest buforowanie selektorów. Mam zamiar używać co najmniej buforowania lokalnego i buforowania między metodami, jeśli to możliwe. Powiedziałeś: "Przechowywanie pomiędzy metodami będzie kosztować więcej w złożoności kodu niż lokalne buforowanie". Czy możesz to wyjaśnić, ponieważ może to pomóc w odpowiedzi na moje oryginalne pytanie? – user2088756