Cách tốt nhất để kiểm tra IE dưới 9 trong JavaScript mà không có thư viện


76

Cách nhanh nhất, ngắn nhất (tốt nhất) của bạn để phát hiện trình duyệt là IE và phiên bản nhỏ hơn 9 trong JavaScript mà không cần sử dụng jQuery hoặc bất kỳ thư viện tiện ích bổ sung nào?


Tôi hoàn toàn biết về các điều kiện trong DOM. Chỉ quan tâm đến một giải pháp JavaScript nhỏ hoạt động tốt nhất.
bcm

5
Đừng quên rằng tính năng phát hiện là điều đáng tin cậy nhất khi bạn muốn sử dụng một tính năng dành riêng cho phiên bản (Tuy nhiên, tính năng này có thể tồn tại nhưng có lỗi trong một số phiên bản, hãy ghi nhớ điều này). Nếu bạn muốn hiển thị phiên bản trình duyệt trên trang, hãy sử dụng tính năng phát hiện trình duyệt .
Dan

3
Tôi đồng ý với Dan, nhưng trên thực tế, thường không dễ hiểu và / hoặc dễ dàng đối với tất cả mọi người để gắn một sự khác biệt cụ thể vào một tính năng (phát hiện). Ngay cả khi đúng như vậy, mã có thể dễ đọc hơn khi nó giống như câu trả lời được cung cấp (ví dụ: tức là <9).
bcm

Câu trả lời:


117

Javascript

var ie = (function(){

    var undef,
        v = 3,
        div = document.createElement('div'),
        all = div.getElementsByTagName('i');

    while (
        div.innerHTML = '<!--[if gt IE ' + (++v) + ']><i></i><![endif]-->',
        all[0]
    );

    return v > 4 ? v : undef;

}());

Sau đó, bạn có thể làm:

ie < 9

Của James Panolsey từ đây: http://james.padolsey.com/javascript/detect-ie-in-js-using-conditional-comments


2
chỉ tự hỏi ... tất cả những thứ này (div, all) chỉ nằm trong bộ nhớ hay là DOM thực sự được truy cập nhiều lần để lấy phiên bản?
bcm

Nó chỉ nằm trong bộ nhớ, div mà nó tạo ra không thực sự được thêm vào DOM.
Mike Lewis

5
Hmm, đây có phải là whilecú pháp thông thường không? Hay một số loại hack?
Tim Büthe

13
@ TimBüthe: Toán tử dấu phẩy . Về cơ bản, nó thêm HTML bên trong và trả về all[0](cái đầu tiên <i>trong div). Miễn là kết quả là "đúng" (an <i>được tìm thấy), nó sẽ chuyển sang phiên bản IE và tiếp tục.
Brad Christie


99

cho những gì nó có giá trị:

    if(  document.addEventListener  ){
        alert("you got IE9 or greater");
    }

Điều này nhắm mục tiêu thành công IE 9+ bởi vì addEventListenerphương pháp này đã được hỗ trợ từ rất sớm cho mọi trình duyệt chính trừ IE. (Chrome, Firefox, Opera và Safari) Tham khảo MDN . Nó hiện được hỗ trợ trong IE9 và chúng tôi có thể mong đợi nó sẽ tiếp tục được hỗ trợ tại đây.


3
Đó là câu trả lời tốt nhất trong quan điểm của tôi, phát hiện trình duyệt nên được tiếp cận bằng cách phát hiện các chức năng cụ thể /
7dr3am7

4
Tôi thích câu trả lời này. Nó không phải là phát hiện phiên bản trình duyệt, mà là phát hiện khả năng của trình duyệt - thường hữu ích hơn. Việc phát hiện một tính năng như 'addEventListener' sẽ không chỉ tách IE8 khỏi IE9, nó sẽ tách các trình duyệt cũ khỏi các trình duyệt hỗ trợ HTML5 nói chung.
garyv

8
var ltIE9 = !document.addEventListener;
josephrace

6
Thật không may, điều này không thành công nếu bạn đã điền document.addEventListener. Các nhận xét có điều kiện của IE là không thành công về mặt đó.
Daniel Weiner

