Theo mặc định, IE8 buộc các trang web mạng nội bộ vào chế độ tương thích. Tôi đã thử thay đổi tiêu đề meta thành IE8, nhưng nó không thừa nhận tiêu đề meta và chỉ sử dụng cài đặt trình duyệt. Có ai biết làm thế nào để vô hiệu hóa điều này?
Theo mặc định, IE8 buộc các trang web mạng nội bộ vào chế độ tương thích. Tôi đã thử thay đổi tiêu đề meta thành IE8, nhưng nó không thừa nhận tiêu đề meta và chỉ sử dụng cài đặt trình duyệt. Có ai biết làm thế nào để vô hiệu hóa điều này?
Câu trả lời:
Có thể ghi đè chế độ tương thích trong mạng nội bộ.
Đối với IIS, chỉ cần thêm mã dưới đây vào web.config. Làm việc cho tôi với IE9.
<system.webServer>
<httpProtocol>
<customHeaders>
<clear />
<add name="X-UA-Compatible" value="IE=edge" />
</customHeaders>
</httpProtocol>
</system.webServer>
Tương đương với Apache:
Header set X-UA-Compatible: IE=Edge
Và cho nginx:
add_header "X-UA-Compatible" "IE=Edge";
Và đối với express.js:
res.set('X-UA-Compatible', 'IE=Edge')
Michael Irigoyen đúng NHƯNG nó phức tạp hơn một chút ...
nếu bạn đang sử dụng nồi hơi tuyệt vời của Paul Irish thì bạn sẽ có một cái gì đó như sau: -
<!doctype html>
<!--[if lt IE 7]> <html class="no-js ie6 oldie" lang="en"> <![endif]-->
<!--[if IE 7]> <html class="no-js ie7 oldie" lang="en"> <![endif]-->
<!--[if IE 8]> <html class="no-js ie8 oldie" lang="en"> <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en"> <!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
Điều này sẽ KHÔNG hoạt động như mong đợi và buộc IE vào chế độ tương thích trong Intranet môi trường nếu bạn đã kiểm tra "Hiển thị trang web mạng nội bộ trong chế độ xem tương thích". Bạn cần xóa các nhận xét IE có điều kiện để ngăn chế độ tương thích Intranet.
Vì vậy, đoạn mã sau sẽ hoạt động:
<!doctype html>
<html class="no-js" lang="en">
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
Về cơ bản nếu bạn kích hoạt các bình luận IE có điều kiện trước <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
câu lệnh thì bạn sẽ bị buộc vào chế độ tương thích trong môi trường Intranet nếu bạn đang chạy IE9 với các cài đặt mặc định.
CẬP NHẬT - THÔNG TIN BỔ SUNG: Nhưng lưu ý rằng có một mẹo sẽ làm cho trình duyệt sôi HTML5:
Thêm một emtpy, bình luận có điều kiện trước DOCTYPE. Và lưu ý rằng, khi bạn làm điều đó , thì bạn cũng có thể thêm các nhận xét có điều kiện xung quanh X-UA-Compatible
chỉ thị, làm cho trang HTML5 có hiệu lực. Ví dụ:
<!--[if HTML5]><![endif]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
Một bài đăng blog được lấy cảm hứng từ phần đầu tiên của câu trả lời này , có nhiều chi tiết hơn. Và nhân tiện: Như đã đề cập trong bài đăng trên blog đó, người ta cũng có thể thay thế nhận xét có điều kiện trước DOCTYPE bằng một nhận xét có điều kiện bán không có điều kiện : <!--[]-->
. Vì vậy, như vậy:
<!--[]-->
<!doctype html>
<!--[if the boilerplate conditionals goes here<![endif]-->
<head>
<!--[if !HTML5]>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<![endif]-->
Nhưng lưu ý rằng biến thể sau ( <--[]--><!DOCTYPE html>
) sẽ, như được giải thích, ví dụ như câu trả lời này cho câu hỏi khác , sẽ kích hoạt vấn đề cũng biết rằng - đối với các phiên bản IE cũ mà không hỗ trợ X-UA-Compatioble
(đọc: cho IE7 và IE6) - đưa trình duyệt vào Chế độ quirks.
Nếu bạn kéo xuống menu "Công cụ" và chọn "Cài đặt chế độ xem tương thích" Trên hộp thoại đó ở phía dưới là cài đặt "Hiển thị các trang web mạng nội bộ ở chế độ tương thích". Nếu bạn bỏ chọn điều này sẽ giải quyết vấn đề và IE sẽ sử dụng chế độ dựa trên DOCTYPE.
Có một sự nhầm lẫn nhất định trong các câu trả lời cho câu hỏi này.
Câu trả lời hàng đầu hiện là giải pháp phía máy chủ đặt cờ trong tiêu đề http và một số nhận xét cho biết rằng giải pháp sử dụng thẻ meta chỉ không hoạt động.
Tôi nghĩ rằng mục blog này cung cấp một cái nhìn tổng quan tốt về cách sử dụng thông tin meta tương thích và theo kinh nghiệm của tôi hoạt động như được mô tả: http://blogs.msdn.com/b/cjacks/archive/2012/02/29/USE-x- ua-tương thích-để-tạo-bền-doanh-web-ứng dụng.aspx
Những ý chính:
Một điểm quan trọng (và tôi nghĩ có nhiều nhầm lẫn xuất phát từ thời điểm này) là IE có hai "lớp" chế độ:
Chế độ tài liệu xác định công cụ kết xuất (trang web được hiển thị như thế nào).
Chế độ trình duyệt xác định chuỗi IE-Tác nhân người dùng (UA) gửi đến máy chủ, chế độ tài liệu IE mặc định là gì và cách IE đánh giá Nhận xét có điều kiện.
Thông tin thêm về thông tin về chế độ tài liệu so với chế độ trình duyệt có thể được tìm thấy trong bài viết này: http://blogs.msdn.com/b/ie/archive/2010/06/16/ie-s-compabilities-features-for- trang web-developers.aspx? Redirected = true
Theo kinh nghiệm của tôi, dữ liệu meta tương thích sẽ chỉ ảnh hưởng đến chế độ tài liệu . Vì vậy, nếu bạn đang dựa vào phát hiện trình duyệt, điều này sẽ không giúp bạn. Nhưng nếu bạn đang sử dụng tính năng phát hiện thì đây là cách nên làm.
Vì vậy, tôi khuyên bạn nên sử dụng thẻ meta (trong trang html) bằng cú pháp này:
<meta http-equiv="X-UA-Compatible" content="IE=9,10" ></meta>
Lưu ý: đưa ra danh sách các chế độ trình duyệt mà bạn đã kiểm tra.
Bài đăng trên blog cũng khuyên bạn không nên sử dụng EmulationIEX. Đây là một trích dẫn:
Điều đó đang được nói, một điều tôi thấy lạ là khi một ứng dụng yêu cầu Thi đuaIE7, hoặc Thi đuaIE8. Các chế độ thi đua này là quyết định của chính họ. Vì vậy, thay vì cụ thể về những gì bạn muốn, bạn đang yêu cầu một trong hai điều và sau đó xác định điều nào trong hai điều đó bằng cách tìm mã khác cho DOCTYPE (và sau đó cố gắng hiểu liệu DOCTYPE có cung cấp cho bạn tiêu chuẩn không hoặc quirks tùy thuộc vào nội dung của nó - một nhiệm vụ đôi khi khó hiểu). Thay vì làm điều đó, tôi nghĩ sẽ có ý nghĩa hơn đáng kể khi trực tiếp chỉ định những gì bạn muốn, thay vì đưa ra một câu trả lời mà chính nó là một câu hỏi. Nếu bạn muốn các tiêu chuẩn IE7, thì hãy sử dụng IE = 7, thay vì IE = EmulationIE7. (Lưu ý rằng điều này không có nghĩa là bạn không nên sử dụng DOCTYPE - bạn nên.)
Hãy thử metatag này:
<meta http-equiv="X-UA-Compatible" content="IE=8" />
Nó nên buộc IE8 hiển thị dưới dạng Chế độ tiêu chuẩn IE8 ngay cả khi "Hiển thị các trang web mạng nội bộ trong chế độ xem tương thích" được chọn [cho mạng nội bộ hoặc tất cả các trang web], tôi đã tự thử trên IE 8.0.6
Quản trị viên hệ thống của chúng tôi đã giải quyết vấn đề này bằng cách bỏ chọn hộp trên toàn cầu cho tổ chức của chúng tôi. Người dùng thậm chí không cần phải đăng xuất.
Tôi đã tìm thấy một câu trả lời hoạt động cho phép ghi đè Chế độ xem tương thích Intranet đã kiểm tra. Chỉ cần thêm vào sự kiện OnInit của trang của bạn dòng này (không cần meta hoặc web.config customHeader):
Response.AddHeader("X-UA-Compatible", "IE=EmulateIE8");
Hãy thử đặt các mục sau trong tiêu đề:
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
Lịch sự nồi hơi HTML5 của Paul Irish (nhưng nó cũng hoạt động trong XHTML Transpose).
Tôi đã có thể ghi đè chế độ tương thích bằng cách chỉ định thẻ meta là TAG ĐẦU TIÊN trong phần đầu, không chỉ thẻ meta đầu tiên mà còn và chỉ là TAG RẤT ĐẦU TIÊN .
Cảm ơn @ stefan.s đã đưa tôi vào câu trả lời tuyệt vời của bạn. Trước khi đọc tôi đã có:
DID NÀY KHÔNG LÀM VIỆC
<head>
<link rel="stylesheet" type="text/css" href="https://stackoverflow.com/qmuat/plugins/editors/jckeditor/typography/typography.php"/>
<meta http-equiv="x-ua-compatible" content="IE=9" >
di chuyển thẻ liên kết ra khỏi đường và nó hoạt động
CÔNG TRÌNH NÀY :
<head><meta http-equiv="x-ua-compatible" content="IE=9" >
Vì vậy, ứng dụng khách IE8 được đặt để sử dụng khả năng tương thích sẽ hiển thị trang dưới dạng chế độ Tiêu chuẩn IE8 - nội dung = 'IE = 9' có nghĩa là sử dụng tiêu chuẩn cao nhất có sẵn lên đến và bao gồm IE9.
Đây không phải là một giải pháp chính xác, nhưng tôi cảm thấy đó là giải pháp tốt nhất. Trên các trang mạng nội bộ của chúng tôi, chúng tôi nói với mọi người rằng Firefox chỉ có thể truy cập được, chúng tôi không vui lòng với người dùng IE quanh đây. Kiểm tra tác nhân người dùng trên máy chủ hoặc phía máy khách và từ chối họ truy cập từ IE. Và tôi là một lập trình viên .NET.
Tôi đã đấu tranh với vấn đề này và muốn giúp cung cấp một giải pháp và cái nhìn sâu sắc độc đáo.
Một số khung dựa trên AJAX nhất định sẽ chèn javascripts và bảng định kiểu vào đầu <head>
và làm điều này dường như để ngăn giải pháp thẻ meta được thiết lập tốt hoạt động đúng. Trong trường hợp này, tôi thấy rằng việc tiêm trực tiếp vào tiêu đề phản hồi HTTP, giống như câu trả lời của Andras Csehi sẽ giải quyết vấn đề.
Tuy nhiên, đối với những người sử dụng Java Servlets, một cách tốt để giải quyết vấn đề này là sử dụng ServletFilter.
public class EmulateFilter implements Filter {
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest arg0, ServletResponse arg1,
FilterChain arg2) throws IOException, ServletException {
HttpServletResponse response = ((HttpServletResponse)arg1);
response.addHeader("X-UA-Compatible", "IE=8");
arg2.doFilter(arg0, arg1);
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
}
Chúng ta có thể giải quyết vấn đề này trong môi trường Spring-Apache-tomcat bằng cách thêm một dòng duy nhất trong phương thức RequestInterceptor -
//before the actual handler will be executed
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler)
throws Exception {
// Some logic
// below statement ensures IE trusts the page formatting and will render it acc. to IE 8 standard.
response.addHeader("X-UA-Compatible", "IE=8");
return true;
}
Tham khảo từ - Cách tạo bộ lọc và sửa đổi tiêu đề phản hồi Nó bao gồm cách chúng tôi có thể giải quyết vấn đề này thông qua RequestInterceptor (Spring).
Nếu bạn muốn trang Web của mình buộc chế độ tiêu chuẩn IE 8, thì hãy sử dụng thẻ meta này cùng với DOCTYPE hợp lệ:
<meta http-equiv="X-UA-Compatible" content="IE=EmulateIE8" />
Lưu ý giá trị "Thi đuaIE8" thay vì "IE8" đơn giản.
Theo các nhà phát triển IE, điều này sẽ, "Hiển thị các DOCTYPE tiêu chuẩn ở chế độ Tiêu chuẩn IE8; Hiển thị các DOCTYPE trong chế độ Quirks. Sử dụng thẻ này để ghi đè chế độ xem tương thích trên máy khách và buộc Tiêu chuẩn theo Tiêu chuẩn IE8."
thông tin thêm về bài đăng trên blog IE này: http://bloss.msdn.com/b/ie/archive/2008/08/27/int Giới thiệu-compabilities-view.aspx
Câu hỏi này là một bản sao của chế độ trình duyệt Force "Internet Explorer 8" trong mạng nội bộ .
Các câu trả lời ở đó chỉ ra rằng không thể tắt chế độ xem tương thích (về phía máy chủ) - https://stackoverflow.com/a/4130343/24267 . Đó chắc chắn là trường hợp, vì không có gợi ý nào tôi đã thử làm việc. Trong IE8, "Chế độ trình duyệt" được đặt thành chế độ xem Tương thích Internet Explorer 8 cho dù bạn gửi loại tiêu đề tương thích X-UA nào.
Tôi đã phải thực hiện một số xử lý đặc biệt cho IE7 và chế độ tương thích, khiến trình duyệt hiển thị bằng IE8 nhưng báo cáo đó là IE7, đã phá vỡ mã của tôi. Đây là cách tôi sửa mã của mình (tôi biết đây là một vụ hack khủng khiếp và tôi nên thử nghiệm các tính năng không phải phiên bản trình duyệt):
isIE8 = navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 8; if (! isIE8 && navigator.appVersion.indexOf ("MSIE")! = -1 && parseFloat (navigator.appVersion.split ("MSIE") [1]) == 7 && navigator.appVersion.indexOf ("Trident ! = -1) { // Nói dối, đây là IE8 trong chế độ tương thích. isIE8 = đúng; }
Thêm phần này vào trong thẻ tiêu đề trang của bạn (nhắm mục tiêu phiên bản IE bạn muốn):
<meta http-equiv="X-UA-Compatible" content="IE=8" />
Lưu ý, điều này sẽ KHÔNG thay đổi thực tế là trình duyệt cho biết nó ở chế độ tương thích (được gọi là chế độ trình duyệt), nhưng trang sẽ hiển thị ở chế độ tiêu chuẩn IE8. Nếu VẪN không hiển thị như bạn muốn, thì có lẽ là do bạn có javascript đang kiểm tra sai phiên bản IE. Xem bài đăng trên blog sau để xác định thuộc tính nào bạn nên khóa vì ngay cả khi bạn đặt thẻ meta X-UA-Tương thích, chuỗi tác nhân người dùng vẫn sẽ nói MSIE 7.0 .
Trong trường hợp của tôi, để khắc phục, tôi phải thêm một kiểm tra cho chế độ Tương thích IE7. Tôi đã làm như vậy bằng cách sử dụng mã javascript đơn giản:
//IE8 and later will have the word 'trident' in its user agent string.
if (navigator.userAgent.indexOf("Trident")>-1) { //do something }
Đối với bất kỳ ai khác đang đọc điều này đang tìm cách vô hiệu hóa điều này thông qua GPO cho tất cả người dùng, đây là cài đặt:
Cấu hình máy tính / Mẫu quản trị / Cấu phần Windows / Internet Explorer / Chế độ xem tương thích / Bật Chế độ tiêu chuẩn Internet Explorer cho mạng nội bộ cục bộ
mặc dù chỉnh sửa web.config đã sửa nó cho tôi.
Thay đổi các tiêu đề trong .htaccess
BrowserMatch MSIE ie
Header set X-UA-Compatible "IE=Edge,chrome=1" env=ie
Tìm thấy giải pháp cho vấn đề này tại đây: https://github.com/h5bp/html5-boilerplate/issues/378
Nhận xét của Stefan S 'về chế độ tài liệu so với chế độ trình duyệt rất phù hợp với vấn đề của tôi.
Tôi có dữ liệu meta X-UA-Content trong trang, nhưng tôi đã kiểm tra phiên bản trình duyệt phía khách hàng navigator.appVersion
. Thử nghiệm này không phản ánh dữ liệu meta vì nó cho chế độ trình duyệt không phải là chế độ tài liệu.
Câu trả lời cho tôi là kiểm tra những document.documentMode
thứ như:
function IsIE(n)
{
if (navigator.appVersion.indexOf("MSIE ") == -1) return false;
var sDocMode = document.documentMode;
return (isFinite(sDocMode) && sDocMode==n);
}
Bây giờ, thẻ meta X-UA-Content của tôi phản ánh trong bài kiểm tra trình duyệt của tôi.
Tại sao tôi lại làm một việc khó chịu như thử nghiệm trình duyệt? Tốc độ. Nhiều tiện ích jQuery khác của tôi, như trình sắp xếp bảng quá chậm trên IE6 / 7 và tôi muốn tắt chúng đi. Tôi không chắc chắn rằng việc kiểm tra các tính năng của trình duyệt có thể giúp tôi giải quyết vấn đề này.