फ़ोकस मॉनिटर · शुरू हो रहा है

ऑनलाइन टैब फ़ोकस डिटेक्टर — पेज छोड़ने पर क्या दर्ज होता है

जाँच हो रही है…

यह दस्तावेज़ अपनी विज़िबिलिटी और फ़ोकस के बारे में क्या बताता है, वह पढ़ा जा रहा है।

टैब बदलिए, दूसरी विंडो पर क्लिक कीजिए या इसे मिनिमाइज़ कीजिए — फिर लौट आइए।

यह पेज आपके अपने ब्राउज़र में वही फ़ोकस और विज़िबिलिटी जाँच चलाता है जो एक ऑनलाइन असेसमेंट या प्रॉक्टरिंग पेज चलाता है। टैब बदलिए, दूसरी विंडो पर क्लिक कीजिए या इसे मिनिमाइज़ कीजिए — और देखिए कि ठीक क्या दर्ज होता है। कुछ भी अपलोड नहीं होता; नीचे दिखने वाला हर आँकड़ा इसी टैब में रहता है।

इवेंट लॉग

टैब बदलिए, दूसरी विंडो पर क्लिक कीजिए या इसे मिनिमाइज़ कीजिए — फिर लौट आइए।

सिग्नल

#समयइवेंटदर्ज स्थितिकितनी देर बाहर
अभी कुछ नहीं। दूसरे टैब पर जाइए या किसी और विंडो पर क्लिक कीजिए, फिर लौट आइए।

यह टेस्ट क्या पढ़ता है

हर ब्राउज़र दो अलग-अलग रीडिंग उजागर करता है। document.visibilityState बताता है कि यह टैब वही है जो दिखाया जा रहा है, और document.hasFocus() बताता है कि कीबोर्ड इनपुट इसी दस्तावेज़ को मिल रहा है। दोनों के लिए किसी अनुमति की ज़रूरत नहीं, और दोनों को बंद नहीं किया जा सकता।

ये दोनों एक ही चीज़ नहीं हैं। दूसरे टैब पर जाने से पेज छिपा हो जाता है। दूसरी ब्राउज़र विंडो, चैट ऐप या टर्मिनल पर क्लिक करने से यह टैब दिखता तो रहता है, पर फ़ोकस चला जाता है — पेज ब्लर होता है, छिपा नहीं।

असेसमेंट प्लेटफ़ॉर्म आम तौर पर दोनों दर्ज करते हैं, अलग-अलग गिनते हैं, और हर अनुपस्थिति की अवधि नापते हैं। नीचे दी गई तालिका वही रिकॉर्ड दिखाती है जो वे बनाते।

किन चीज़ों से यह चलता है

  • दूसरे टैब पर जाना — visibilitychange चलता है और स्थिति hidden हो जाती है। हर जगह दर्ज होता है, फ़ोन पर भी।
  • विंडो मिनिमाइज़ करना, स्क्रीन लॉक करना, या फ़ोन का स्लीप में जाना — यह भी छिपा ही गिना जाता है।
  • किसी और विंडो या ऐप पर क्लिक करना — दूसरी ब्राउज़र विंडो, एडिटर, मैसेजिंग ऐप या लॉन्चर पैनल। टैब दिखता रहता है; इसके बदले विंडो का blur इवेंट चलता है।
  • डेवलपर टूल्स को अलग विंडो में खोलना — यह विंडो बदलना ही माना जाता है, इसलिए blur चलता है।
  • ब्राउज़र का मेमोरी बचाने के लिए टैब को फ़्रीज़ या डिस्कार्ड करना — Chromium पर freeze और pagehide चलते हैं।
  • पेज बंद करना या रीलोड करना — pagehide चलता है, और यही वह इवेंट है जिससे प्लेटफ़ॉर्म अधूरे प्रयास को बंद करते हैं।

ऑनलाइन असेसमेंट से पहले

अगर कोई टेस्ट चेतावनी देता है कि पेज छोड़ना रिकॉर्ड होगा, तो बैठने से पहले यह जान लेना ठीक रहेगा कि इसका असल मतलब क्या है।

  1. यह पेज उसी ब्राउज़र में खोलिए जिसमें आप वाक़ई असेसमेंट देंगे, और खुला रहने दीजिए।
  2. दूसरे टैब पर जाइए और तुरंत लौट आइए। ध्यान दीजिए कि लॉग एक hidden इवेंट और सेकंडों की सटीक संख्या दर्ज करता है।
  3. अब इसके बदले किसी दूसरी विंडो पर क्लिक कीजिए — कोई चैट ऐप या एडिटर। लॉग में blur इवेंट दिखेगा, और टैब कभी छिपा नहीं हुआ।
  4. लॉकआउट ओवरले चालू कीजिए और देखिए कि आपके हटते ही असेसमेंट पेज क्या दिखाता है। कई प्लेटफ़ॉर्म ठीक यही दिखाते हैं।
  5. अनजाने वाली स्थितियों से सावधान रहिए: नोटिफ़िकेशन बैनर, अलग विंडो में खुला पासवर्ड मैनेजर, या कीबोर्ड शॉर्टकट लॉन्चर — सब दर्ज हो जाते हैं।

