2010-09-30 39 views
15

Tôi sắp bắt đầu mã hóa một trang web mới, có nhiều trang javascript, nhưng trước khi tôi bắt đầu, tôi muốn giảm thiểu thời gian gỡ lỗi của mình trong Internet Explorer bằng cách biết trước những điều kỳ quặc là gì. Tôi không có ý định lo lắng quá nhiều về IE6.Những sai lầm phổ biến cần tránh khi mã hóa javascript cho Internet Explorer là gì?

Những sai lầm/khác biệt phổ biến cần tránh trong mã javascript hoạt động tốt trong các trình duyệt khác, nhưng phá vỡ trong Internet Explorer là gì?

+4

Đây là một ứng cử viên "Cộng đồng Wiki" tốt. – Pointy

+4

Một lần nữa ngày hôm nay, mọi người đang đóng cửa này là * "không phải là một câu hỏi thực sự" * khi có vẻ như tôi là một câu hỏi thực sự * rất *. Tại sao vậy? – user113716

+0

@patrick: bởi vì trong vài phút đầu tiên, hai câu trả lời bình chọn cao nhất chứa đựng vô nghĩa. Rõ ràng họ đã chọn để bỏ phiếu cho đóng thay vì để downvote những câu trả lời. – BalusC

Trả lời

4

Internet Explorer.

Ok nghiêm túc hơn, câu trả lời dấu phẩy sau trong câu trả lời khác là tốt. Sử dụng một khuôn khổ có thể giúp đỡ, nhưng nó không phải là một nắm bắt tất cả. Bạn sẽ phải đối phó với các vấn đề trình duyệt chéo. Vì vậy, hãy chắc chắn rằng bạn kiểm tra trong tất cả các phiên bản mà bạn quan tâm.

+0

Heh. Tôi không bình thường +1 câu trả lời như thế này, bởi vì họ không phải là tất cả những gì hữu ích, nhưng ... dang nó nếu tôi LOL. (IE là nguồn gây căng thẳng cho một dự án mà tôi đã làm gần đây.) – JasCav

+0

Dễ dàng kiếm tiền ...: P – annakata

+0

Câu trả lời ban đầu này (một oneliner "Internet Explorer") đã giết chết toàn bộ câu hỏi tự nó không tệ lắm. – BalusC

-1

Sử dụng khung như jQuery hoặc Prototype và bạn sẽ không cần phải lo lắng về điều đó.

CHỈNH SỬA:

Tôi nên làm rõ. Bạn sẽ có ít hơn rất nhiều để lo lắng về. Chẳng hạn như:

  • ActiveXObject vs XMLHttpRequest
  • attachEvent vs addEventListener

Danh sách item-

+3

Tôi không biết điều này có đúng không ... – hvgotcodes

+0

+1 cho điều này. Các thư viện được thiết kế đặc biệt để bạn không phải lo lắng về tất cả các tính tương thích và sự khác biệt giữa việc triển khai trình duyệt. Lời khuyên tốt cho @Herman. – JasCav

+0

@hvgotgotcodes - đó là lý do jquery tồn tại, vì vậy nó thực sự phải là ... – annakata

4

Hãy nhận biết về cách Internet Explorer xử lý phân tích cây dom và chuyển hướng, một đặc biệt, đó cũng tồn tại khi phân tích cú pháp httpObjects nói chung:

  • xmlNode.textContent không trả lại bất cứ điều gì trong internet explorer
  • xmlNode.firstChild.nodeValue hoặc cái gì đó trả về giá trị nút phải được sử dụng

-

7