2
Để ngăn chặn phương pháp không thành công từ các nhà chính trị. Chỉ cần tắt nó arround và kiểm tra:if( !document.attachEvent){ // IE8+ }
Jesper Jensen

27

Sử dụng các chú thích có điều kiện, bạn có thể tạo một khối tập lệnh sẽ chỉ được thực thi trong IE dưới 9.

<!--[if lt IE 9 ]>
<script>
var is_ie_lt9 = true;
</script>
<![endif]--> 

Tất nhiên, bạn có thể đặt trước khối này bằng một khối chung khai báo var is_ie_lt9=false, khối này sẽ ghi đè đối với IE nhỏ hơn 9. (Trong trường hợp đó, bạn muốn xóa varkhai báo vì nó sẽ lặp lại).

CHỈNH SỬA : Đây là phiên bản không dựa vào các khối tập lệnh nội dòng (có thể chạy từ tệp bên ngoài), nhưng không sử dụng tính năng đánh hơi tác nhân người dùng:

Qua @cowboy :

with(document.createElement("b")){id=4;while(innerHTML="<!--[if gt IE "+ ++id+"]>1<![endif]-->",innerHTML>0);var ie=id>5?+id:0}

2
tạo một biến toàn cục bằng cách sử dụng thẻ điều kiện ... thú vị.
bcm

Nó có lợi thế là không liên quan đến bất kỳ RegEx nào và có lẽ là không thể giả mạo. IE phân tích cú pháp biến như không có gì. (Đối với IE, đang nói điều gì đó.)
Yahel

điều này khá tốt, tôi có thể sử dụng if (window.ielt9). Tôi tự hỏi nếu có thể có một giải pháp tập lệnh không nội dòng tốt hơn điều này? (đó sẽ là sang trọng ...)
tỷ mét khối

Có vẻ như giải pháp của @ cwolves sẽ cho phép bạn chạy nó trong một tập lệnh bên ngoài (tôi chưa bao giờ thử nó.)
Yahel

10

bah để bình luận có điều kiện! Mã có điều kiện tất cả các cách !!! (IE ngớ ngẩn)

<script type="text/javascript">
/*@cc_on
   var IE_LT_9 = (@_jscript_version < 9);
@*/
</script>

Tuy nhiên, nghiêm túc mà nói, chỉ cần ném cái này ra khỏi đó trong trường hợp nó phù hợp với bạn hơn ... chúng giống nhau, nó chỉ có thể nằm trong tệp .js thay vì HTML nội tuyến

Lưu ý: hoàn toàn trùng hợp khi kiểm tra jscript_version là "9" ở đây. Đặt nó thành 8, 7, v.v. sẽ KHÔNG kiểm tra "là IE8", bạn cần phải tra cứu phiên bản jscript cho các trình duyệt đó.


1
@bcm - bạn nên sử dụng IE_LT_9 == falseIE9 và trueIE8. Tôi hiện đang sử dụng máy mac và không có PC ở đây, vì vậy tôi không thể kiểm tra nó, nhưng tôi đã rút mã đó ra khỏi mã mà tôi đã viết mà tôi biết là hoạt động. Nếu nó không hoạt động vì một lý do nào đó, alert(@_jscript_version)hãy xem bạn nhận được gì và điều chỉnh từ đó.
Mark Kahn

2
thở dài mã hoạt động, IE9 không thực sự chạy IE7 khi nó ở 'chế độ tương thích', nó vẫn sử dụng công cụ JS của IE9. jsfiddle.net/aNGXS Theo IETester: IE9 nói là '9', IE8 nói là '5.6'
Mark Kahn

1
bằng cách nào đó, hãy sử dụng phiên bản IE8 độc lập và bạn SẼ KHÔNG nhận được '9' trong cảnh báo đó. Bạn sẽ nhận được '5.8' hoặc cái gì đó tương tự (không chắc chắn đặc biệt nếu họ được cập nhật động cơ JScript, nhưng nó KHÔNG 9)
Đánh dấu Kahn

1
OMFG, tôi vừa thử nghiệm điều này trên NĂM máy thông qua RDC và nó hoạt động trên MỌI máy. IE8 cho biết "5,8", IE9 cho biết "9". Bạn đang làm sai điều gì đó hoặc giả sử rằng bạn không sử dụng công cụ IE9 khi bạn đang sử dụng. Như tôi đã nói, IE9 trong "chế độ tương thích" hoặc với một tác nhân người dùng khác vẫn là IE9. Chạy phiên bản độc lập của IE8, IE7 hoặc bất kỳ thứ gì trước đó và mã hoạt động.
Mark Kahn

3
Bạn vẫn đang chạy IE9! Điều này phát hiện -THAT-. Nếu bạn chạy một bản sao độc lập nếu IE8, nó sẽ hiển thị điều đó. Đừng đổ lỗi cho tôi vì các công cụ dành cho nhà phát triển của Microsoft là vô giá trị.
Mark Kahn

9

Dưới đây là một cải tiến so với giải pháp của James Padolsey:

1) Nó không gây ô nhiễm bộ nhớ (ví dụ: đoạn mã của James tạo ra 7 đoạn tài liệu không được di chuyển khi phát hiện IE11).
2) Nó nhanh hơn vì nó kiểm tra giá trị documentMode trước khi tạo đánh dấu.
3) Nó dễ đọc hơn nhiều, đặc biệt là đối với các lập trình viên JavaScript mới bắt đầu.

