2010-06-23 16 views
10

क्या आप यह जांचने का एक अच्छा तरीका जानते हैं कि एक चर जावास्क्रिप्ट में विंडो ऑब्जेक्ट है या नहीं? मैं के साथ की कोशिश की:जावास्क्रिप्ट जांचें कि कोई चर विंडो है

var variable=window; 
Object.prototype.toString.call(variable); 

Firefox में यह "[object Window]" रिटर्न लेकिन आईई "[object Object]" में इतना है कि सही तरीके से नहीं है। क्या आप इसे जांचने का एक सटीक तरीका जानते हैं?

+0

तुम सिर्फ 'window' के खिलाफ एक तुल्यता परीक्षण कर सकता हूँ? '(somevar === विंडो)? 'हां': 'नहीं' –

+0

लेकिन अगर यह एक आईफ्रेम विंडो है तो यह काम नहीं करेगा। – mck89

+0

मैं उत्सुक हूँ, आपको ऐसा करने की आवश्यकता क्यों है? –

उत्तर

10

हाँ, लेकिन मैं हर खिड़की की जांच करने के लिए एक तरह से की जरूरत है न केवल वर्तमान एक

कुछ तरीके हैं जिन्हें आप ऐसा कर सकते हैं। विंडो ऑब्जेक्ट पर एक या दो ज्ञात गुणों की जांच करना सबसे आसान तरीका है। वहाँ भी है self संपत्ति - प्रत्येक विंडो के लिए, आप की जांच कर सकता self संपत्ति विंडो ऑब्जेक्ट के बराबर है:

myvar.self == myvar; 
window.self == window; 
frameElement.contentWindow.self == frameElement.contentWindow; 
+0

बिल्कुल सही धन्यवाद! – mck89

+1

'स्वयं' को अधिलेखित किया जा सकता है और अक्सर संदर्भ बनाए रखने के लिए एक चर नाम के रूप में उपयोग किया जाता है। – zzzzBov

+0

@zzzzBov: तो, क्या? अधिकांश गुणों को ओवरराइट किया जा सकता है, लेकिन आप शायद ही कभी "संदर्भ बनाए रखने" की कोशिश करते समय ऐसा ही देखेंगे क्योंकि यह वैश्विक दायरे में नहीं होता है और कोई भी आत्म सम्मानित डेवलपर कहीं और 'var' के साथ घोषित करेगा। जब तक आप 'window.self' को संदर्भित करते हैं और न केवल' स्वयं ', आपको ठीक होना चाहिए। यदि यह किसी के लिए बहुत मायने रखता है, तो मुझे लगता है कि वे 'window.self 'के बजाय' window.window' का उपयोग कर सकते हैं, अगर वे चाहते हैं। यह अधिकांश आधुनिक ब्राउज़रों में अधिलेखित होने से सुरक्षित है। –

1
variable == window 

कोई भी अब भी स्थानीय चर परिभाषित कर सकता है जिसे window कहा जाता है। मुझे यकीन नहीं है कि ऐसे सभी शेंगेनियों के लिए लचीला तरीका है। कोई व्यक्ति ऐसी ऑब्जेक्ट बना सकता है जिसने अधिकांश विंडो गुणों और कार्यों को कॉपी किया है, जिनमें toString शामिल हैं।

1
if(variable == window) 

बेशक केवल यह जांचता है कि परिवर्तनीय वस्तु इस विंडो है (यानी जावास्क्रिप्ट को निष्पादित करने वाले दस्तावेज़ की विंडो)।

वैकल्पिक रूप से, आप कुछ इस तरह की कोशिश कर सकते:

if(variable.document && variable.location) 

और इसलिए आप कर रहे हैं यकीन है कि है कि यह एक खिड़की है ...

कुछ खिड़की क्षेत्रों और/या कार्यों के अस्तित्व के लिए जाँच
2

कैसे बस के बारे में:

isWindow = variable === window; 

ट्रिपल बराबर होती है टाइप बलात्कार है कि अन्यथा यह बहुत कठिन करने के लिए होगा रोकता है।

+2

हां लेकिन मुझे हर खिड़की को न केवल वर्तमान में जांचने के लिए एक तरीका चाहिए। – mck89

+0

उसी ऑब्जेक्ट की तुलना करते समय टाइप-सख्त जांच आवश्यक नहीं है। –

0

window के बाद से एक वैश्विक चर रहा है और वैश्विक चर वैश्विक वस्तु की संपत्ति हैं, window.windowwindow बराबर होगा । तो अगर आप परीक्षण कर सकते हैं:

var q = {}; 
q.window = q; 

अगर ऐसा होने की संभावना नहीं है, तो आप इस कोड का उपयोग कर सकते हैं:

if (mysteryVariable.window == mysteryVariable) 
    ... 

समस्या यह है कि इस करता है, तो हम इस तरह एक वस्तु है मूर्ख बनाया जा सकता है।

2

कई विकल्पों के साथ चारों ओर toying के बाद, मेरा मानना ​​है कि यह पता लगाने अगर एक वस्तु एक खिड़की पार ब्राउज़र है के लिए सबसे सही तरीका है:,

