wx.createSelectorQuery获取元素的top有问题
发布于 5 年前 作者 lei40 10789 次浏览 来自 问答
wx.createSelectorQuery().select(id).fields({
dataset: true,
   size: true,
   rect:true,
   scrollOffset: true,
   properties: ['scrollX', 'scrollY']
}, function(res){
// res.dataset    // 节点的dataset
   // res.width      // 节点的宽度
   // res.height     // 节点的高度
   // res.scrollLeft // 节点的水平滚动位置
   // res.scrollTop  // 节点的竖直滚动位置
   // res.scrollX    // 节点 scroll-x 属性的当前值
   // res.scrollY    // 节点 scroll-x 属性的当前值
   reslove(res);
}).exec()

这里省略了promise代码.

一直搞不懂这个top值,后来看了文档解释说 是相对于显示区域,以像素为单位,

在目前测试的时候发现了一些问题, 每次取的值都不一样. 比如 我绑定 focus和bulr事件 当元素多的超出一个手机的高度获取就有问题了.


比如 同一个elem 在滚动条为0的情况下 获取的是 30px, 滚动条滚动到屏幕(整个元素) 最下方 获取的是 top:-1679s.


当然 根据官方的解释说 相对于显示区域,这些都没毛病,但是当某些情况, 比如我要做表单验证 而且字段数量比较多的时候, 绑定了 bulr和focus 和日期的选择 单选,多选的情况下 某些时候 你滚动条在同一个时刻 获取的top都是不一样的 focus获取的是一个top, bulr获取的是一个top. 就没办法给我们提供个scrollTop的东西么. 相对于整个page而言的, 有试过曲线救国 使用 scroll-view组件, 但是textarea有很大的问题 就放弃了. 官方不打算进行修复或者说给我增加一个相对于page的一个定位么?


5 回复

怎么解决的,这个top的值我看了一下午也计算不来到底怎么算的…

//console.log('firstFiled',firstFiled);
Promise.all([this.getFields(`#f-${firstFiled.formIndex}-${firstFiled.filed.key}`),this.getScrollOffset()]).then((res)=>{
let fieldRes=res[0];
   let pageRes=res[1];
   // console.log('错误字段res',res,firstFiled,`#f-${firstFiled.formIndex}-${firstFiled.filed.key}`);
   wx.pageScrollTo({scrollTop:fieldRes.top+pageRes.scrollTop});

})


getScrollOffset: function(){
return new Promise((reslove,reject)=>{
wx.createSelectorQuery().selectViewport().scrollOffset(function(res){
reslove(res);
       }).exec()
})

},


解决

这个问题结合wx.pageScrollTo会出现很魔性的一面,各种滚动出问题.定位不准确.

看来没人回复 准备换其他方式了

有考虑过this.setData渲染问题. 试过利用setTimeout,1000来做延迟动画 还是一样.

回到顶部