核心代码
let observer = null;
let videoDoms = [];
let videoList = ['path/to/video1.mp4', 'path/to/video2.mp4', 'path/to/video3.mp4',];
function observerVideo() {
observer = new IntersectionObserver((entries) => {
entries.forEach((entry) => {
const videoElement = entry.target
if (entry.isIntersecting) {
videoElement.src = videoElement.dataset.src
videoElement.load()
observer.unobserve(videoElement)
videoDoms.push(videoElement)
} else {
videoElement.pause()
videoElement.src = ''
}
})
})
videoList.forEach((v, index) => {
const vElement = document.getElementById(`video${index}`)
if (vElement) {
observer.observe(vElement)
}
})
}
function cancelVideo() {
videoDoms.forEach(item => {
item.src = ''
item.pause()
})
videoDoms = []
}
function clearObserver() {
observer && observer.disconnect()
observer = null
}
原生html使用
document.addEventListener("DOMContentLoaded", () => {
observerVideo()
})
window.addEventListener("unload", () => {
clearObserver;
cancelVideo();
});
vue中使用
onMounted(() => {
observerVideo()
})
onUnMounted(() => {
clearObserver();
cancelVideo();
})