2009-08-03 30 views
8

Đây thường là cách tôi quản lý nâng cao tiến bộ trong khi vẫn giữ được trải nghiệm sạch sẽ, nhưng mức độ an toàn là như thế nào? có tiềm năng cho một điều kiện chủng tộc và điều này không hoạt động?Có ổn không khi thao tác dom trước trạng thái sẵn sàng?

Hãy tưởng tượng kịch bản trừu tượng đơn giản, bạn muốn hiển thị một cái gì đó khác đi nếu bạn có hỗ trợ javascript .. này nói chung là những gì tôi sẽ kết thúc thực hiện:

<div id="test">original</div> 
<script type="text/javascript"> 
    var t = document.getElementById('test'); 
    t.innerHTML = 'changed'; 
</script> 

Nhiều có thể yêu cầu bạn nên sử dụng một khuôn khổ và chờ đợi cho một sự kiện domready, và làm thay đổi ở đó .. tuy nhiên có một sự chậm trễ đáng kể, nơi các 'thử nghiệm' phần tử sẽ đã được rendered trước khi kết thúc của tài liệu và css đã sẵn sàng và một domready gây nên .. do đó gây ra một flicker đáng chú ý của 'original'.

Mã này có phải chịu trách nhiệm đối với các lỗi điều kiện chủng tộc không? hoặc tôi có thể bảo đảm rằng một phần tử có thể phát hiện và sửa đổi được nếu nó tồn tại trước tập lệnh không?

Xin cảm ơn trước.

Trả lời

5

Bạn có thể, nhưng có những vấn đề xung quanh làm việc đó. Trước hết, trong IE nếu bạn cố gắng thao tác một nút chưa được đóng (ví dụ BODY trước thẻ đóng nằm dưới JS của bạn), bạn có thể gặp lỗi "OPERATION ABORTED" của IE, điều này sẽ dẫn đến Trang trống. Thao tác nút bao gồm các nút phụ, nút di chuyển, v.v.

Trong các trình duyệt khác, hành vi không xác định, tuy nhiên chúng thường hoạt động như bạn mong đợi. Vấn đề chính là khi trang của bạn phát triển, trang có thể tải/phân tích cú pháp/chạy khác nhau. Điều này có thể khiến một số tập lệnh chạy trước khi trình duyệt xác định các phần tử được tham chiếu đã thực sự được tạo và tạo sẵn cho thao tác DOM.

Nếu bạn đang cố gắng nâng cao hiệu suất nhận thức của người dùng của bạn (tức là sự cố). Tôi đặc biệt khuyên bạn nên tránh con đường này và xem xét làm sáng các trang của bạn. Bạn có thể sử dụng YSlow/Firebug Hiệu suất Trang của Google để giúp bạn bắt đầu.

Google's Page Speed

Yahoo's YSlow

+0

Hi Raegx, vâng tôi hoàn toàn có thể hiểu được vấn đề hủy bỏ hoạt động với các yếu tố thay đổi mà đã bị đóng .. trong điều khoản của snappiness, các trang này là ánh sáng, trang thực tế là 15kb .. cũng có thể ở ngay dưới thẻ body mở, và nó S render render trước khi đám cháy của domready, bất kể trang của tôi nhẹ đến mức nào .. Tôi đang cố tránh một trải nghiệm cẩu thả đó là luôn luôn có kinh nghiệm imo với domready và làm những điều này. – meandmycode

+0

Trở lại trong thời đại đen tối, khi chúng tôi không có cách duyệt ngang trên trình duyệt để chạy trên DomReady, chúng tôi đã sử dụng onLoad, nó được kích hoạt sau khi tất cả hình ảnh/css/etc được tải và hiển thị. Bây giờ chúng ta có onDomReady sẽ kích hoạt sau khi DOM được phân tích cú pháp và biểu diễn, nhưng có khả năng trước hình ảnh/etc. Đây cũng là một tiến bộ tương đối mới. Vì vậy, chờ đợi OnDomReady là tất cả những gì chúng tôi có tại thời điểm này và giải pháp tốt nhất cho sự vững mạnh của nó. Nếu bạn tin rằng thao tác của bạn trước khi onDomReady đáng giá và bạn không thể thêm/tạo/di chuyển các nút đến các nút không được khép kín thì có lẽ bạn đã ổn. –

+0

Tuyệt vời, nó chắc chắn giá trị nó nếu nó hoạt động .. từ những gì tôi nghe, nó sẽ làm việc tốt nhưng theres không có gì chính thức nói rằng một phần tử nên sẵn sàng sau khi nút đóng của nó. – meandmycode

