2010-08-28 33 views
6

Nếu tôi có một thẻ img nhưHiệu suất của việc cài đặt img src thành giá trị không thay đổi?

<img src="example.png" /> 

và tôi đặt nó thông qua

myImg.src = "example.png"; 

với giá trị tương tự một lần nữa, sẽ này là một không-op, hoặc trình duyệt sẽ không cần thiết vẽ lại hình ảnh? (Tôi chủ yếu quan tâm đến hành vi của IE6-8, FF3.x, Safari 4-5 và Chrome.)

Tôi cần thay đổi nhiều (hàng trăm) hình ảnh cùng một lúc và so sánh thủ công thuộc tính src có một chút không cần thiết - như tôi giả định, rằng trình duyệt đã làm điều này cho tôi?

+0

Hình ảnh lớn (về kích thước tải xuống) là bao nhiêu? Bạn sẽ thay đổi thuộc tính src bao lâu một lần? – Tim

+0

@Tim: Các hình ảnh có kích thước tải xuống nhỏ (chỉ là biểu tượng trạng thái) - nhưng thường sẽ không tải xuống, vì chúng hầu như đã được lưu vào bộ nhớ cache. Các hình ảnh sẽ được trao đổi trong một đợt, khi người dùng thực hiện một hành động nhất định - bản cập nhật sẽ càng nhanh càng tốt. –

Trả lời

4

Đừng cho rằng trình duyệt sẽ làm điều đó cho bạn. Tôi đang làm việc trên một dự án có quy mô tương tự đòi hỏi hàng trăm hình ảnh (động tải), với tốc độ là ưu tiên hàng đầu.

Việc lưu bộ đệm thuộc tính 'src' của mọi phần tử là rất khuyến khích. Giá trị là tốn kém để đọc và đặt hàng trăm thuộc tính phần tử DOMthậm chí đặt src thành cùng một giá trị có thể gây ra sự kiện reflow hoặc paint.

[Chỉnh sửa] Phần lớn sự chậm chạp trong giao diện là do tất cả các vòng lặp và quy trình của tôi. Một khi những người đã được tối ưu hóa, giao diện người dùng rất linh hoạt, ngay cả khi liên tục tải hàng trăm hình ảnh.

[Chỉnh sửa 2] Theo thông tin bổ sung của bạn (hình ảnh là tất cả các biểu tượng trạng thái nhỏ), có lẽ bạn nên xem xét đơn giản khai báo lớp cho từng trạng thái trong CSS của bạn. Ngoài ra, bạn có thể muốn xem xét sử dụng cloneNodereplaceNode để trao đổi rất nhanh chóng và hiệu quả.

[Chỉnh sửa 3] Hãy thử định vị hoàn toàn các yếu tố hình ảnh của bạn. Nó sẽ giới hạn số lượng reflow cần phải xảy ra, vì các phần tử được định vị hoàn toàn nằm ngoài luồng.

+0

Để chính xác hơn: tốn kém khi truy cập hàng trăm ** thành phần DOM ** trong JavaScript, đó vẫn là phần cổ chai của nhiều chương trình. –

+0

Rất đúng; Tôi đã cập nhật câu trả lời. – Tim

+0

@Tim: Cảm ơn, rất thú vị! Tôi đã nghĩ về caching thuộc tính src (hoặc trong trường hợp của tôi: sử dụng một số nguyên để nhớ trạng thái) - Tôi muốn tránh nó (nó phức tạp hơn), nhưng nếu đúng là thiết lập src thành một giá trị không thay đổi có thể gây ra một ** reflow **, sau đó tôi chắc chắn sẽ làm điều đó. Bạn có chắc chắn về reflow? –

2

Khi bạn thay đổi một loạt thành phần cùng một lúc, bạn thường chặn chuỗi giao diện người dùng, do đó chỉ có một lần vẽ lại sau khi hoàn tất JavaScript, nghĩa là vẽ lại trên mỗi hình ảnh thực sự không phải là yếu tố.

Tôi sẽ không kiểm tra lại bất cứ điều gì ở đây, hãy để trình duyệt chăm sóc nó, những cái mới đủ thông minh để làm điều này một cách hiệu quả (và nó chưa bao giờ thực sự là vấn đề lớn).

Trường hợp bạn sẽ thấy đây là hình ảnh mới tải và tái chảy trang khi họ tải, đó là gì đắt tiền ở đây, hình ảnh hiện đang rất nhỏ so với chi phí này.

+0

@Marcel - Nope ... "dp" nên đã được "tải", không thực sự chắc chắn làm thế nào tôi FUBARed rằng một ... cảm ơn cho bắt mặc dù! –

2

Tôi khuyên bạn nên sử dụng kỹ thuật CSS Sprite. Thông tin thêm tại: http://www.alistapart.com/articles/

Bạn có thể sử dụng hình ảnh chứa tất cả các biểu tượng. Sau đó thay vì thay đổi thuộc tính src, bạn cập nhật thuộc tính background.

+0

@Zafer: Cảm ơn bạn đã đề xuất. Tôi sợ rằng tôi không thể sử dụng điều đó, vì hình nền không quy mô khi người dùng thực hiện thay đổi kích thước văn bản (hình ảnh phải luôn có chiều cao chính xác là 1em). Hình nền không thể được chia tỷ lệ theo bất kỳ cách nào (với CSS 2.1). –

+0

@chris - Không đúng, ít nhất không có trong Firefox 3.6.8; hình mũi tên trên trang này * là hình nền và chúng co giãn khi phóng to và thu nhỏ. –

+0

@Marcel: Thu phóng trang thu phóng mọi thứ tất nhiên. Nhưng kiểm tra tùy chọn "View -> Zoom -> Zoom Text Only". Một số người dùng đã chọn tùy chọn đó (và đối với một số trình duyệt là mặc định.) –

Các vấn đề liên quan