2009-04-25 46 views
11

Tôi đang cố gắng đặt một phản hồi lớn (200K) cho innerhtml của một nút. Mục đích là để có được thời gian tốt hơn so với 2,7 giây trong internet explorer 6. Bất kỳ ý tưởng ?,Các cách để tăng hiệu suất khi đặt giá trị lớn thành innerHTML

Cảm ơn

+0

Rất khó để nhận xét mà không biết bạn đang cố gắng làm gì và bạn sẽ làm thế nào. Đăng mã của bạn. –

+0

target.innerHTML = content; – user61873

+0

khó đăng tất cả mã .. nó thực sự rất lớn và trải rộng ở nhiều nơi của các lớp js ... nhưng phần ý nghĩa là – user61873

Trả lời

0

Tôi đã nghe nói rằng innerText nhanh hơn innerHTML trong IE khoảng hai lần. Tuy nhiên, không chắc chắn nó có đúng hay không, nhưng nó có thể đáng để thử.

if (window.ActiveXObject) { // we're using IE 
    document.getElementById('myElement').innerText = 'Bla bla bla bla'; 
    // or create a textnode: 
    var txt = document.createTextNode('Lorem ipsum'); 
    document.getElementById('myElement').appendChild(txt); 
} else { 
    // other code here 
} 

Cập nhật: Lưu ý rằng nếu bạn muốn thay đổi mã HTML của myElement, không sử dụng innerText - HTML sẽ hiển thị trong văn bản đơn giản, giống như nếu bạn đang sử dụng <>.

+0

Điều gì xảy ra nếu nó không chỉ là văn bản; đó có thể là đánh dấu HTML mà OP ban đầu muốn thêm. – James

+0

vâng, cần phân tích cú pháp thành số – user61873

16

Điều này sẽ không làm cho điều đó xảy ra nhanh hơn nhưng nó sẽ ngăn trình duyệt không khóa trên người dùng; họ có thể tiếp tục sử dụng trang trong khi điều này xảy ra trong nền:

function asyncInnerHTML(HTML, callback) { 
    var temp = document.createElement('div'), 
     frag = document.createDocumentFragment(); 
    temp.innerHTML = HTML; 
    (function(){ 
     if(temp.firstChild){ 
      frag.appendChild(temp.firstChild); 
      setTimeout(arguments.callee, 0); 
     } else { 
      callback(frag); 
     } 
    })(); 
} 

Sử dụng nó:

var allTheHTML = '<div><a href="#">.............</div>'; 
asyncInnerHTML(allTheHTML, function(fragment){ 
    myTarget.appendChild(fragment); // myTarget should be an element node. 
}); 

Kỹ thuật này sẽ mất nhiều thời gian hơn so với đồng bằng innerHTML nhưng người dùng sẽ có thể tiếp tục sử dụng trang web của bạn mà không nhận thấy sự chậm trễ.

+4

Xem thêm http://ejohn.org/blog/dom-documentfragments/ – Gumbo

+0

Nó không hoạt động với 'select' nếu cố gắng thêm tùy chọn vào phần tử chọn. –

5

Trước hết, tôi sẽ đảm bảo HTML của bạn đơn giản nhất có thể. Là đánh dấu cấu trúc tối thiểu nhất có thể. Sử dụng CSS ở mọi nơi, kể cả tính năng xếp tầng của nó để bạn không đặt thuộc tính lớp ở mọi nơi, v.v.

Sau đó, hãy thử nghiên cứu thêm về các phương pháp tốt nhất cho mỗi trình duyệt. Ví dụ, một số làm tốt hơn bằng cách xây dựng các đối tượng DOM, một số thiết lập tất cả nó vào innerHTML của một nút DOM không phải là cây, sau đó thêm nó vào cây, v.v. Tôi đề nghị bạn đọc Quirksmode.org's Benchmark - W3C DOM vs. innerHTML.

Bạn cũng sẽ muốn có thể sử dụng tập lệnh như JimmyP được đề xuất thêm vào các đoạn, do đó giao diện người dùng trình duyệt dường như không treo. Mặc dù, bạn không muốn chia nhỏ quá nhiều hoặc bạn sẽ không cần thiết kích hoạt quá nhiều lần làm mới trang khi bạn không cần chúng.

+1

Liên kết đẹp - bài đăng thú vị. –

+0

vâng, html rất phức tạp, thẻ 'mục tiêu' có 9 cấp độ cao. Tôi vừa mới nghĩ: sự kiện dom nào có thể gây ra cài đặt innerHTML? – user61873

+1

+1 liên kết và lời khuyên thú vị. – MikeJ

1

Tận dụng HTML như đơn giản càng tốt, hoặc sử dụng XML với các tên phần tử/thuộc tính ngắn nhất có thể.

Kiểu với CSS (Không sử dụng XML với XSLT, điều này có thể còn chậm hơn để phân tích cú pháp/xây dựng).

Việc xử lý XML trong các trình duyệt khác nhau không phải là không tương thích.

2

tại sao không mang phản hồi ở định dạng json và xử lý nó ở phía máy khách, ví dụ here một lượng lớn dữ liệu được điều khiển mỗi lần bạn thay đổi bất kỳ tùy chọn điều hướng nào.

1

Đảm bảo văn bản JSON/HTML/Plain của bạn đơn giản nhất có thể. Giải pháp đơn giản nhất là làm ít công việc hơn, nhưng nếu bạn thực sự cần truyền 200k, hãy đảm bảo việc truyền tải đến trình duyệt được nén, có thể định cấu hình trong ứng dụng và/hoặc máy chủ web của bạn. Gzip'ping nội dung (giả sử bạn đang sử dụng một dịch vụ AJAX thân thiện) thực sự giúp đỡ, đặc biệt là với văn bản đơn giản.

Nhìn vào những thứ khác như bất kỳ vòng lặp nào có thể đơn giản, v.v., nhưng có vẻ như đảm bảo dữ liệu sẵn sàng và đảm bảo rằng dữ liệu có thể được gửi qua dây hiệu quả sẽ là trợ giúp nhiều nhất.

Nếu IE là ngoại lệ và tất cả các trình duyệt khác hoạt động tốt, bạn có thể cần phải tiếp tục. Chỉ có rất nhiều bạn có thể làm, nhưng tôi nghi ngờ nó không phải là vấn đề chính.

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