2012-12-11 30 views
43

Tôi muốn tải trong mã JavaScript sau bằng cả hoãn và async:Bạn có thể sử dụng cả thuộc tính async và trì hoãn trên thẻ tập lệnh HTML không?

<script defer async src="/js/somescript.js"></script>

Từ Hoãn được hỗ trợ bởi Internet Explorer 5.5+, như bạn có thể nhìn thấy ở CanIUse.com, tôi muốn một cách duyên dáng dự phòng để sử dụng hoãn nếu async không khả dụng. Không đồng bộ, tôi nghĩ tốt hơn nên sử dụng khi có sẵn nhưng không được hỗ trợ cho đến khi Internet Explorer 10.

Do đó, câu hỏi của tôi là mã HTML hợp lệ ở trên? Nếu không, liệu có thể tạo ra tình huống này bằng cách sử dụng JavaScript một cách duyên dáng để quay lại sử dụng trì hoãn trên một tập lệnh khi không có sẵn đồng bộ không?

Trả lời

75

Từ đặc điểm kỹ thuật: https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async

Thuộc tính Hoãn thể được chỉ định ngay cả khi các thuộc tính async được chỉ định, gây ra trình duyệt cũ Web mà chỉ hỗ trợ Hoãn (và không async) để rơi trở lại hành vi Hoãn thay vì hành vi chặn đồng bộ là mặc định.

+9

+1 để tìm hiểu thông số W3C –

+0

Điều đó có đúng không ?: 1.both 'async' 'defer' tồn tại, các trình duyệt hiện đại chạy dưới dạng' async'; 2.both 'async' 'defer' tồn tại, các trình duyệt cũ chạy dưới dạng' trì hoãn' thay vì hành vi 'mặc định' – vikyd

8

Có, HTML hợp lệ của nó và nó sẽ hoạt động như mong đợi.

Bất kỳ W3C phù hợp trình duyệt sẽ nhận ra async thuộc tính và đối xử với kịch bản đúng cách, trong khi di sản IE phiên bản sẽ nhận ra Hoãn thuộc tính.

Vì cả hai thuộc tính là boolean bạn không phải gán bất kỳ giá trị nào.

+0

Cảm ơn @jandy cho một phản ứng tuyệt vời! –

+1

"... sẽ hoạt động như mong đợi". Những gì bạn sẽ mong đợi nó để làm gì? –

4

Câu hỏi đặt ra là, bạn mong đợi điều đó sẽ làm gì? Nếu cả hai asyncHoãn có mặt tôi mong chờ kịch bản để được hoãn lại và chỉ được thực hiện sau khi DOMContentLoaded khi trình duyệt là nhàn rỗi, nhưng nếu tôi đang đọc thông số kỹ thuật đúng nó trông giống như Hoãn được bỏ qua nếu async được đặt và tập lệnh được tải không đồng bộ, vì vậy sẽ thực thi ngay khi có sẵn, có thể trước DOMContentLoaded và có thể chặn các tài nguyên khác.

Có ba chế độ có thể được chọn bằng cách sử dụng các thuộc tính này. Nếu thuộc tính async xuất hiện, thì tập lệnh sẽ được thực thi không đồng bộ, ngay khi nó có sẵn. Nếu thuộc tính async không có mặt nhưng thuộc tính defer là hiện tại, thì kịch bản lệnh được thực hiện khi trang đã hoàn tất phân tích cú pháp. Nếu không có thuộc tính nào, thì tập lệnh sẽ được tìm nạp và thực hiện ngay lập tức, trước khi tác nhân người dùng tiếp tục phân tích cú pháp trang.

https://www.w3.org/TR/2011/WD-html5-20110525/scripting-1.html#attr-script-async

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