3

Bạn có thể thao tác DOM trước khi nó được tải đầy đủ, nhưng nó có thể nguy hiểm. Bạn rõ ràng không thể đảm bảo rằng bit của DOM bạn đang cố gắng thao tác thực sự tồn tại, vì vậy mã của bạn có thể không liên tục.

+0

Cảm ơn rikh, những gì bạn có nghĩa là theres không có bảo lãnh, bởi đặc điểm kỹ thuật hoặc bằng thực tế thực tế của sản phẩm mà tồn tại ngày nay (ff, tức là, opera vv) .. Tôi sẽ nghĩ rằng trình phân tích cú pháp hoạt động tuyến tính và thêm các phần tử khi nó gặp nút đóng của chúng.trong khi điều này có thể không phải là một đặc điểm kỹ thuật, tôi sẽ nghĩ rằng đây là một hành vi hợp lý, và đã được tìm kiếm nhiều hơn để tìm ra câu trả lời authoritize rằng đây là trường hợp. – meandmycode

+1

Thành thật mà nói, tôi không biết, nhưng đó không phải là điều tôi muốn phụ thuộc. Nếu bạn thực sự lo lắng về thông tin sai được hiển thị, hãy thử hiển thị không có gì ban đầu, và sau đó điền vào một cái gì đó trên doc đã sẵn sàng, hoặc đơn giản là thiết kế vấn đề ra khỏi hệ thống, vì vậy bạn không cần phải làm những gì bạn đang yêu cầu. –

+0

Thật không may, ví dụ cuối cùng là nơi chúng tôi hiển thị số trang là siêu liên kết và javascript của chúng tôi sẽ thay đổi để chúng tôi có thể hiển thị 'Trang x của y' và đánh dấu siêu liên kết trang đang hoạt động (các trang là anchors) .. đây là một kịch bản tăng cường tiến bộ điển hình, nơi chúng tôi render ra một cái gì đó sẽ làm việc mà không có javascript .. và sau đó đánh chặn và sửa đổi nó với javascript để sử dụng javascript .. thực tế bạn có thể thao tác nó với javascript sau đó chứng minh bạn. có hỗ trợ javascript;) – meandmycode

1

Chừng nào bạn chỉ sửa đổi các nút mà preceed khối kịch bản (tức là thẻ đóng của nút preceeds thẻ mở của kịch bản), bạn không nên gặp bất kỳ vấn đề.

Nếu bạn muốn đảm bảo thao tác thành công, hãy bọc mã trong khối try...catch và gọi lại lần nữa qua số setTimeout() khi không thành công.

+0

Cảm ơn Christoph, tôi đã xem xét rằng khi thất bại tôi sẽ không nhận được gì hoặc ngoại lệ và có thể thử lại .. mặc dù tôi không thích logic thử lại như vậy, tôi lo rằng việc thực thi có thể gây trở ngại cho hiệu suất tải trang. sẽ xem liệu tôi có thể chạy một số thử nghiệm bằng cách cố gắng mô phỏng băng thông có độ hạn chế cao và thậm chí sức mạnh xử lý thấp để xem liệu tôi có thể tìm thấy bất kỳ cửa sổ nào tồn tại không .. cho đến nay băng thông không xuất hiện để làm bất cứ điều gì, tôi đã chạy lặp lại của trang tải ở 100 byte một giây (phải mất một lúc) .. và do thời gian khu vực đã tải nó đã ... – meandmycode

+0

.. thực hiện kịch bản hoàn toàn tốt đẹp .. Tôi tưởng tượng hạn chế thời gian xử lý có nhiều khả năng làm tê liệt trình phân tích cú pháp và chiếu sáng bất kỳ cửa sổ nào mà giả định là sai. – meandmycode

0

Trong Viajeros.com Tôi có chỉ báo tải hoạt động từ 8-9 tháng và tôi không gặp sự cố nào cho đến thời điểm này. Nó trông giống như thế này:

<body> 

<script type="text/javascript"> 
    try { 
     document.write('<div id="cargando"><p>Cargando...<\/p><\/div>'); 
     document.getElementById("cargando").style.display = "block"; 
    } catch(E) {}; 
</script> 
+2

Có lẽ đó không phải là tất cả các mã, nhưng bạn nhận ra rằng 'getElementById' là hoàn toàn không cần thiết, phải không? Bạn chỉ có thể thêm 'style =" display: block "' vào HTML. – DisgruntledGoat

-1

Truy cập DOM sớm ném ngoại lệ trong IE 5 và Navigator 4.

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