14

Tôi hiện đang gặp lỗi trong mã FacePile của Facebook và tôi bị bối rối bởi nguyên nhân.'Ngày' không được xác định trong IE9 trong javascript được tải bởi FacePile

facepile.php tải một kịch bản đó, trong số những thứ khác, có những dòng này (khi khá-in):

... 
o = document.createElement('script'); 
o.src = l[n]; 
o.async = true; 
o.onload = h; 
o.onreadystatechange = function() { 
    if (o.readyState in c) { 
    h(); 
    o.onreadystatechange = null; 
    } 
}; 
d++; 
a.appendChild(o); 
... 

(một document.body ==, d ++ là không thích hợp ở đây)

Mã này tải một kịch bản với src = http://static.ak.fbcdn.net/rsrc.php/v1/yW/r/pmR8u_Z_9_0.js hoặc một cái gì đó không kém phần khó hiểu (tên tệp thay đổi đôi khi).

Trong kịch bản đó, có những dòng này ở phía trên rất (cũng có khi khá-in):

/*1331654128,176820664*/ 

if (window.CavalryLogger) { 
    CavalryLogger.start_js(["\/8f24"]); 
} 

window.__DEV__ = window.__DEV__ || 0; 
if (!window.skipDomainLower && document.domain.toLowerCase().match(/(^|\.)facebook\..*/)) 
    document.domain = window.location.hostname.replace(/^.*(facebook\..*)$/i, '$1'); 
function bagofholding() { 
} 
function bagof(a) { 
    return function() { 
    return a; 
    }; 
} 
if (!Date.now) 
    Date.now = function now() { 
    return new Date().getTime(); 
    }; 
if (!Array.isArray) 
    Array.isArray = function(a) { 
    return Object.prototype.toString.call(a) == '[object Array]'; 
    }; 
... 

Và tôi nhận được một lỗi mà nói "SCRIPT5009: 'Ngày' là không xác định", ngay tại phần if (!Date.now). Gỡ lỗi gần điểm đó cho thấy rằng Date, Array, Object, Function, v.v. đều không được xác định.

Er ... như thế nào? window tồn tại, cũng như document (mặc dù document.body là null) và một số ít người khác, nhưng nhiều đối tượng được xác định trước thì không. Các phiên bản trước của IE dường như không có vấn đề này, cũng như không làm bất kỳ trình duyệt nào khác, nhưng nhiều máy chạy IE9 (bao gồm cả máy ảo sạch) đều có cùng vấn đề.

Tôi nghi ngờ tôi có thể làm bất cứ điều gì về nó, nhưng tôi là rất tò mò điều này xảy ra như thế nào/vấn đề cơ bản là gì. Có ai biết, hoặc họ có thể chỉ cho tôi một cái gì đó có thể giúp đỡ?

- chỉnh sửa:

Trước khi đăng câu hỏi này, tôi đã tìm thấy trang web này: http://www.guypo.com/technical/ies-premature-execution-problem/

Trong khi nó có vẻ (và vẫn làm) như nó có thể là nguồn gốc của vấn đề, tôi có thể' t sao chép nó trong bất kỳ hoàn cảnh nhỏ hơn. Tất cả các kết hợp tôi đã thử vẫn có ngày, vv được xác định; điều đó không quá ngạc nhiên, vì nếu không tôi chắc chắn rằng những người khác sẽ gặp nhiều vấn đề hơn với IE.

+0

Các đối tượng dựng sẵn như Ngày, Mảng, v.v. phải luôn sẵn có trong ngữ cảnh chung. Làm thế nào một hàm có thể thực thi nếu không có hàm tạo hàm nào? Vấn đề kỳ lạ thực sự. – RobG

+0

thử mà không cần "o.async = true;" –

+0

Tôi không thể - mã này nằm trong mã của Facebook và tôi không thể tái tạo nó bằng bất kỳ mã nào của riêng tôi (mặc dù tôi chưa thử phản ánh toàn bộ điều này. Tôi có thể làm điều đó sau). Trừ khi IE9 có một số cách để chỉnh sửa javascript hiện đang chạy? – Groxx

Trả lời

1

Nếu bạn duyệt qua trình gỡ lỗi javascript tại điểm đầu tiên, mọi JS sẽ được chạy. Đồng thời thêm một chiếc đồng hồ cho ngày/mảng vv và lưu ý khi nó đi đến null. Có thể chậm và mất thời gian nhưng tôi không thể hiểu tại sao nó không hoạt động.

+0

Chúng không được xác định trước khi dòng đầu tiên được thực hiện và chỉ trong tập lệnh được tải (không phải các tập lệnh khác trong trang). – Groxx

+0

Nếu điều đó được đảm bảo thì có vẻ như lỗi phân tích cú pháp javascript hoặc một số lỗi đánh máy. Làm thế nào để bạn biết rằng js đã chạy? –

+0

Nó chạm vào điểm ngắt. Nó rất có thể là một lỗi trình duyệt của một số loại, nó chỉ là lạ mà tôi đã chỉ nhìn thấy nó trên tập tin đó. – Groxx

1

Bạn có thể thử thêm tập lệnh vào một hàm document.ready. Nói cách khác, đảm bảo rằng tập lệnh FB chỉ được xử lý sau khi DOM sẵn sàng. Tuy nhiên, dựa trên liên kết bạn đưa cho Pod của Guy (bài viết tuyệt vời), có vẻ như bạn đang đúng trong xác nhận rằng IE đang tải xuống và thực thi tập lệnh trước khi trưởng thành (do đó đề xuất của tôi là thêm trình bao bọc để nó chỉ thực thi sau sự kiện DOM sẵn sàng). IE9 có lẽ là sandboxing kịch bản thực thi (bên ngoài phạm vi tài liệu/cửa sổ).