(function() { 
    "use strict"; 
    var wStr; 
    wStr = Object.prototype.toString.call(window); 
    function isWindow(arg) { 
     var e, 
      str, 
      self, 
      hasSelf; 
     //Safari returns DOMWindow 
     //Chrome returns global 
     //Firefox, Opera & IE9 return Window 
     str = Object.prototype.toString.call(arg); 
     switch (wStr) { 
     case '[object DOMWindow]': 
     case '[object Window]': 
     case '[object global]': 
      return str === wStr; 
     } 
     ///window objects always have a `self` property; 
     ///however, `arg.self == arg` could be fooled by: 
     ///var o = {}; 
     ///o.self = o; 
     if ('self' in arg) { 
      //`'self' in arg` is true if 
      //the property exists on the object _or_ the prototype 
      //`arg.hasOwnProperty('self')` is true only if 
      //the property exists on the object 
      hasSelf = arg.hasOwnProperty('self'); 
      try { 
       if (hasSelf) { 
        self = arg.self; 
       } 
       delete arg.self; 
       if (hasSelf) { 
        arg.self = self; 
       } 
      } catch (e) { 
       //IE 7&8 throw an error when window.self is deleted 
       return true; 
      } 
     } 
     return false; 
    } 
}()); 

मैं कुछ और अधिक कठोर इकाई-परीक्षण करने की आवश्यकता होगी तो कृपया मुझे उत्पन्न होने वाली किसी भी असंगतता के बारे में बताएं।

+0

मैंने आपका जवाब अपडेट कर दिया है क्योंकि कोई त्रुटि हुई थी, फिर मैंने इसका परीक्षण किया है और ऐसा लगता है, लेकिन मुझे लगता है कि पहला भाग बहुत ही सीमित है क्योंकि लगभग हर ब्राउज़र के पास खिड़की को स्ट्रिंग में बदलने का अपना तरीका होता है और शायद 3 से अधिक प्रकार होते हैं। – mck89

+0

@ mck89, मैं मुख्य रूप से बड़े 5 से संबंधित हूं: फ़ायरफ़ॉक्स, क्रोम, सफारी, ओपेरा, और आईई। यदि ब्राउज़र '' [ऑब्जेक्ट विंडो] 'का उपयोग करने के लिए सामान्यीकृत होते हैं तो यह बहुत अच्छा होगा, हालांकि ECMAScript5 spec [प्रत्येक ब्राउज़र को वैश्विक वस्तु की '[[वर्ग]] संपत्ति के लिए अपना मूल्य चुनने की अनुमति देता है] (http: //es5.github.com/#x15.1)। उस अर्थ में, हां, यह अपेक्षाकृत प्रतिबंधित कार्यान्वयन है, हालांकि मुझे लगता है कि यह 'arg.self == arg' की जांच करने से कहीं अधिक लचीला है, जिसे आसानी से बेवकूफ़ बना दिया जाता है। – zzzzBov

+0

मैं वास्तव में आपके प्रयास की सराहना करता हूं, लेकिन मुझे आश्चर्य है कि इस सख्त होने की आवश्यकता कौन है। शायद एक लाइब्रेरी इसका उपयोग करेगी, लेकिन यहां तक ​​कि jQuery भी सोचता है कि अगर (obj && टाइप ओबीजे === "ऑब्जेक्ट" और "ओबीजे में सेट इंटरवल") पर्याप्त पर्याप्त है। किसी को कभी भी 'o.self = o' लिखने की आवश्यकता होती है, और यह कितना संभव है कि किसी को यह जांचने की आवश्यकता होगी कि यह' विंडो 'ऑब्जेक्ट है? लचीलापन के लिए, 'सख्त उपयोग' का उपयोग आपके कार्य को 'arg.self === arg' से भी कम लचीला बनाता है क्योंकि एक * टाइपर * * फेंक दिया जाएगा जब आप' कॉन्फ़िगर करने योग्य 'के साथ' स्वयं 'संपत्ति हटाते हैं विशेषता 'झूठी' पर सेट है। –

4

इसे AngularJS स्रोत कोड में मिला। लक्ष्य पर एक लाइनर और धमाका।

return variable && variable.document && variable.location && variable.alert && variable.setInterval; 
+0

जब परिवर्तनीय अपरिभाषित होता है तो यह अपवाद फेंक देगा (क्योंकि फ़ंक्शन वास्तविक/गलत के बजाय अपरिभाषित होता है): उदाहरण के लिए विंडो जांचने के लिए सबसे आसान तरीका है। इस कोणीय जेएस कोड का उपयोग करने के लिए, इसे {} पकड़ने या उसके साथ (टाइपो वेरिएबल! == 'अपरिभाषित') में लपेटें –

0
var x = new Window(); 
x instanceof Window 
var y = [] 
y instanceof Window 
+2

उपयोगकर्ता को पता नहीं चलता है, लेकिन हमने उन्हें बिना खिड़की खोला है ... – redolent

0
let isWindowObj = (anObject instanceof Window); 
संबंधित मुद्दे