क्या रिकॉर्ड होता है यह जानना, और उसे मात देना — दोनों अलग बातें हैं। यह पेज बताता है कि रीडिंग क्या है; प्लेटफ़ॉर्म उसे कैसे पढ़ता है, यह उसका फ़ैसला है।

नतीजा कैसे तय होता है

फ़ोकस में — visibilityState visible है और hasFocus() true है। यह टैब स्क्रीन पर है और आपके कीस्ट्रोक ले रहा है।

ब्लर — अब भी दिख रहा है, पर फ़ोकस किसी दूसरी विंडो या ऐप में चला गया है। आप इस टैब को देख रहे हैं पर टाइप कहीं और कर रहे हैं, या कोई विंडो ऊपर आ गई है।

छिपा — टैब रेंडर ही नहीं हो रहा: कोई दूसरा टैब सामने है, विंडो मिनिमाइज़ है, या डिवाइस की स्क्रीन बंद है।

अनुपस्थिति का समय पहले उस इवेंट से शुरू होता है जो फ़ोकस हटाता है, और तब रुकता है जब दोनों रीडिंग फिर से सही हो जाती हैं — इसलिए एक blur जो आगे चलकर टैब बदलना बन जाए, उसे एक ही लगातार अनुपस्थिति गिना जाता है।

यह क्या नहीं देख सकता

इनमें से कोई रीडिंग यह नहीं बताती कि आप कहाँ गए। पेज को बस इतना पता चलता है कि यह टैब सक्रिय नहीं रहा और कितनी देर तक — कौन-सा टैब, कौन-सा ऐप या स्क्रीन पर क्या था, यह कभी नहीं।

ब्राउज़र के बाहर जो कुछ भी कीबोर्ड फ़ोकस हटाए बिना होता है, वह इस API के लिए अदृश्य है, क्योंकि चलाने को कोई इवेंट ही नहीं होता। इसमें दूसरा भौतिक उपकरण, छपा हुआ कागज़, या कमरे में मौजूद कोई और व्यक्ति शामिल है।

अकेली गिनती किसी बात का सबूत नहीं है। फ़ोकस छीनता नोटिफ़िकेशन, स्क्रीन रीडर पैनल, सिस्टम अपडेट का संकेत और जानबूझकर टैब बदलना — सब एक ही इवेंट पैदा करते हैं।

गंभीर प्रॉक्टरिंग सिर्फ़ इसी पर निर्भर नहीं करती। कैमरा, माइक्रोफ़ोन, स्क्रीन शेयर और इंस्टॉल किए जाने वाले लॉकडाउन ब्राउज़र एक वेब पेज से कहीं ज़्यादा देखते हैं — एक और रीडिंग जो पेज बिना पूछे ले सकता है, उसके लिए देखें एक्सटर्नल मॉनिटर डिटेक्शन टेस्ट।

निजता

यह पेज स्टैटिक है। इसमें न एनालिटिक्स है, न कुकीज़, न लोकल स्टोरेज, और लोड होने के बाद यह कोई नेटवर्क अनुरोध नहीं करता।

इस पेज का हर काउंटर और हर टाइमस्टैम्प आपके टैब के भीतर गिना जाता है और टैब बंद करते ही मिट जाता है। रीलोड करने पर सब कुछ रीसेट हो जाता है।

आप इसे पूरा पढ़ सकते हैं: यह जावास्क्रिप्ट की एक ही फ़ाइल है, जिसका लिंक फ़ुटर में है।

ब्राउज़र समर्थन

visibilitychange और document.hasFocus() हर मौजूदा ब्राउज़र में, डेस्कटॉप और मोबाइल दोनों पर काम करते हैं — बिना किसी अनुमति और बिना सुरक्षित ऑरिजिन की शर्त के।

freeze और resume सिर्फ़ Chromium में हैं, और तब चलते हैं जब ब्राउज़र मेमोरी बचाने के लिए बैकग्राउंड टैब रोक देता है। बाक़ी ब्राउज़र इन्हें कभी रिपोर्ट ही नहीं करते।

iOS पर ऐप बदलना ब्लर नहीं, बल्कि छिपा दर्ज होता है, क्योंकि पूरा ब्राउज़र ही बैकग्राउंड में चला जाता है। दोनों का यह भेद सिर्फ़ वहीं है जहाँ विंडो होती हैं।

अक्सर पूछे जाने वाले सवाल

