|
|
@ -63,6 +63,7 @@ Page({ |
|
|
partnerstatus: '', |
|
|
partnerstatus: '', |
|
|
viewedGoods: [], // 已浏览商品ID列表
|
|
|
viewedGoods: [], // 已浏览商品ID列表
|
|
|
isInPersonnel: false, // 用户手机号是否在personnel表中
|
|
|
isInPersonnel: false, // 用户手机号是否在personnel表中
|
|
|
|
|
|
videoPlaybackStates: {}, // 视频播放状态,键为videoId,值为是否在视口内
|
|
|
|
|
|
|
|
|
// 广告轮播图数据
|
|
|
// 广告轮播图数据
|
|
|
adCarouselList: [ |
|
|
adCarouselList: [ |
|
|
@ -605,6 +606,11 @@ Page({ |
|
|
this.loadGoods() |
|
|
this.loadGoods() |
|
|
this.checkPhoneInPersonnel() |
|
|
this.checkPhoneInPersonnel() |
|
|
|
|
|
|
|
|
|
|
|
// 页面加载完成后检查视频是否在视口内
|
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
this.checkVideosInViewport(); |
|
|
|
|
|
}, 1000); |
|
|
|
|
|
|
|
|
// 计算搜索区域高度
|
|
|
// 计算搜索区域高度
|
|
|
setTimeout(() => { |
|
|
setTimeout(() => { |
|
|
const query = wx.createSelectorQuery(); |
|
|
const query = wx.createSelectorQuery(); |
|
|
@ -1157,6 +1163,11 @@ Page({ |
|
|
// soldOutPage 已经在 loadSoldOutData 函数中直接更新
|
|
|
// soldOutPage 已经在 loadSoldOutData 函数中直接更新
|
|
|
page: this.data.isQueryingSoldOut ? this.data.page : this.data.page + 1, |
|
|
page: this.data.isQueryingSoldOut ? this.data.page : this.data.page + 1, |
|
|
lastDataTimestamp: new Date().getTime() |
|
|
lastDataTimestamp: new Date().getTime() |
|
|
|
|
|
}, () => { |
|
|
|
|
|
// 商品数据加载完成后检查视频是否在视口内
|
|
|
|
|
|
setTimeout(() => { |
|
|
|
|
|
this.checkVideosInViewport(); |
|
|
|
|
|
}, 500); |
|
|
}) |
|
|
}) |
|
|
|
|
|
|
|
|
// 检查过滤后的非广告商品数量,如果不足6个,则自动触发上拉加载更多
|
|
|
// 检查过滤后的非广告商品数量,如果不足6个,则自动触发上拉加载更多
|
|
|
@ -2515,6 +2526,9 @@ Page({ |
|
|
|
|
|
|
|
|
// 搜索框始终固定显示,不做隐藏处理
|
|
|
// 搜索框始终固定显示,不做隐藏处理
|
|
|
|
|
|
|
|
|
|
|
|
// 检查视频是否在视口内并控制播放
|
|
|
|
|
|
this.checkVideosInViewport(); |
|
|
|
|
|
|
|
|
// 侧边栏按钮显示逻辑
|
|
|
// 侧边栏按钮显示逻辑
|
|
|
// 下滑时隐藏按钮(除非用户未手动隐藏过且在顶部)
|
|
|
// 下滑时隐藏按钮(除非用户未手动隐藏过且在顶部)
|
|
|
if (isScrollingDown && scrollTop > threshold && !this.data.sidebarBtnHidden) { |
|
|
if (isScrollingDown && scrollTop > threshold && !this.data.sidebarBtnHidden) { |
|
|
@ -2652,6 +2666,86 @@ Page({ |
|
|
} |
|
|
} |
|
|
}, |
|
|
}, |
|
|
|
|
|
|
|
|
|
|
|
// 检查视频是否在视口内并控制播放
|
|
|
|
|
|
checkVideosInViewport: function () { |
|
|
|
|
|
const filteredGoods = this.data.filteredGoods; |
|
|
|
|
|
if (!filteredGoods || filteredGoods.length === 0) return; |
|
|
|
|
|
|
|
|
|
|
|
const query = wx.createSelectorQuery(); |
|
|
|
|
|
|
|
|
|
|
|
// 为每个视频元素创建单独的查询
|
|
|
|
|
|
filteredGoods.forEach((item, index) => { |
|
|
|
|
|
if (item.mediaItems && item.mediaItems.length > 0 && item.mediaItems[0].type === 'video') { |
|
|
|
|
|
query.select(`#video-${item.id}`).boundingClientRect(); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
query.exec((res) => { |
|
|
|
|
|
if (!res) return; |
|
|
|
|
|
|
|
|
|
|
|
const viewportHeight = wx.getSystemInfoSync().windowHeight; |
|
|
|
|
|
const videoPlaybackStates = {}; |
|
|
|
|
|
const visibleVideos = []; |
|
|
|
|
|
let videoIndex = 0; |
|
|
|
|
|
|
|
|
|
|
|
// 遍历所有商品,收集可见的视频
|
|
|
|
|
|
filteredGoods.forEach((item, itemIndex) => { |
|
|
|
|
|
if (!item.mediaItems || !item.mediaItems.length || item.mediaItems[0].type !== 'video') { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// 获取对应的视频矩形
|
|
|
|
|
|
const videoRect = res[videoIndex]; |
|
|
|
|
|
videoIndex++; |
|
|
|
|
|
|
|
|
|
|
|
if (!videoRect) return; |
|
|
|
|
|
|
|
|
|
|
|
const videoId = `video-${item.id}`; |
|
|
|
|
|
|
|
|
|
|
|
// 计算视频在视口中的可见比例
|
|
|
|
|
|
const videoHeight = videoRect.height; |
|
|
|
|
|
const visibleTop = Math.max(0, videoRect.top); |
|
|
|
|
|
const visibleBottom = Math.min(viewportHeight, videoRect.bottom); |
|
|
|
|
|
const visibleHeight = Math.max(0, visibleBottom - visibleTop); |
|
|
|
|
|
const visibilityRatio = visibleHeight / videoHeight; |
|
|
|
|
|
|
|
|
|
|
|
// 检查视频是否在视口内
|
|
|
|
|
|
const isInViewport = visibilityRatio > 0.25; |
|
|
|
|
|
|
|
|
|
|
|
if (isInViewport) { |
|
|
|
|
|
visibleVideos.push({ videoId, visibilityRatio }); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
videoPlaybackStates[videoId] = isInViewport; |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 按可见比例排序,选择前2个视频播放
|
|
|
|
|
|
visibleVideos.sort((a, b) => b.visibilityRatio - a.visibilityRatio); |
|
|
|
|
|
const videosToPlay = visibleVideos.slice(0, 2).map(v => v.videoId); |
|
|
|
|
|
|
|
|
|
|
|
// 控制视频播放/暂停
|
|
|
|
|
|
filteredGoods.forEach((item, itemIndex) => { |
|
|
|
|
|
if (!item.mediaItems || !item.mediaItems.length || item.mediaItems[0].type !== 'video') { |
|
|
|
|
|
return; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const videoId = `video-${item.id}`; |
|
|
|
|
|
const videoContext = wx.createVideoContext(videoId); |
|
|
|
|
|
|
|
|
|
|
|
if (videosToPlay.includes(videoId)) { |
|
|
|
|
|
videoContext.play(); |
|
|
|
|
|
} else { |
|
|
|
|
|
videoContext.pause(); |
|
|
|
|
|
} |
|
|
|
|
|
}); |
|
|
|
|
|
|
|
|
|
|
|
// 更新视频播放状态
|
|
|
|
|
|
this.setData({ |
|
|
|
|
|
videoPlaybackStates: videoPlaybackStates |
|
|
|
|
|
}); |
|
|
|
|
|
}); |
|
|
|
|
|
}, |
|
|
|
|
|
|
|
|
// 图片加载完成事件
|
|
|
// 图片加载完成事件
|
|
|
onImageLoad(e) { |
|
|
onImageLoad(e) { |
|
|
console.log('图片加载完成:', e); |
|
|
console.log('图片加载完成:', e); |
|
|
|