visually.ts
export default (Vue) => {
const options = {
root: null,
threshold: 1
}
const timer = {}
const callback = (entries, observer) => {
entries.forEach(entry => {
let visuallyData = null
try {
visuallyData = JSON.parse(entry.target.getAttribute('visually-data'))
} catch (e) {
visuallyData = null
console.error('埋点数据格式异常', e)
}
if (!visuallyData) {
observer.unobserve(entry.target)
return
}
if (entry.isIntersecting) {
timer[visuallyData.id] = setTimeout(function () {
}, 5000)
} else {
if (timer[visuallyData.id]) {
clearTimeout(timer[visuallyData.id])
timer[visuallyData.id] = null
}
}
})
}
const observer = new IntersectionObserver(callback, options)
const visuallyList = []
const addListenner = (ele, binding) => {
if (visuallyList.indexOf(binding.value) !== -1) return
observer.observe(ele)
}
const removeListener = (ele) => {
observer.unobserve(ele)
}
Vue.directive('visually', {
bind: addListenner,
unbind: removeListener
})
}
注册
import visually from '@/directives/visually'
Vue.use(visually)
使用
<h1
v-visually
:visually-data="JSON.stringify({a:1,b:2})"
style="border: 1px solid red;"
>
This is an about page
</h1>