Liên kết gist: https://gist.github.com/julianshapiro/9098609

/*
 - Behavior: For IE8+, we detect the documentMode value provided by Microsoft.
 - Behavior: For <IE8, we inject conditional comments until we detect a match.
 - Results: In IE, the version is returned. In other browsers, false is returned.
 - Tip: To check for a range of IE versions, use if (!IE || IE < MAX_VERSION)...
*/

var IE = (function() { 
    if (document.documentMode) {
        return document.documentMode;
    } else {
        for (var i = 7; i > 0; i--) {
            var div = document.createElement("div");

            div.innerHTML = "<!--[if IE " + i + "]><span></span><![endif]-->";

            if (div.getElementsByTagName("span").length) {
                return i;
            }
        }
    }

    return undefined;
})();

8
var ie = !-[1,]; // true if IE less than 9

Bản hack này được hỗ trợ trong ie5,6,7,8. Nó được cố định trong ie9 + (vì vậy nó phù hợp với yêu cầu của câu hỏi này). Bản hack này hoạt động trong tất cả các chế độ tương thích của IE.

Làm thế nào nó hoạt động : tức là engine coi mảng có phần tử trống (như [, 1]) là mảng có hai phần tử, thay vì các trình duyệt khác nghĩ rằng chỉ có một phần tử. Vì vậy, khi chúng ta chuyển đổi mảng này thành số với toán tử +, chúng ta làm điều gì đó như sau: (', 1' ở tức là / '1' ở người khác) * 1 và chúng ta nhận được NaN ở tức là và 1 ở người khác. Hơn nữa, chúng tôi biến đổi nó thành boolean và đảo ngược giá trị với !. Đơn giản. Bằng cách này, chúng tôi có thể sử dụng phiên bản ngắn hơn mà không cần! dấu, nhưng giá trị sẽ bị đảo ngược.

Đây là lần hack ngắn nhất tính đến thời điểm hiện tại. Và tôi là tác giả;)


Bạn có thể giải thích làm thế nào / tại sao điều đó hoạt động? Nó trông giống như một vụ tấn công tồi tệ: bạn đang dựa vào các câu hỏi của công cụ JavaScript và các phiên bản cụ thể của công cụ JavaScript tương ứng với các phiên bản IE cụ thể. Điều đó vẫn hoạt động trong các IE mới hơn được đặt thành khả năng tương thích ngược trong công cụ gỡ lỗi hoặc chế độ tương thích?
Rup

Bản hack này được hỗ trợ trong ie5,6,7,8. Nó được cố định trong ie9 + (vì vậy nó phù hợp với yêu cầu của câu hỏi này). Cách hoạt động: tức là engine coi mảng có phần tử trống (như [, 1]) là mảng có hai phần tử, thay vì các trình duyệt khác nghĩ rằng chỉ có một phần tử. Vì vậy, khi chúng ta chuyển đổi mảng này thành số với toán tử +, chúng ta làm điều gì đó như sau: (', 1' trong ie / '1' ở những người khác) * 1 và chúng ta nhận được NaN trong ie và 1 ở những người khác. Hơn nữa, chúng tôi biến đổi nó thành boolean và đảo ngược giá trị với!. Đơn giản. Bằng cách này, chúng tôi có thể sử dụng phiên bản ngắn hơn mà không cần! dấu, nhưng giá trị sẽ bị đảo ngược.
Aleko

