JavaScript: Tôi có thể phát hiện IE9 nếu nó ở chế độ tương thích IE7 hoặc IE8 không?


87

Tôi cần biết liệu trình duyệt tự nhận dạng thông qua chuỗi tác nhân người dùng là IE7 hay IE8 thực sự là những trình duyệt đó hay đó là IE9 ở chế độ tương thích 7 hoặc 8.

Từ những gì tôi có thể thấy trong chuỗi tác nhân người dùng, IE9 ở chế độ tương thích IE7, cung cấp một chuỗi giống hệt với IE7 thực. Có một thuộc tính / phần tử / đối tượng bổ sung nào mà tôi có thể kiểm tra để xem nó có phải là IE9 "thực sự" đang ngụy trang không?

Tôi cho rằng chế độ tài liệu sẽ không giúp ích gì vì trang mà tập lệnh của tôi được tải vào có thể đang ép buộc hoặc buộc một cài đặt cụ thể.

Tôi hy vọng rằng IE9 sẽ có một số thuộc tính tồn tại và có thể kiểm tra được bất kể nó ở chế độ 7, 8 hay 9.


Đã chỉnh sửa để thêm…

Được rồi, tôi biết mình đã sai ở đâu. Tôi đang sử dụng trình đơn thả xuống "Chế độ trình duyệt" và chuyển nó sang IE8 và IE7 và nghĩ rằng đây là "chế độ tương thích IE8" và "chế độ tương thích IE7". Điều này tất nhiên là không đúng. Chế độ Trình duyệt của các công cụ dành cho nhà phát triển thực sự đang chuyển nó sang "giống" các trình duyệt cũ đó, vì vậy chỉ cần báo cáo các chuỗi hữu ích ban đầu là đúng.

Nếu tôi để chế độ trình duyệt tương thích với IE9 hoặc IE9 và thay vào đó thử các biến thể thả xuống của chế độ tài liệu, thì trên thực tế, tôi nhận được "Trident / 5.0" hiện diện trong tất cả 8 kết hợp (hai chế độ trình duyệt và 4 chế độ tài liệu). Tôi chỉ cần tránh chọn chế độ trình duyệt IE7 và IE8 vì chúng thực sự là (mô phỏng) IE7 và IE8.

Vì vậy, không có cách nào một trang, người dùng không phải nhà phát triển, thẻ meta hoặc danh sách tương thích của Microsoft có thể đặt IE9 vào trạng thái không thể xác định này.

Chỉ cần sử dụng if(navigator.userAgent.indexOf("Trident/5")>-1)sẽ là đủ.

Đừng lo lắng, điều này không dành cho kiểu, định dạng, logic hoặc nội dung trang. Tôi sử dụng tính năng phát hiện cho những thứ đó. Tôi chỉ cần phát hiện IE9 (bất kể nó đang ở chế độ nào) và đưa ra quyết định về nội dung không phải trang về điều đó.

Cảm ơn đã hướng tôi đến câu trả lời với các đề xuất và liên kết của bạn.


1
Không bao giờ tin tưởng vào tác nhân người dùng ... nó hoàn toàn có thể nói dối và không có cách nào để chắc chắn nếu nó nói sự thật hay không ... bạn nên kiểm tra cho các chức năng cụ thể hoặc tính năng thay
JCOC611

2
@ JCOC611 Có và không. Đây là một câu hỏi cụ thể làm thế nào để tìm ra liệu đó có phải là IE9 trong chế độ xem tương thích hay không, đây là một câu hỏi hợp lý. Nói chung, người ta không nên dựa vào chuỗi tác nhân người dùng cho chức năng của trang web vì người ta có thể dễ dàng giả mạo nó, thật.
Dennis G

1
Ngay cả khi tác nhân người dùng là chính xác, bạn vẫn nên sử dụng tính năng phát hiện nếu có thể. Sau đó, bạn không cần biết IE có ở chế độ tương thích hay không ngay từ đầu.
Dave Ward

1
Tôi chỉ muốn nói thêm rằng điều này rất hữu ích nếu bạn muốn cung cấp một hướng dẫn nhanh cho những người dùng đang sử dụng chế độ trình duyệt sai.
Joost

1
@ JCOC611 kẻ sẽ giả mạo tiện ích của họ và mong đợi mọi thứ hoạt động chính xác - chúng ta có thực sự quan tâm đến trường hợp đó không?
JohnnyFaldo

Câu trả lời:


67

Trên thực tế, chuỗi tác nhân người dùng khác với IE9 khi được chạy ở chế độ tương thích IE7, vì vậy đây sẽ là một trong những cách tốt nhất để phân biệt giữa các phiên bản IE khác nhau.

Giới thiệu Chuỗi tác nhân người dùng của IE9 :

