Có một số câu hỏi hỏi về các đối tượng jQuery trong bộ nhớ đệm nhưng tôi không thể tìm thấy một đối tượng nào hỏi chính xác đối tượng jQuery có thể ở đâu và nên được lưu trong bộ nhớ cache. Tôi có một trang web có một tệp JavaScript duy nhất với một loạt các chức năng như được hiển thị bên dưới.Tôi nên lưu các kết quả bộ nhớ cache của các truy vấn jQuery DOM ở mức nào?
$(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
}
Trong myFunctionOne
Tôi không hiệu quả truy vấn DOM hai lần trong khi ở myFunctionTwo
tôi truy vấn DOM một lần, bộ nhớ cache kết quả trong một biến địa phương, sau đó làm việc với biến đó. Tôi hiểu rằng cách tiếp cận trong myFunctionTwo
hiệu quả hơn nhưng tôi không chắc chắn về nơi tôi thực sự nên lưu vào bộ nhớ cache các đối tượng đó. Tại thời điểm tôi đang lưu bộ nhớ đệm đối tượng ở cấp phương thức nhưng tôi tự hỏi liệu tôi có thể thực sự lưu nó ở mức cao hơn và sau đó sử dụng nó trên nhiều hàm. Bằng cách này tôi sẽ chỉ truy vấn DOM một lần và sau đó sử dụng lại kết quả trong tất cả các hàm trong tệp này. Một ví dụ về những gì tôi đang đề xuất được hiển thị dưới đây.
$(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
}
Cách tiếp cận này có hợp lý hoặc có cách nào tốt hơn để thực hiện? Có lẽ bằng cách sử dụng chức năng .ready là một nơi tồi tệ để làm điều này loại thiết lập vì nó sẽ làm chậm tải trang? Có cách nào khác để cache các đối tượng jQuery ở mức đối tượng hay chúng chỉ được lưu trữ ở mức chức năng?
Tôi đồng ý với quan điểm của bạn rằng điều quan trọng là không tối ưu hóa sớm, và trong trường hợp của tôi không sớm.Tôi thấy các vấn đề về hiệu suất trong IE8 và trong nỗ lực khắc phục điều này, chúng tôi đang xem xét một số các phương pháp hay nhất được đề xuất cho jQuery, một trong số đó là bộ nhớ đệm. Tôi dự định sử dụng bộ đệm ẩn cục bộ ở mức tối thiểu và bộ nhớ đệm giữa các phương thức nếu có thể. Bạn nói, "Caching giữa các phương thức sẽ tốn nhiều hơn về mã phức tạp hơn bộ nhớ đệm cục bộ". Bạn có thể giải thích về điều này, vì điều này có thể giúp trả lời câu hỏi ban đầu của tôi? – user2088756