Dưới đây là một tinh tế một: nếu trang web của bạn có nhiều khung (hoặc iframe), và bạn đã có mã Javascript giao tiếp giữa các khung hình đôi khi, IE (6 và 7, không chắc chắn về 8 và 9) là rất cầu kỳ về "dòng dõi" của các đối tượng Javascript, thậm chí những cái không có bất kỳ tham chiếu DOM nào. Điều đó có nghĩa là nếu bạn giao tiếp đối tượng Javascript của hầu hết mọi loại (chuỗi và số thường là OK, nhưng ngay cả trường hợp Ngày đã gây ra cho tôi các vấn đề trong quá khứ) từ khung này sang khung kia, nếu tại một số thời điểm sau, nguồn khung được cập nhật với một trang mới, trang đích sẽ nhận được một ngoại lệ nếu nó cố gắng gây rối với đối tượng truyền thông đó. Firefox là khá êm dịu về điều đó loại điều, nhưng khi IE rác thu thập các trang cũ, nó sau đó không giống như tài liệu tham khảo cho các đối tượng Javascript mà trang tạo ra.

8

Nếu bạn chỉ định trình xử lý sự kiện trực tiếp qua javascript, event sẽ không phải được cung cấp tự động.

myElement.onclick = function(e) { 
    alert(typeof e); // undefined 
} 

cách khắc phục là kéo window.event.

myElement.onclick = function(e) { 
    e = e || window.event; 
    alert(typeof e); // this is ok now 
} 

nếu bạn là người xử lý sự kiện trực tiếp trên phần tử, bạn có thể cung cấp tham chiếu event theo cách thủ công.

<input type="text" onclick="myMethod(event);"></input> 

đây là trình duyệt chéo và tốt, nếu bạn phải đi theo tuyến đường đó.

sử dụng attachEvent để đặt trình xử lý sự kiện cung cấp đối tượng event làm tham số cho phương pháp một cách tự động.

2

Sai lầm phổ biến nhất khi viết một trang web có hỗ trợ IE là quên kiểm tra trong mọi phiên bản.

Bạn cần đảm bảo tất cả mã của mình hoạt động trong IE6 (nếu bạn định hỗ trợ nó), IE7, IE8 và IE8-trong-IE7-mode. Và cũng là IE9 (hiện đang trong giai đoạn thử nghiệm).

Có một vài phím tắt để kiểm tra nhiều phiên bản của IE, nhưng lưu ý rằng chúng không phải lúc nào cũng cung cấp kết quả tương tự như những gì người dùng thực sẽ thấy; cách duy nhất để chắc chắn là thực sự thử nghiệm nó trong các phiên bản thực của IE, bất kể nó đau đến mức nào. chuỗi

+0

Đó là sự thật - nhưng thường thì lỗi của Internet Explorer rất tốt khi thông báo cho bạn rằng có "Lỗi trên dòng 0" và sau đó bạn phải cài đặt trình gỡ lỗi cho mọi phiên bản hoặc biết trước sự khác biệt nào giữa IE và các trình duyệt khác có thể gây ra điều này. –

6

CONCATENATE với +

var str=""; 
for (var i = 0; i < max; ++i) { 
    str += somefunction(i); 
} 

On MSIE nó có thể mất vài phút. Tôi đã từng làm một thử nghiệm nơi Opera một Firefox nơi hoàn thành sau một vài giây, nhưng MSIE đã không hoàn thành sau 20 phút!

Tuy nhiên, nếu sử dụng một mảng, MSIE là nhanh:

var str = []; 
for (var i = 0; i < max; ++i) { 
    str.push(somefunction(i)); 
} 
str = str.join(""); 

Xin lỗi, nhưng không thể tìm thấy bài tôi thực hiện về nó ngay bây giờ.

4

IE không hỗ trợ các sự kiện tùy chỉnh, chỉ các sự kiện DOM (có ngay cả trong 9 beta).

5

Công cụ JS của IE, trước IE9, là chậm. Thực sự, rất chậm. Hàng trăm đến hàng nghìn lần chậm hơn so với việc triển khai Mozilla và Webkit.