Tương tự như IE8, Chế độ xem tương thích của IE9 sẽ ánh xạ tới Chế độ tiêu chuẩn của IE7 và chuỗi UA của IE9 khi ở Chế độ xem tương thích sẽ là:

Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Trident/5.0)

Trong Chế độ xem tương thích, IE9 tự báo cáo là IE7 thông qua số phiên bản ứng dụng (Mozilla / 4.0) và mã thông báo phiên bản (MSIE 7.0). Điều này được thực hiện để tương thích. Mã thông báo Trident tăng dần, từ 'Trident / 4.0' đến 'Trident / 5.0', cho phép các trang web phân biệt giữa IE9 đang chạy trong Compat View và IE8 chạy trong Compat View .

(nhấn mạnh do tôi thêm vào). Vì vậy, chuỗi tác nhân người dùng giống như nó tự báo cáo là "Mozilla / 4.0" và MSIE 7.0, nhưng IE9 sẽ luôn là Trident / 5.0 - bất kể nó nói là MSIE 7.0, MSIE 8.0 hay MSIE 9.0.

Trên thực tế, bạn nên xem bản biên dịch tuyệt vời này: Chuỗi ID trình duyệt (Tác nhân người dùng) hoặc thậm chí tốt hơn useragentstrings.com


1
Chào moontear. Tôi cũng thấy rằng "Trident / 5.0" được cho là xuất hiện khi IE9 ở chế độ IE7, nhưng đó không phải là những gì tôi thấy trên IE9 (cuối cùng) trên Win7 Pro x64. Nó hoàn toàn không hiển thị đinh ba ở chế độ IE7 (đó là IE7 thực trông giống như thế nào) và nó hiển thị đinh ba ở chế độ IE8 (một lần nữa, IE8 thực trông như thế nào). Tôi đang sử dụng các công cụ phát triển IE9 đầu tiên thả xuống để chọn chế độ trình duyệt và sau đó vào thanh địa chỉ cảnh báo javascript: alert (navigator.userAgent)
Dee2000

1
"Trident / 5.0" có trong chuỗi tác nhân người dùng của IE9 ở mọi chế độ.
EricLaw

Như EricLaw nói, Dee. Trident / 5.0 phải có mặt khi bạn đang sử dụng chế độ tương thích (có thể khác đối với chế độ trình duyệt?). Làm cách nào để bạn kiểm tra chuỗi tác nhân người dùng? Hãy thử kiểm tra qua whatsmyuseragent.com và báo cáo lại.
Dennis G

Xem phản hồi của tôi bên dưới (Tôi đã phải sử dụng id Dee2001 khác do quy tắc 8 giờ tràn ngăn xếp về việc thêm phản hồi vào thư của riêng bạn). Có Eric và Moontear đều đúng, Trident / 5.0 mặt trong tất cả các chế độ của IE9. Sai lầm lớn của tôi là thay đổi "Chế độ trình duyệt" thành IE7 hoặc IE8 trong công cụ dành cho nhà phát triển, nhưng đó không phải là "chế độ" mà trang / thẻ meta / danh sách tương thích có thể thực thi. Thay vào đó, nó thực sự mô phỏng chính các trình duyệt, vì vậy tự nhiên chuỗi sử dụng thực sự giống như IE7 / 8.
Dee2000

1
Đây là hoàn hảo! Cám ơn rất nhiều. Tôi không tạo kiểu dựa trên trình duyệt được báo cáo nhưng tôi đang thiết lập thanh cảnh báo ở đầu trang web mà tôi đang làm việc cho biết người dùng cần nâng cấp (nếu ví dụ các thẻ có điều kiện cho biết nó nhỏ hơn hoặc bằng ie7) - Tôi không muốn thông báo nói rằng hãy nâng cấp trong trường hợp này mà là vô hiệu hóa chế độ tương thích
Chelsea Urquhart

47

document.documentMode là cách tốt nhất cho chế độ tài liệu.


17
Hãy mở rộng câu trả lời một chút. Thêm ngữ cảnh.
random_user_name

3
Tại sao không phải là người plusing này, nó chính xác Whats cần thiết
Jamie Hutber

5
Đó quả thực là cách tốt nhất. Bạn có thể sử dụng nó theo cách này: <script> if (document.documentMode == 7) alert("Yo, put it in its normal mode, will ya?") </script>. IE7 thực (!) Và tất cả các IE không phải IE đều trả về 'không xác định', chỉ IE8 / 9 trong Phần. Chế độ trả về 7. Tôi không thể kiểm tra IE10, nhưng điều đó sẽ giống nhau.
Frank Conijn

2
Chỉ cần thử điều này trong IE10 ở một mặt có thẻ META cạnh; thông thường, nó trả về "10". Buộc bật chế độ tương thích cho tất cả các trang web và nó vẫn trả về "10".
Whelkaholism,

