2010-08-01 19 views
6

Tôi có một tình huống đặc biệt khi tôi chỉ được kiểm soát nội dung của một tài liệu < cơ thể >. Các máy chủ, tôi giả định trong một nỗ lực để vẫn linh hoạt, không tuyên bố một loại tài liệu mà sẽ ném IE vào chế độ quirks ngay lập tức. Với sự kiểm soát hạn chế của tôi đối với tài liệu, tôi có thể làm gì để buộc IE hiển thị trang ở chế độ tiêu chuẩn?Làm thế nào bạn có thể buộc IE hiển thị ở chế độ tiêu chuẩn nếu bạn chỉ có quyền kiểm soát nội dung của cơ thể?

Trả lời

4

Tôi tin rằng bạn không thể làm bất cứ điều gì về nó trừ khi bạn nói, viết lại nội dung của trang động với JS và chèn mạnh một loại tài liệu.

Bạn có thể đi vào chi tiết cụ thể về mức độ kiểm soát bạn có trên <body> không? Bạn có được phép làm JS/scripting không?

EDIT: Đây là một nỗ lực nhưng tôi không thử nghiệm trong IE. Nó có thể cho bạn ý tưởng. Tôi document.write() số outerHTML của document.documentElement và nó biến compatMode thành CSS1Compat.

Bạn có thể cần loại bỏ khối tập lệnh sau khi viết lại. Như tôi đã nói, tôi sẽ không thực sự khuyên bạn cố gắng này ...

http://medero.org/first-line.html

EDIT # 2: Nó có vẻ ngạc nhiên làm việc trong IE6. Nhưng khi làm mới, IE lưu trữ nó bằng cách nào đó và nó vĩnh viễn vẫn ở dạng biên tập .document.write() của nó. Để chống lại điều đó, hãy nối nó với chuỗi truy vấn, ví dụ: ?203984234.

Một lần nữa, tôi không chắc tình hình của bạn là gì, nhưng tôi hy vọng điều này mang đến cho bạn những ý tưởng hoặc trợ giúp.

EDIT # 3: Tôi viết lại nó và đóng document.write đến window.onload. Bạn sẽ cần phải nối thêm một chuỗi truy vấn duy nhất mỗi khi bạn truy cập nó để xem hiệu ứng, bởi vì nó lưu trữ nó sau nó .write của nó.

http://medero.org/rewrite.html?f30324433322111

Nếu bạn cần một cái gì đó ngay lập tức nhiều hơn bạn có thể có lẽ Jack DOM chức năng sẵn sàng của jQuery để viết lại nó trước khi tải cửa sổ.


Miscellaneous Ghi chú:

  • Bạn có thể có thể che giấu toàn bộ tài liệu html thông qua CSS cho đến khi document.write được gọi nếu thị nó quan trọng
  • Bạn có lẽ nên dải <script> document.write trước khi lưu outerHTML để trang mới được viết không có khối script.
+0

Tôi nghi ngờ điều này sẽ hiệu quả. Trang đã được hiển thị. Nếu bạn tự động thêm một loại tài liệu, IE sẽ phải phát hiện ra và chọn để trở lại trang. Nếu IE có khả năng làm điều đó, tôi sẽ nghĩ rằng thuộc tính 'document.documentMode' sẽ không được đọc. –

+0

Tôi đã cập nhật một lần. –

+0

Thú vị, có vẻ như nó thực sự hoạt động, đáng sợ như vậy. Thêm một div với lề và đệm và xem nó thay đổi kích thước như mô hình hộp của IE thay đổi. –

1

Hãy xem bài viết Defining Document Compatibility này về MSDN. Có lẽ viết ra thẻ meta X-UA-Compatible sẽ hoạt động.

+1

Kết thúc buổi tiệc, nhưng tôi đã thử siêu tương thích 'X-UA' và nó hoạt động. Tôi đã may mắn khi tôi thử nó mặc dù ... dường như bạn phải đặt nó gần đầu thẻ HEAD của bạn ("Tiêu đề Tương thích X-UA không phân biệt chữ hoa chữ thường, tuy nhiên, nó phải xuất hiện trong tiêu đề của trang web (HEAD phần) trước tất cả các phần tử khác ngoại trừ phần tử title và các phần tử meta khác. "http://goo.gl/xe3Ff). Ngoài ra, IE "lưu trữ" chế độ hiển thị miễn là cửa sổ trình duyệt mở, vì vậy hãy thử đóng và mở cửa sổ của bạn. Tôi có quyền kiểm soát thẻ HEAD mặc dù ... poster gốc không. – thirdender

0

Dưới đây là cách tôi quản lý để giải quyết nó, based on meder's answer.

Lần đầu tiên tôi thử viết ra số X-UA-Compatible meta nhưng điều đó không hiệu quả.

Vào cuối của tài liệu (hoặc trong đầu, nhưng tôi không có quyền truy cập vào một trong hai):

<script type="text/javascript"> 
if (navigator.appName == 'Microsoft Internet Explorer'){ 
    window.onload=function(){ 
     if (document.documentMode == 5){ 
      contents = document.documentElement.outerHTML; 
      newdoc = document.open("text/html", "replace"); 
      newdoc.writeln('<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'); 
      newdoc.write(contents); 
      newdoc.close(); 
     } 
    }; 
} 
</script> 

Các nội if là để ngăn chặn một vòng lặp vô hạn. Nó có lẽ sẽ tốt hơn để tách ra các mã chính nó, nói bằng cách đặt nó trong một chức năng và loại bỏ các cuộc gọi chức năng với string.replace(), nhưng tôi không thể có được rằng để làm việc như vậy đã phải giải quyết cho việc này.

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