Điều này hiển thị ở độ phân giải tối thiểu của bộ hẹn giờ hoạt ảnh, thời gian để hoàn thành các loại và (như @some chỉ ra) nối chuỗi không có thật và bất kỳ nơi nào khác mà hiệu suất của trang web của bạn bị giới hạn bởi tốc độ của chính động cơ JS.

+0

vấn đề về độ phân giải bộ hẹn giờ có vẻ là vấn đề thực hiện nội bộ hơn là công cụ js chỉ bị chậm. http://ejohn.org/blog/accuracy-of-javascript-time/ – lincolnk

+0

được thực hiện - nhưng đó vẫn là quyết định triển khai JS-engine góp phần làm cho IE8 cảm thấy chậm chạp. –

7

IE (8 trở xuống, không chắc chắn về 9) không thể xử lý việc tiếp cận các nhân vật trong chuỗi như mảng, như trong:

var str = 'abc'; 
var c = str[2]; 
alert(c) 

Trong hầu hết các trình duyệt này sẽ cảnh báo 'c', nhưng IE Cảnh báo 'undefined' . Vì lý do đa trình duyệt, bạn nên sử dụng hàm charAt:

var str = 'abc'; 
var c = str.charAt(2); 
alert(c) 

Điều này cũng cảnh báo 'c' trong IE.

Sự khác biệt nhỏ là dấu phẩy ở các đối tượng và mảng. Đây là hợp lệ trong hầu hết các trình duyệt, nhưng đặt ra lỗi trong IE:

ar = [1,2,3,] 

và cũng

ob = {name:'janet', surname:'walker',}

mà có thể được khá khó chịu nếu bạn không biết về nó. Cả hai vấn đề này có lẽ là một cái gì đó tôi chạy thường xuyên bởi vì tôi đang sử dụng để trăn, nhưng nó vẫn còn giá trị tìm ra cho.

+0

Tuy nhiên, đó là hành vi không chuẩn, vì vậy IE cũng nằm trong quyền của mình không hỗ trợ nó. –

+0

Không hoạt động trong MSIE8 – some

1

Nếu bạn đang cố gắng đo lường thời gian mất thời gian, bạn nên biết rằng độ phân giải thời gian chỉ khoảng 15ms trong IE, trong đó 1ms trong FF, Chrome và Opera.

Bạn có thể kiểm tra điều này cho mình với mã này:

var end,start = new Date().getTime(); //Gets number of milliseconds since epoch 
while((end = new Date().getTime()) === start); //Wait for the time to change 
alert(end-start); // Shows 1 in FF, Chrome and Opera, but 15 or 16 in MSIE 

Nó đã được như thế này cho các lứa tuổi và vẫn áp dụng cho MSIE8 nhưng không phải là phổ biến kiến ​​thức. lincolnk được liên kết với a blog post by John Resig từ ngày 12 tháng 11 năm 2008 trong một nhận xét ở trên. Tôi không thể giúp tôi cười một chút khi tôi đọc nó, bởi vì tôi đã biết nó trong nhiều năm, trở lại khi Netscape là trình duyệt phổ biến.

Khi tôi nghĩ về nó, tôi có một trí nhớ rất mờ rằng Netscape từ đầu cũng có độ phân giải thấp, có thể bằng cách đọc thời gian hệ thống được cập nhật 18,2 lần mỗi giây, nhưng sau đó thay đổi nó. độ phân giải. Tuy nhiên, vì điều này đáng lẽ đã xảy ra khoảng 15 năm trước, tôi không chắc nó có chính xác không và tôi sẽ không cố chứng minh điều đó.

Đối với khả năng đọc Tôi đang sử dụng getTime ở trên thay vì một nhà điều hành unary

0

IE 7/8 không hiểu console.log/dir trừ giao diện điều khiển cửa sổ mở ra. Điều này có thể dễ dàng phá vỡ JS của bạn nếu bạn để lại bất kỳ trong môi trường prod. Luôn có

if(window.console) 
    console.log('Hello World') 
Các vấn đề liên quan