formId的获取在开发者工具和真机表现不同,真机中会被跳转事件阻断?
发布于 6 年前 作者 xiafang 14768 次浏览 来自 问答

写了一个通用组件用于收集formId,因为一个页面需要一个formId就可以了,所以写了个通用的套在页面外边,页面中原来的逻辑很多,有跳转有弹窗也有单纯的展示。submitHandler 中打印了formId,开发者工具中运行正常,也就是每次点击页面任何地方,包括跳转事件都会打印“the formid is a mock one”说明每次都有触发收集事件,但是在真机中运行时,只有在不跳转的情况下才会打印formid,跳转是不打印的,而且抓包显示不打印时也没有请求相关接口,说明没有触发到收集函数,而且这种不触发还是不稳定的,有的时候会触发有的时候又不会。求问是有什么相关限制,还是说需要特别的处理方式?

<view>
  <form class=“customform” report-submit=“true” bindsubmit=“submitHandler”>
    <button class=“customform-button” formType=“submit”>
      <slot></slot>
    </button>
  </form>

</view>


8 回复

那不就不能一个页面只套一个了?只能挨个有跳转事件的来套form?这样的话一个页面会产生很多个formid耶,这样会不会有点没必要?

是的,这里需要在submit中阻止跳转才能拿到formId。

好的,谢谢你的指导,我尝试一下看

如果和事件有关系的话,跳转事件用的bindtap,是冒泡事件,submit事件不冒泡,可是form在最外层,显然不会被冒泡事件影响吧,而且就算影响,也应该真机和模拟器都影响,没道理真机和模拟器表现不同吧

还是可以做的,就是比较麻烦一点。你可以通过Object.defineProperties重写wx.navigateTo等所有的跳转类方法,因为navigator标签的跳转也会走这些跳转API方法,所以包装过之后就有了做一些额外事情的机会。

我大概明白你的意思了,先拿到Id再跳转,但是现在的情况是跳转的情况会很多,有的是标签跳有的是bindtap绑定的api跳,想要抹平他们之间的差异,写一个通用的组件是不是有点不太现实?

他的意思是,想要拿到formId就不能让页面跳转走,可能拿formId这个动作需要一点时间吧。你可以试一下把跳转动作改成拿到formId之后再执行,这样你就需要包装navigator组件,然后将跳转url、参数、跳转方式等信息放在event.detail里面,然后在你自定义的form组件里面来执行跳转的动作。

回到顶部