ラボ > Javascript関連:イベント関連
対象が表示されたら何かしたい(IntersectionObserver())
作成日:2024-06-09, 更新日:2024-06-09
さんぷる
class afterDisplayUtility { constructor(options = {}) { const defaults = { root: null, rootMargin: '10px', // 表示領域外の〇pxから検出。 / 10px: 10pxスクロールしたら検出 threshold: 0.1, // 対象が何%表示で監視するか? / 0.1: 10%表示で処理開始 }; this.options = { ...defaults, ...options }; this.handleIntersect = this.handleIntersect.bind(this); this.obs = new IntersectionObserver(this.handleIntersect, this.prms); } run_AfterDisplay(elm) { // 表示されたら実行する処理 console.log('Drawing control panel for', elm.textContent); } run_observe(elm_many) { // 監視開始 this.obs.disconnect(); // 再実行を考慮していったん解除 for (let row_elm of elm_many) { this.obs.observe(row_elm); }; } add_observe(elm) { // 監視追加 if ( elm ) { return; } this.obs.observe(elm); } remove_observe(elm) { // 監視解除 this.obs.unobserve(elm); } handleIntersect(entries, observer){ entries.forEach(entry => { if (entry.isIntersecting) { this.run_AfterDisplay(entry.target); // this.obs.unobserve(entry.target); // 必要に応じてアンオブザーブ } }); } } util_afterDisplay = new afterDisplayUtility(); util_afterDisplay.run_afterDisplay = function(elm) { console.log('Drawing control panel for'); } util_afterDisplay.run_observe(document.querySelectorAll('.hoge')); // あとで要素を追加・削除したとき // util_afterDisplay.add_observe(document.querySelector('#aa')); // util_afterDisplay.remove_observe(document.querySelector('#aa'));