Công trình đối với tôi trong IE10 và IE11 Preview
Simon Giữ

20

IE7 không chứa bất kỳ thông tin nào về Trident

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0)

IE8 chứa chuỗi này: "Trident / 4.0"

User-Agent : Mozilla/4.0 (compatible; MSIE 8.0; Trident/4.0)

IE9 chứa chuỗi này: "Trident / 5.0"

IE9 ở chế độ tương thích:

User-Agent : Mozilla/4.0 (compatible; MSIE 7.0; Trident/5.0)

IE9 ở chế độ bình thường:

User-Agent : Mozilla/5.0 (compatible; MSIE 9.0; Trident/5.0)

1
Thật tuyệt, IE10 cũng có Trident gia tăng?
slotishtype

3
Internet explorer 10 người Trident / 6.0 .... thấy blogs.msdn.com/b/ie/archive/2012/07/12/...
slotishtype

1
và IE11 sử dụng Trident / 7.0
Dee2000


11

Tôi hy vọng rằng IE9 sẽ có một số thuộc tính tồn tại và có thể kiểm tra được bất kể nó ở chế độ 7, 8 hay 9.

Kiểm tra ví dụ: style.opacity , nó đã được giới thiệu trong IE9 và khả dụng bất kể chế độ tương thích:

<![if IE]> 
<script>
if(typeof document.documentElement.style.opacity!='undefined')
{
  //this must be at least IE9 
}
</script>
<![endif]>

1
Cảm ơn Dr.Molle, tôi sẽ thử và báo cáo lại.
Dee2000,

Thật không may, điều đó chỉ hoạt động cho Chế độ trình duyệt (trình đơn thả xuống bên trái trong công cụ dành cho nhà phát triển IE9). Nó không hoạt động cho chế độ Tài liệu (trình đơn thả xuống bên phải). Đối với chế độ tài liệu, nó chỉ hoạt động ở chế độ tài liệu IE9. Nếu nó ở chế độ IE8, IE7 hoặc Quirks, logic đó không thành công.
Dee2000

7
Chết tiệt, quyền của bạn. Tôi tìm thấy bất động sản khác, làm việc cho tôi trong mọi chế độ: window.performance
Dr.Molle

@ Dee2000: Nó cũng hoạt động với tôi với DocumentMode. Tức là CHỈ nếu DocumentMode = "Internet Explorer 9 tiêu chuẩn" thì thử nghiệm này thành công.
Niklas Bäckman

@ Dr.Molle cảm ơn vì điều này, window.performance thực hiện công việc tốt.
lewsid

3

Đôi khi cần đọc chuỗi Tác nhân người dùng từ Biến máy chủ, không phải từ đối tượng điều hướng javascript.

So sánh sự khác biệt:

  • ASP cổ điển, IE11

    • client javascript, Navigator.userAgent: " Mozilla / 5.0 (tương thích; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "

    • máy chủ ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 5.0 (Windows NT 6.1; WOW64; Trident / 7.0; BOIE9; ENUS; rv: 11.0) như Gecko "

  • ASP cổ điển, chế độ Tương thích IE11 :

    • client javascript, Navigator.userAgent: " Mozilla / 5.0 (tương thích; MSIE 9.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS)) "

    • máy chủ ASP, Request.ServerVariables ("HTTP_USER_AGENT"): " Mozilla / 4.0 (tương thích; MSIE 7.0; Windows NT 6.1; WOW64; Trident / 7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; BOIE9; ENUS) "


0

Từ https://stackoverflow.com/a/29288153/2879498

Giả sử bạn có một phần tử ẩn với cảnh báo so sánh ID:

Javascript w / jQuery:

$(function(){
    function showCompatWarning() {
        $('#compat-warning')
            .css('display','block')
            .css('height','auto')
            .show();
    }
    var tridentOffset = navigator.appVersion.indexOf('Trident/');
    if ( tridentOffset === -1 ) return;
    var jscriptVersion = 0;
    /*@cc_on @*/
    /*@if (@_jscript) jscriptVersion = @_jscript_version ; @*/;
    /*@end @*/
    var tridentVersion = parseInt(navigator.appVersion.substr(tridentOffset+8),10);
    var guessIEVersion = tridentVersion + 4;
    if (( document.documentMode && jscriptVersion && jscriptVersion < 10 && jscriptVersion !== document.documentMode ) ||
        ( document.compatMode && document.compatMode === 'BackCompat') ||
        ( document.documentMode && document.documentMode < 10 && document.documentMode != guessIEVersion ))
        showCompatWarning();
});

Phát hiện và cảnh báo, tuyến phòng thủ đầu tiên và cuối cùng của bạn chống lại địa ngục tương thích.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.