क्या कोई वेबसाइट पता लगा सकती है कि मैंने टैब बदला?

हाँ, और इसके लिए किसी अनुमति की ज़रूरत नहीं। जिस क्षण आपका टैब दिखने वाला टैब नहीं रहता, visibilitychange इवेंट चल जाता है, और आपके लौटने तक document.visibilityState hidden बताता रहता है। हर मौजूदा ब्राउज़र इसे लागू करता है, मोबाइल वाले भी। ऐसी कोई सेटिंग नहीं जो इसे पेज से छिपा दे।

क्या ऑनलाइन असेसमेंट टैब बदलने और दूसरा ऐप खोलने में फ़र्क़ कर सकता है?

हाँ। टैब बदलने से पेज छिपा हो जाता है; दूसरी विंडो या ऐप पर क्लिक करने से पेज दिखता तो रहता है पर कीबोर्ड फ़ोकस हट जाता है, जिससे blur इवेंट चलता है। जो प्लेटफ़ॉर्म दोनों दर्ज करता है वह इन्हें अलग-अलग पहचान सकता है, और यह पेज दोनों को अलग दिखाता है ताकि आप ख़ुद फ़र्क़ देख सकें।

क्या ऑनलाइन टेस्ट को पता चलता है कि मैं किस टैब या ऐप पर गया?

नहीं। ब्राउज़र पेज को सिर्फ़ इतना बताता है कि वह अब सक्रिय दस्तावेज़ नहीं रहा और यह कितनी देर चला। मंज़िल — दूसरा टैब, दूसरा प्रोग्राम, लॉक स्क्रीन — कभी उजागर नहीं होती। इससे ज़्यादा ब्योरे के लिए स्क्रीन शेयर या इंस्टॉल किया हुआ लॉकडाउन ब्राउज़र चाहिए, और दोनों दिखाई देते हैं तथा दोनों की मंज़ूरी लेनी पड़ती है।

क्या स्क्रीनशॉट लेना पेज छोड़ना गिना जाता है?

यह पूरी तरह इस पर निर्भर है कि स्क्रीनशॉट कैसे लिया गया। ऐसा शॉर्टकट जिसे ऑपरेटिंग सिस्टम बिना अपने किसी इंटरफ़ेस के संभालता है, कुछ नहीं चलाता, क्योंकि ब्राउज़र का फ़ोकस कभी जाता ही नहीं। पर जो कुछ भी कोई पिकर, पैनल या प्रीव्यू विंडो खोलता है, वह फ़ोकस ले लेता है और वह blur के रूप में दर्ज होता है। इसी पेज पर दोनों आज़माइए और लॉग देखिए।

मैंने टैब नहीं बदला, फिर भी काउंटर क्यों बढ़ा?

फ़ोकस लोगों की उम्मीद से ज़्यादा चीज़ें छीनती हैं: नोटिफ़िकेशन बैनर, पासवर्ड मैनेजर के पॉप-अप, सिस्टम अपडेट का संकेत, कीबोर्ड शॉर्टकट लॉन्चर, या अपनी अलग विंडो में खुले डेवलपर टूल्स। ये सब ऐसा blur इवेंट चलाते हैं जिसे जानबूझकर किए गए बदलाव से अलग नहीं किया जा सकता।

क्या ब्राउज़र सेटिंग्स में इस डिटेक्शन को बंद किया जा सकता है?

नहीं। Page Visibility API दस्तावेज़ का ही हिस्सा है, कोई अनुमति नहीं, इसलिए रद्द करने को कुछ है ही नहीं। इसे रोकने से वे जायज़ इस्तेमाल टूट जाएँगे जिनमें बैकग्राउंड टैब में वीडियो रोकना, एनिमेशन थामना और टाइमर बंद करना शामिल है।

क्या दूसरा मॉनिटर लगाने से टैब बदलना दर्ज होना रुक जाता है?

नहीं। नज़र दूसरी स्क्रीन पर ले जाने से कुछ नहीं बदलता, पर उस स्क्रीन की किसी विंडो पर क्लिक करते ही इस टैब से कीबोर्ड फ़ोकस हट जाता है और ठीक वैसा ही blur इवेंट चलता है जैसा एक ही स्क्रीन पर चलता। दूसरी स्क्रीन ख़ुद पेज को दिखती है या नहीं, यह अलग सवाल है जिसे एक्सटर्नल मॉनिटर डिटेक्शन टेस्ट देखता है।

क्या इसमें से कुछ सर्वर पर भेजा जाता है?

नहीं। यह पेज स्टैटिक है, इसमें न एनालिटिक्स है न कुकीज़, और लोड होने के बाद यह कोई नेटवर्क अनुरोध नहीं करता। दिखाया गया हर इवेंट और टाइमर आपके टैब के भीतर गिना जाता है और टैब बंद करते ही हटा दिया जाता है।