← Back to JavaScript Course | Chapter 10: DOM Advanced | Lesson 4 of 8

JS का IntersectionObserver

IntersectionObserver आपको बताता है कि कब कोई element scroll करके view में आता है, जैसे कोई spotter जो कहे 'चिड़िया आ गई'। यह images को सिर्फ ज़रूरत पड़ने पर load करने के लिए उपयोगी है।
Syntax
javascript
const observer = new IntersectionObserver(entries => {
  // entry.isIntersecting
}, { threshold: 0.5 });
observer.observe(element);

IntersectionObserver क्या है?

IntersectionObserver यह पता लगाता है कि कब कोई element एक visible area में आता है या उससे निकलता है। यह lazy loading और scroll effects के लिए उपयोगी है।

हर scroll event पर manually element positions calculate करने के उलट, IntersectionObserver main thread को block किए बिना asynchronously और कुशलता से चलता है।

उदाहरण: What Is IntersectionObserver?

javascript
<div id="target" style="margin-top: 2000px;">Scroll to me</div>
<script>
  // Declare the constant `observer` as a new `IntersectionObserver` instance
  const observer = new IntersectionObserver(() => console.log("Visibility changed"));
  // Call `observer.observe(document.getElementById("target"))`
  observer.observe(document.getElementById("target"));
</script>

Visibility जांचना

isIntersecting property आपको बताती है कि target अभी observation area को intersect कर रहा है या नहीं।

हर callback invocation को entries की एक array मिलती है, क्योंकि एक observer कई targets देख सकता है और जिनकी भी intersection state बदली हो उनकी रिपोर्ट दे सकता है।

उदाहरण: Checking Visibility

javascript
<div id="target">Target</div>
<script>
  // Declare the constant `observer` as a new `IntersectionObserver` instance
  const observer = new IntersectionObserver((entries) => {
    // Call `entries.forEach(entry => console.log("Visible:", entry.isIntersecting))`
    entries.forEach(entry => console.log("Visible:", entry.isIntersecting));
  });
  // Call `observer.observe(document.getElementById("target"))`
  observer.observe(document.getElementById("target"));
</script>

Threshold इस्तेमाल करना

एक threshold नियंत्रित करता है कि callback trigger होने से पहले target का कितना हिस्सा visible होना चाहिए। उदाहरण के लिए threshold को 0.5 सेट करना callback को सिर्फ तभी fire करता है जब target element का कम से कम आधा हिस्सा visible हो, किसी भी pixel के दिखते ही नहीं।

उदाहरण: Using Threshold

javascript
<div id="target">Target</div>
<script>
  // Declare the constant `observer` as a new `IntersectionObserver` instance
  const observer = new IntersectionObserver((entries) => {
    // Print `"At least half visible:", entries[0].isIntersecting` to the console
    console.log("At least half visible:", entries[0].isIntersecting);
  }, { threshold: 0.5 });
  // Call `observer.observe(document.getElementById("target"))`
  observer.observe(document.getElementById("target"));
</script>

Lazy Loading का Idea

IntersectionObserver किसी element के visible area के पास आने पर ही काम शुरू कर सकता है। यही ठीक-ठीक तरीका है जिससे modern lazy-loading images काम करती हैं: असली image source सिर्फ तभी request होता है जब placeholder scroll करके view में आता है।

उदाहरण: Lazy Loading Idea

javascript
<img id="photo" data-src="photo.jpg" alt="Lazy image">
<script>
  // Declare the constant `observer` as a new `IntersectionObserver` instance
  const observer = new IntersectionObserver((entries) => {
    entries.forEach(entry => {
      // Check whether `entry.isIntersecting`
      if (entry.isIntersecting) {
        // Assign `entry.target.dataset.src` to `entry.target.src`
        entry.target.src = entry.target.dataset.src;
        // Call `observer.unobserve(entry.target)`
        observer.unobserve(entry.target);
      }
    });
  });
  // Call `observer.observe(document.getElementById("photo"))`
  observer.observe(document.getElementById("photo"));
</script>

Observation रोकना

एक target के लिए unobserve इस्तेमाल करें या सभी targets को observe करना बंद करने के लिए disconnect। किसी element को देखने की ज़रूरत न रहने पर unobserve या disconnect से clean up करना observer को अनिश्चित काल तक अनावश्यक काम करने से रोकता है।

उदाहरण: Stopping Observation

javascript
<div id="target">Target</div>
<script>
  const observer = new IntersectionObserver(() => console.log("changed"));
  const el = document.getElementById("target");
  observer.observe(el);
  observer.unobserve(el); // stop watching this one element
</script>
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. observer.observe(element) कॉल करना भूल जाना, इसलिए callback कभी नहीं चलता।
  2. invalid threshold इस्तेमाल करना, जैसे threshold: 2, जो RangeError throw करता है क्योंकि यह 0 और 1 के बीच होना चाहिए।
  3. lazy loading के बाद unobserve() कॉल न करना, इसलिए callback चलता रहता है।
🔒

Chapter Quiz — Complete all 8 topics to unlock

0/8 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.