2013-07-09 45 views
5

Cho rằng Plugin của tôi có thể được chạy trên bất kỳ công cụ JS (trong trình duyệt hay không),Kiểm tra xem đó là đối tượng cửa sổ

  • Làm sao người ta biết rằng một số biến thực sự là đối tượng trình duyệt window.

    Làm cách nào để biết liệu someVar có tham chiếu đến đối tượng window của trình duyệt hay không. Có điều gì trong số window mà tôi có thể kiểm tra xem nó có thực sự là đối tượng window của trình duyệt không?

  • Và cách kiểm tra xem đối tượng window của trình duyệt có thực sự tồn tại và không chỉ một số biến số window chứa đối tượng.

    Giả sử bạn không thể nói nếu someVarwindow bởi chính nó, và bạn muốn kết hợp nó với các thực trình duyệt window đối tượng như someVar === window, làm thế nào để bạn có được window rằng bạn có chắc nó là trình duyệt window và không một số đối tượng khác từ phạm vi bên ngoài có tên là window hoặc một số khác trên toàn cầu từ môi trường khác?

Chỉ cần làm rõ hơn một chút:

  • Tôi không tìm kiếm toàn cầu của môi trường. Tôi đang tìm kiếm đối tượng window đối tượng cụ thể.
  • Tôi không kiểm tra xem tập lệnh có đang chạy trên trình duyệt hay không.

Tôi không thể làm điều gì đó như if(!window)window chỉ có thể là một đối tượng khác được khai báo ở đâu đó ngoài phạm vi.

function someFunction(){ 
    var window = {foo:'bar'}; 

    (function(){ 
    console.log(window); //{foo:'bar'} 
    }()); 
} 

tôi không thể kiểm tra if(window.window === window) kể từ khi tôi cũng có thể làm tự tham khảo, và như đã nói trước đó, window có thể là một đối tượng từ một phạm vi bên ngoài:

var bar = {}; 
bar.bar = bar; 
bar.bar.bar.bar.bar.bar === bar; //true 

Và sau đây có thể không hoạt động kể từ kịch bản có thể được bao bọc hoặc ghép lại trong một cái gì đó khác với không gian toàn cầu. this cũng có thể được sửa đổi với các cuộc gọi như call(), apply() hoặc bind().

//Stand-alone, I can assume window is global since "this" is the global in global space 
(function(window){ 
    //window may not be window 
}(this)); 

//But when this happens 
someNamespace.someFunction = function(){ 

    (function(window){ 
    //window may not be window 
    }(this)); 

} 

//or this: 
someNamespace.someFunction.call({}); 

Tôi có cảm giác rằng đây là bản sao, nhưng tôi không thể tìm thấy nơi tôi lần đầu tiên nhìn thấy nó.

+0

thể trùng lặp của [Làm cách nào để kiểm tra xem tập lệnh có đang chạy dưới node.js không?] (Http://stackoverflow.com/questions/4224606/how-to-check-whether-a-script-is-running-under-node-js) –

+0

Có vẻ như bạn muốn cho dù mã của bạn có đang chạy trong trình duyệt hay không bằng cách kiểm tra xem cửa sổ có tồn tại hay không. Bạn có thể thử tìm kiếm các tính năng mà trình duyệt có thể thực hiện như một phần của cửa sổ như window.location.href, nhưng tất nhiên ngay cả điều này cũng không an toàn. Làm cách nào để xác định xem bạn có thể trả lại chuỗi userAgent hợp lệ không? – series0ne

+0

Sẽ '(function() {return this}). Gọi (null)' luôn luôn hoạt động? –

Trả lời

-1
if(this.window === this) 

       

+0

"tập lệnh có thể được bao bọc trong một thứ khác ngoài không gian toàn cầu" –

+0

sau đó lưu tham chiếu đến 'this' ở đầu tệp. jesus. –

+0

"tập lệnh" đề cập đến toàn bộ tệp, tôi giả sử. Không cần phải thô lỗ. –

3

Bạn có thể lấy đối tượng toàn cầu như vậy ...

var global = (1,eval)("this"); 
+0

Có thể không có 'eval' (hoặc' chức năng mới') không? –

+0

@JanDvorak: Tôi khá chắc chắn là không. –

+1

Tôi không thể tham gia với char '1'. Chúng tôi thực sự chạy 'eval' trên' "chuỗi" "này. Làm thế nào '1' tham gia ở đây? – Tommi

1

Làm thế nào về

function isWindow() { 
    _test = 42; 
    return window && window._test == 42 
} 
+0

ngoại trừ bạn nên kiểm tra nếu '_test' chưa có trong' cửa sổ' và nếu có, hãy thử nghiệm với một số giá trị khác. –

+0

Ngoài ra, đừng quên quay trở lại kiểm tra của bạn sau khi bạn đã hoàn thành nó ;-) –

+0

@JanDvorak: vâng, nhưng nếu KHÔNG có cửa sổ - làm thế nào để tôi quay trở lại? – georg

2

này thử nghiệm sẽ không chỉ cho cửa sổ hiện hành, nhưng đối với cửa sổ nói chung:

window.toString() == "[object Window]"; 
0

Bạn có thể kiểm tra xem nó nếu bạn sử dụng một số phương pháp hỗ trợ chỉ bằng cách cửa sổ đối tượng. Ví dụ postMessage:

(function(o){ 
if(!!o.postMessage) console.log("This is my window"); 
else console.log("This isn't my window"); 
})(window); 
0

tôi tìm thấy nó trong khi sự hiểu biết tạo trường thông qua

var MyExampleInstace = function MyExampleInstace() { 
    console.log(this); // returns undefined in strict mode 
    // in not strict mode it will return Window 
} 

new MyExampleInstace(); // will not return and error (this will be fine) 

Tôi muốn tạo ra một lỗi như

throw new Error('Please use "new" keyword'); 

Khi ai đó cố gắng gọi MyExampleInstance không phải là ví dụ nhưng với chức năng đơn giản như:

MyExampleInstance(); // console should show "Please use "new" keyword 

Vì vậy, kết quả cuối cùng là:

var MyExampleInstace = function MyExampleInstace() { 
    if (this === undefined || this instanceof Window) throw new Error('Please use "new" keyword'); 
} 

Để kiểm tra các đối tượng là đối tượng của một số "loại" những cách đơn giản nhất mà tôi tìm thấy qua

// myVar could be "this" or every var u need 
// That's also opens the way to check the object instance of your MyExampleInstance 
myVar instanceof Window 

https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/instanceof

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