2012-06-11 28 views
21

Tôi có một cửa sổ, trước khi đóng, tôi làm mới trang cơ bản.typeof trả về "không xác định" trong IE

if(opener && typeof(opener.Refresh) != 'undefined') 
{ 
    opener.Refresh(); 
} 

Nếu tôi chuyển ra khỏi trang mở ban đầu, mã này sẽ ném một "Permission Denied" lỗi.

Gỡ rối mã tiết lộ rằng typeof(opener.Refresh) là bằng "không rõ" thay vì dự kiến ​​"không xác định".

Theo như tôi biết "không xác định" không phải là một trong các giá trị trả lại cho typeof, vậy giá trị này sẽ được trả lại như thế nào và tại sao?

Thông tin thêm

tôi tránh các lỗi bằng cách thay đổi các chi phiếu đến:

if(opener && typeof(opener.Refresh) == 'function') 

Tuy nhiên ví dụ như thế này (detecting-an-undefined-object-property-in-javascript) dường như không tính đến yếu tố "không rõ" vào phương trình .

+11

Đó là IE, bạn mong đợi điều gì? – 0x499602D2

+0

Cách 'khai mở' được khai báo như thế nào? –

+0

Nó không được khai báo, tuy nhiên cửa sổ được tạo ra với một window.open tiêu chuẩn. –

Trả lời

16

Theo một duplicate question at Bytes, giá trị typeof unknown được thêm vào JScript phiên bản 8, cùng với date.

Một comment vào một blog bởi Robert Nyman cũng có thể được giải thích:

Internet Explorer sẽ hiển thị “không rõ” khi đối tượng đang được đề cập trên phía bên kia của một COM + cầu. Bạn có thể không biết điều này hoặc nhận ra điều này, nhưng đối tượng XMLHTTP của MS là một phần của đối tượng COM + khác nhau mà triển khai IUnknown; khi bạn gọi các phương pháp trên đó, bạn đang thực hiện trên cầu nối COM và không gọi JavaScript gốc.

Về cơ bản đó là câu trả lời của MS nếu bạn cố gắng kiểm tra hoặc truy cập vào nội dung nào đó không phải là một phần thực sự của công cụ JScript.

+0

Cảm ơn. Tôi đã nhìn thấy nhận xét đó, tuy nhiên tôi không thể liên kết nó với trường hợp dường như đơn giản của tôi ... –

+0

Vì vậy, giải pháp tốt nhất là không bao giờ kiểm tra '! == 'undefined'' và kiểm tra xem nó có bằng một trong các giá trị đã biết không ? Hoặc sử dụng toán tử 'in' như [TomaszDz] (http://stackoverflow.com/a/15152662/227299) được đề xuất? –

+0

Nếu bạn thực sự cần phải kiểm tra sự tồn tại không xác định (và không phải là chức năng như OP đã chỉnh sửa ở trên), thì sau đây sẽ hoạt động: (typeof myObj.myProp === 'undefined' || typeof myObj.myProp === 'unknown') – Bob

5

Các ECMAScript specification bang mà cho các đối tượng máy chủ giá trị trở lại của các nhà điều hành typeof là:

thực hiện xác định ngoại trừ có thể không "undefined", "boolean", "number", hoặc "string" .

Tôi tin rằng giá trị unknown chỉ được trả lại trong Internet Explorer. Điều thú vị là, MSDN không đề cập đến nó:

Có sáu giá trị có thể rằng typeof lợi nhuận. "Số", "chuỗi", "boolean", "đối tượng", "chức năng" và "không xác định"

+0

Bạn có bất kỳ ý tưởng nào theo kịch bản "không xác định" sẽ được trả về không? –

+4

Không có ý tưởng tôi sợ. Tôi không thể tìm thấy bất kỳ tài liệu thực sự nào về nó. Đó là vấn đề với vật chủ. Không có tiêu chuẩn để người phát triển trình duyệt có thể thực hiện khá nhiều thứ họ muốn. –

+1

@BrettPostin Toàn bộ rất nhiều 'typeof == 'unknown'' trong [' window.external'] (http://msdn.microsoft.com/en-us/library/ie/ms535246 (v = vs.85) .aspx) Ví dụ 'typeof window.external.AutoScan' hoặc' window.external.CreateAuthorizationHeader' –

7

Hãy thử toán tử in. Tôi đã có cùng một vấn đề (với applet) và tôi đã giải quyết nó bằng cách sử dụng in:

if("Refresh" in opener) { 
    opener.Refresh(); 
} 
+0

Xin cảm ơn! Đây là một gợi ý tuyệt vời. –

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