OK, nhưng nếu tôi đặt IE 9 vào chế độ tương thích với IE 7 thì nó có phát hiện được IE 7 không? Tuy nhiên, cảm ơn vì lời giải thích - điều đó sẽ tốt hơn nên được chỉnh sửa thành câu trả lời hơn là để lại dưới dạng bình luận.
Rup



4

Bạn có thể làm điều đó một cách nhanh chóng và dễ dàng với một biểu thức chính quy và .match():

if (navigator.userAgent.match(/MSIE\s(?!9.0)/)) {
    // ie less than version 9
}

8
Thật không may rằng chỉ phát hiện IES khác ngoài IE 9. Ví dụ nó cũng sẽ đúng đối với trình duyệt IE 10
Tim Jansen

4

Nếu tôi là bạn, tôi sẽ sử dụng biên dịch có điều kiện hoặc phát hiện tính năng.
Đây là một giải pháp thay thế khác:

<!--[if lt IE 9]><!-->
<script>
    var LTEIE8 = true;
</script>
<!--<![endif]-->

2

Tôi thích câu trả lời của Mike Lewis nhưng mã không vượt qua jslint và tôi không thể hiểu được vòng lặp funky while. Trường hợp sử dụng của tôi là đưa ra thông báo trình duyệt không được hỗ trợ nếu nhỏ hơn hoặc bằng IE8.

Đây là phiên bản miễn phí jslint dựa trên Mike Lewis ':

/*jslint browser: true */
/*global jQuery */
(function () {
    "use strict";
    var browserNotSupported = (function () {
        var div = document.createElement('DIV');
        // http://msdn.microsoft.com/en-us/library/ms537512(v=vs.85).aspx
        div.innerHTML = '<!--[if lte IE 8]><I></I><![endif]-->';
        return div.getElementsByTagName('I').length > 0;
    }());
    if (browserNotSupported) {
        jQuery("html").addClass("browserNotSupported").data("browserNotSupported", browserNotSupported);
    }
}());

1
bởi vì jquery 2.x không hỗ trợ tức là <9 nên đoạn mã đó sẽ dẫn đến lỗi và sụp đổ, sợ hãi và diệt vong.

1

Nó có cần phải được thực hiện bằng JavaScript không?

Nếu không, bạn có thể sử dụng cú pháp nhận xét có điều kiện dành riêng cho IE:

<!--[if lt IE 9]><h1>Using IE 8 or lower</h1><![endif]-->

1
Giải pháp JavaScript, không phải trong DOM
BCM

1
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
    // IE8 or less
}
  • giải nén phiên bản IE với: /MSIE\s(\d+)/.exec(navigator.userAgent)
  • nếu đó không phải là trình duyệt IE, nó sẽ trả về nullvì vậy trong trường hợp đó, nó ||0sẽ chuyển nullsang0
  • [1]sẽ nhận được phiên bản chính của IE hoặc undefinednếu nó không phải là trình duyệt IE
  • hàng đầu +sẽ chuyển đổi nó thành một số, undefinedsẽ được chuyển đổi thànhNaN
  • so sánh NaNvới một số sẽ luôn trả vềfalse

0

Tất cả các bạn đang cố gắng phức tạp hóa những thứ đơn giản như vậy. Chỉ cần sử dụng một bình luận có điều kiện JScript đơn giản và dễ hiểu. Đây là cách nhanh nhất vì nó thêm mã 0 vào các trình duyệt không phải IE để phát hiện và nó có khả năng tương thích từ các phiên bản IE trước khi các nhận xét có điều kiện HTML được hỗ trợ. Nói ngắn gọn,

var IE_version=(-1/*@cc_on,@_jscript_version@*/);

Hãy cẩn thận với các từ thu nhỏ: hầu hết (nếu không phải tất cả) sẽ nhầm nhận xét có điều kiện đặc biệt với nhận xét thông thường và hãy xóa nó

Về cơ bản, đoạn mã trên đặt giá trị của IE_version thành phiên bản IE bạn đang sử dụng, hoặc -1 nếu bạn không sử dụng IE. Một cuộc biểu tình trực tiếp:

var IE_version=(-1/*@cc_on,@_jscript_version@*/);
if (IE_version!==-1){
    document.write("<h1>You are using Internet Explorer " + IE_version + "</h1>");
} else {
    document.write("<h1>You are not using a version of Internet Explorer less than 11</h1>");
}

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.