产品但愿看到投放出去的活动页,用户对其页面内的什么信息比较感兴趣,对什么信息彻底不感兴趣。=> 计算页面内每模块的停留时间git
第一次听到这个需求,个人大脑开始疯狂运转,而后想到了plan 1, plan 2, plan3...中间还有不少失败想法我已经忘记了,这里方案三是我最终采用的方法。
若是你们有什么更好的想法,欢迎赐教,真心的!!!github
var bodyChildrenLists = $('body').children()
var bodyChildDomLsit = []
var initHeight = 0
for (var i = 0; i < bodyChildrenLists.length; i++) {
if (bodyChildrenLists[i].tagName !== 'SCRIPT') {
bodyChildDomLsit.push({
className: bodyChildrenLists[i].className,
height: bodyChildrenLists[i].offsetHeight
})
}
}
复制代码
存在的问题: 不一样人的代码风格差别性大,该方案不适合这类代码风格数组
<body>
<div class="container">
<div class="header"></div>
<div class="nav"></div>
<div class="footer"></div>
</div>
</body>
复制代码
这种方式很好,就是,,,若是你们的代码风格很一致的状况下使用比较好。浏览器
var scrollTop = 0
var time = Date.now()
window._stayStatus = {
// 记录运动轨迹, down > 1 向下移动 down 向上移动, sliderDis 移动距离, time 移动耗时, initDis 初始距离, initTime 初始时间
moveData: [],
enterTime: Date.now()
}
var moveData = window._stayStatus.moveData
var currentMoveIndex = 0
function move () {
var currentTime = Date.now()
var currentScrollTop = $(window).scrollTop()
var dis = currentScrollTop - scrollTop
var disTime = currentTime - time
// 上一次滑动页面和此次滑动页面的时间差大于100ms,就视做用户在某一个段时间作了停留
if (disTime > 100) {
if (moveData[currentMoveIndex] && moveData[currentMoveIndex].down === 0) {
moveData[currentMoveIndex].time += disTime
} else {
moveData.push({
down: 0,
initTime: time, // initTime表示进入该状态的初始时间
initDis: currentScrollTop, //initDis 表示进入该状态的初始位置
sliderDis: dis, // 在该状态内滑动的距离
time: disTime // 在该状态经历的时间(ms)
})
}
} else {
// 向下滑动
if (dis >= 0) {
// 若是以前已是向下滑动的状态,只须要在原来的数据上累加滑动距离和滑动时间
if (moveData[currentMoveIndex] && moveData[currentMoveIndex].down > 0) {
moveData[currentMoveIndex].sliderDis += dis
moveData[currentMoveIndex].time += disTime
} else {
moveData.push({
down: 1,
initTime: currentTime,
initDis: currentScrollTop,
sliderDis: dis,
time: disTime
})
}
} else {
if (moveData[currentMoveIndex] && moveData[currentMoveIndex].down < 0) {
moveData[currentMoveIndex].sliderDis += dis
moveData[currentMoveIndex].time += disTime
} else {
moveData.push({
down: -1,
initTime: currentTime,
initDis: currentScrollTop,
sliderDis: dis,
time: disTime
})
}
}
}
currentMoveIndex = moveData.length - 1
time = currentTime
scrollTop = currentScrollTop
}
window.onscroll = function (e) {
move()
}
复制代码
根据以上方法获取到的数据以下: 1559048450563_图片.png bash
存在的问题: 最后获得的数据量虽然不会很大,可是将这样的数据给数据组分析,存在必定的难度。这是在没有和产品对接时,本身想的办法,有点想复杂了。可是这种方式能够比较生动模拟出用户的行为。app
与个人产品对接了基本的规定:dom
根据上面的要求我作了一个demo,能够清晰看到我计算效果,连接可看 munan2.github.io/computeStay…ide
根据以上需求,个人代码如:ui
new Vue({
el: '#app',
data: {
movedata: [],
scrollTop: $(window).scrollTop(),
time: Date.now(),
stayTime: 0
},
mounted () {
// 部分页面存在页面滚动到某一高度时,刷新后页面也会固定在该高度的问题,初始化movedata数据
var index = parseInt(this.scrollTop / 1300) + 1
for (var i = 0; i <= index; i++) {
this.movedata.push({
pos: i * 1300,
time: 0
})
}
window.onscroll = () => {
this.scrollTop = $(window).scrollTop()
}
setInterval(() => {
var currentTime = Date.now()
var disTime = currentTime - this.time
// 计算当前是展示在屏幕中的模块序号
var currentIndex = parseInt(this.scrollTop / 1300)
// 计算当前的滚动高度超出满屏的多少
var length = this.movedata.length
if (currentIndex + 1 >= length) {
for (var i = length; i <= currentIndex + 1; i++) {
this.movedata.push({
pos: 1300 * i,
time: disTime
})
}
} else {
var modeDis = this.scrollTop - this.movedata[currentIndex].pos
if ((1300 - modeDis) > 400) {
this.movedata[currentIndex].time += disTime
}
if (modeDis > 400) {
this.movedata[currentIndex + 1].time += disTime
}
}
this.time = currentTime
}, 1000)
}
})
复制代码
该方法的核心思想:this
step6的计算思想可概括为图片:
使用该方法的缘由:
该方法的缺点: 该方法没办法模拟到用户进入到一个页面的全部行为,若是须要这样的需求,第二种方案比较好