收藏
回答

wx.createSelectorQuery()返回的结果是null

框架类型 API/组件名称 终端类型 操作系统 微信版本 基础库版本
小程序 createSelectorQuery 客户端 iOS 6.6.1 1.9.1

在做一个滚动到指定位置的动能时(wx.pageScrollTo),想获取某个元素的定位,使用wx.createSelectorQuery().exec()。

运行官方demo代码时,查找id为'empty'的元素,在回调中打印结果,为什么res[0]是null,而第二次调用时才有结果?

Page({

 queryMultipleNodes: function(){    

    var query = wx.createSelectorQuery()

   query.select('#empty').boundingClientRect()    query.selectViewport().scrollOffset()

   query.exec(function(res){

      console.log(res)    

     res[0].top       // #the-id节点的上边界坐标  这里是null      res[1].scrollTop // 显示区域的竖直滚动位置    })  } })


回答关注问题邀请回答
收藏

9 个回答

  • herock
    herock
    2019-01-23

    被同样的问题折磨了好久,测试情况如下:


    1. 在Page的onLoad、onReady、onShow等事件中调用,均返回null

    2. 如果在操作事件回调中(比如在某个按钮的bindtap中调用),则可以正常返回数据


    初步判断,应该是页面较为复杂时,onLoad、onReady、onShow等事件均不能保证想要获取的节点已经载入,所以获取不到。


    有的人使用定时器来解决,也就是页面载入后延时几秒钟才去获取,但我觉得这种方法太丑陋了,而且依然有失败的可能。


    我的解决方案是在某个耗时较久的异步事件的成功回调中调用,比如我要动态计算高度的view是用于装载某个数据列表的,那么我就在获取这个异步数据的成功回调中获取所需计算的wxml节点的信息,然后再设置所需的高度。

    2019-01-23
    有用 7
    回复 5
    • Edwin
      Edwin
      2019-03-05

      bind:myevent的时候,也遇到类似情况,第一个返回null。欲哭无泪

      2019-03-05
      回复
    • 司徒
      司徒
      2019-05-05

      感谢大神! 琢磨了半天看到你的评论,瞬间醒悟。

      2019-05-05
      回复
    • ccccc
      ccccc
      2021-01-13
      亲测有效,自定义组件也可以,👍
      2021-01-13
      回复
    • 罗辑
      罗辑
      2021-12-23回复Edwin
      我也是,咋搞
      2021-12-23
      回复
    • 楚念悠
      楚念悠
      2022-03-12
      感谢大神!!!
      2022-03-12
      回复
  • 神经蛙
    神经蛙
    2018-09-12

    页面渲染时间,onLoad > onShow > onReady, 如果页面由动态数据加载渲染,有可能是数据还没有渲染成功。onReady代表页面框架加载完毕,此时数据渲染不一定完成,可以用  setTimeout 延迟获取


    2018-09-12
    有用 4
    回复
  • 蜗牛快跑
    蜗牛快跑
    2019-05-30

    这个问题这么早就有啦?官方都不解决的吗?

    2019-05-30
    有用 1
    回复 5
    • Mind
      Mind
      2020-08-14
      2020了 好像还没解决
      2020-08-14
      回复
    • ihcy
      ihcy
      2021-03-07
      2021年了,微信版本8.0.1,基础库版本2.15.0[510],还没解决,目前只能在请求数据后在数据返回来时进行计算!!!
      2021-03-07
      回复
    • ihcy
      ihcy
      2021-03-07回复ihcy
      刚重新看了下逻辑,自己还是有些使用不当的,选择的元素一开始我是使用wx:if=“{{dataShow}}”来控制显示的,并且是dataShow: false的,但我设置为true也是不行,删除wx:if后才在onReady中有数据打印出来,这显然是对的。可在开发工具中无论如何设置都是有数据打印出来的,这就让我很无奈了。
      2021-03-07
      回复
    • 世梦~天蝎
      世梦~天蝎
      2023-08-25
      2023了
      2023-08-25
      回复
    • App_spring_think
      App_spring_think
      08-19
      2024了
      08-19
      回复
  • A金箱子18811889187
    A金箱子18811889187
    2022-10-15

    这是一个跟时间有关的函数。

    必须 和 setTimeout 联合用,而且时间最少 1000ms,要不然不起效果

    你只能假定用户1秒内不动作

    2022-10-15
    有用
    回复
  • A.D
    A.D
    2018-08-30

    实测自定义组件中,在ready之后调用才能拿到正确的值

    2018-08-30
    有用
    回复 1
    • fanta
      fanta
      2021-05-13
      不可以
      2021-05-13
      回复
  • 郭玉峰 15811200580
    郭玉峰 15811200580
    2018-06-27

    是不是setData后同步调用的啊 setData是一个异步的方法  有没有可能是元素当时还没生成?

    2018-06-27
    有用
    回复
  • 🤔
    🤔
    2018-05-08

    感觉官方都不回复的

    2018-05-08
    有用
    回复
  • 😼
    😼
    2018-02-26

    没有,坐等官方回复

    2018-02-26
    有用
    回复
  • 道尔
    道尔
    2018-02-26

    问题解决了吗?

    2018-02-26
    有用
    回复
登录 后发表内容