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?
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?
Câu trả lời:
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
while
cú pháp thông thường không? Hay một số loại hack?
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.
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ì addEventListener
phươ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.
var ltIE9 = !document.addEventListener;
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 đó.
if( !document.attachEvent){ // IE8+ }
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 var
khai 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}
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 đó.
IE_LT_9 == false
IE9 và true
IE8. 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ừ đó.
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;
})();
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ả;)
Thay vào đó, tôi đã quyết định sử dụng tính năng phát hiện đối tượng.
Sau khi đọc cái này: http://www.quirksmode.org/js/support.html và cái này: http://diveintohtml5.ep.io/detect.html#canvas
Tôi muốn sử dụng một cái gì đó giống như
if(!!document.createElement('canvas').getContext) alert('what is needed, supported');
Liên kết này chứa thông tin liên quan về việc phát hiện các phiên bản của Internet Explorer:
http://tanalin.com/en/articles/ie-version-js/
Thí dụ:
if (document.all && !document.addEventListener) {
alert('IE8 or older.');
}
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
}
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]-->
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);
}
}());
if (+(/MSIE\s(\d+)/.exec(navigator.userAgent)||0)[1] < 9) {
// IE8 or less
}
/MSIE\s(\d+)/.exec(navigator.userAgent)
null
vì vậy trong trường hợp đó, nó ||0
sẽ chuyển null
sang0
[1]
sẽ nhận được phiên bản chính của IE hoặc undefined
nếu nó không phải là trình duyệt IE+
sẽ chuyển đổi nó thành một số, undefined
sẽ được chuyển đổi thànhNaN
NaN
với một số sẽ luôn trả vềfalse
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>");
}