dom/bom 扩展 API

为了更好地适配小程序端接口,此方案在原有的 dom 接口之上进行了扩展。

window 对象

window.$$miniprogram

挂在 window 对象下的一个特殊对象,用于对页面作一些初始化工作(主要针对小程序页面路由相关)

属性名 类型 描述
window Object 对象所属页面的 window 对象
document Object 对象所属页面的 document 对象
config Object 创建页面时传入的 config
  • init(url)

初始化页面,如果需要页面跳转逻辑,则此方法必须被执行。

参数 类型 描述
url String 页面初始 url
  • getMatchRoute(pathname)

根据传入的 url pathname 来获取匹配的小程序页面路由。

window.$$trigger

触发当前节点事件。与 dispatchEvent 不同的是,$$trigger 不会触发事件的捕获、冒泡阶段,只对绑定在节点上的事件句柄按顺序执行一遍。

参数 类型 描述
eventName String 事件名称
options Object 配置
options.event Object 事件句柄接收到的事件对象
options.isCapture Boolean 是否触发捕获事件句柄,默认是 false
  1. window.$$trigger('ready')
  2. window.$$trigger('beforeunload', {
  3. event: new window.CustomEvent('beforeunload'),
  4. isCapture: false,
  5. })

window.$$clearEvent

清空某个事件的所有句柄。

参数 类型 描述
eventName String 事件名称
isCapture Boolean 是否清空捕获事件句柄,默认是 false

PS:慎用此方法,因为会清理掉所有地方绑定的事件句柄。

window.$$getComputedStyle

小程序中 window.getComputedStyle 的替代实现,返回一个 promise。

参数 类型 描述
dom String dom 节点
computedStyle Array\ 指定样式名列表
  1. window.$$getComputedStyle(document.body, ['backgroundColor']).then(res => {
  2. console.log(res.backgroundColor)
  3. })
  4. window.$$getComputedStyle(document.querySelector('div'), ['backgroundColor']).then(res => {
  5. console.log(res.backgroundColor)
  6. })

window.$$createSelectorQuery

相当于 wx.createSelectorQuery,用法可参考官方文档

window.$$createIntersectionObserver

相当于 wx.createIntersectionObserver,用法可参考官方文档

window.$$forceRender

强制清空 setData 队列进行渲染。

window.$$getPrototype

获取 dom/bom 对象的原型,用于对其做一些扩展改造。

参数 类型 描述
descriptor String 描述字符串

描述字符串支持的列表如下:

  • window.location
  • window.navigator
  • window.performance
  • window.screen
  • window.history
  • window.localStorage
  • window.sessionStorage
  • window.event
  • window
  • document
  • element.attribute
  • element.classList
  • element.style
  • element
  • textNode
  • comment
  1. const locationPrototype = window.$$getPrototype('window.location') // location 对象的 prototype
  2. const elementPrototype = window.$$getPrototype('element') // 普通节点的 prototype
  3. const textNodePrototype = window.$$getPrototype('textNode') // 文本节点的 prototype

window.$$extend

对 dom/bom 对象进行扩展。

参数 类型 描述
descriptor String 描述字符串,值同 window.$$getPrototype 接口
options Object 扩展对象
  1. // 对 location 对象进行扩展
  2. window.$$extend('window.location', {
  3. testStr: 'I am location',
  4. testFunc() {
  5. return `Hello, ${this.testStr}`
  6. },
  7. })
  8. console.log(window.location.testFunc()) // 输出 Hello, I am location

window.$$addAspect

对 dom/bom 对象方法追加前置/后置处理。

参数 类型 描述
descriptor String 描述字符串
func Function 处理方法

描述字符串的值类似 window.$$getPrototype 接口的描述字符串,只是后续追加了方法和类型,比如 element.hasChildNodes.before 即表示在 element.hasChildNodes 方法追加前置处理。

前置处理即表示此方法会在执行原始方法之前执行,后置处理则是在之后执行。前置处理方法接收到的参数和原始方法接收到的参数一致,后置处理方法接收到的参数则是原始方法执行后返回的结果。

  1. const div = document.createElement('div')
  2. div.count = 0
  3. const beforeAspect = function(arg) {
  4. // 在执行 div.hasChildNodes 前被调用
  5. console.log(arg) // 输出调用 div.hasChildNodes 时传入的参数
  6. if (this.count === 50) return true // 如果返回 true,则中断方法执行,不会再执行原始方法
  7. this.count++
  8. }
  9. const afterAspect = function(res) {
  10. // 在执行 div.hasChildNodes 后被调用
  11. console.log(res) // 输出调用 div.hasChildNodes 的返回值
  12. this.count++
  13. }
  14. window.$$addAspect('element.hasChildNodes.before', beforeAspect)
  15. window.$$addAspect('element.hasChildNodes.after', afterAspect)
  16. div.hasChildNodes('abc') // 返回 false
  17. div.count // 输出 2

window.$$removeAspect

移除对 dom/bom 对象方法追加前置/后置处理。

参数 类型 描述
descriptor String 描述字符串,值同 window.$$addAspect 接口
func Function 处理方法
  1. window.$$removeAspect('element.hasChildNodes.before', beforeAspect)
  2. window.$$removeAspect('element.hasChildNodes.after', afterAspect)

window.onShareAppMessage

开启 share 配置后,当进行页面分享时会执行的回调。此回调可以返回一个对象,作为小程序处理分享的参数。

属性名 类型 描述
data Object 小程序被分享页面 onShareAppMessage 回调传入的参数,可参考官方文档
  1. window.onShareAppMessage = function(data) {
  2. // 当页面被分享时会进入这个回调
  3. // 返回一个对象,作为小程序处理分享的参数,对象内容和小程序页面 onShareAppMessage 回调可返回对象内容基本一致,具体可参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/reference/api/Page.html#onShareAppMessage-Object-object
  4. return {
  5. title: 'test title',
  6. path: '/home/index', // 这里的 path 是页面 url,而不是小程序路由
  7. }
  8. }

PS:返回的对象中,path 是要分享页面的 url,而不是页面路由。如果不返回默认取 window.locaiton.href。

window.onDealWithNotSupportDom

渲染时遇到不支持的 dom 节点会执行的回调。

属性名 类型 描述
dom Object 不支持的 dom 节点
  1. window.onDealWithNotSupportDom = function(dom) {
  2. // 渲染时遇到不支持的 dom 节点时会进入这个回调
  3. if (dom.tagName === 'IFRAME') {
  4. dom.textContent = '当前小程序版本暂不支持 iframe'
  5. }
  6. }

window: pagenotfound 事件

当跳转到一个不存在的页面时触发。

  • event.type:页面跳转类型,jump 表示当前页面跳转,open 表示新开页面
  • event.url:目标页面的 url

window: pageaccessdenied 事件

当跳转到一个被禁止访问的页面时触发,通常跳转非同源页面时会触发。

  • event.type: 页面跳转类型,jump 表示当前页面跳转,open 表示新开页面
  • event.url: 目标页面的 url

window: reachbottom 事件

开启 reachBottom 配置后,当页面上拉触底时会触发此事件。

window: pulldownrefresh 事件

开启 pullDownRefresh 配置后,当下拉刷新页面时会触发此事件。

window: wxload 事件

即小程序页面的 onLoad 生命周期回调。

window: wxshow 事件

即小程序页面的 onShow 生命周期回调。

window: wxready 事件

即小程序页面的 onReady 生命周期回调。

window: wxhide 事件

即小程序页面的 onHide 生命周期回调。

window: wxunload 事件

即小程序页面的 onUnload 生命周期回调。

document 对象

获取完整的 cookie,相当于请求头附带的 cookie。

  1. // 给请求头设置 cookie
  2. wx.request({
  3. method: 'GET',
  4. url: '/cgi/xxx',
  5. header: {
  6. cookie: window.document.$$cookie,
  7. },
  8. success() {},
  9. })

document.$$trigger

window.$$trigger

document.$$clearEvent

window.$$clearEvent

PS:慎用此方法,因为会清理掉所有地方绑定的事件句柄。

document.$$setCookie

处理 wx.request 返回的 Set-Cookie 头,并存入 document.cookie 中。

  1. wx.request({
  2. method: 'GET',
  3. url: '/cgi/xxx',
  4. success(res) {
  5. const setCookie = res.header['Set-Cookie']
  6. document.$$setCookie(setCookie)
  7. console.log(document.cookie)
  8. },
  9. })

dom 对象

dom.$$trigger

window.$$trigger

dom.$$clearEvent

window.$$clearEvent

PS:慎用此方法,因为会清理掉所有地方绑定的事件句柄。

dom.$$getBoundingClientRect

小程序中 dom.getBoundingClientRect 的替代实现,返回一个 promise。

PS:此接口本质上是小程序的 SelectorQuery 的二次封装,如果是 dom 是 document.body,会默认走 scrollOffset 接口,如果是其他 dom 则走 boundingClientRect 接口。

  1. document.body.$$getBoundingClientRect().then(res => {
  2. // res 的内容可以参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.scrollOffset.html
  3. })
  4. document.querySelector('div').$$getBoundingClientRect().then(res => {
  5. // res 的内容可以参考官方文档:https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.boundingClientRect.html
  6. })

dom.$$getContext

获取小程序组件的 context 对象,返回一个 promise。

PS:此接口是小程序的 SelectorQuery 的二次封装

  1. document.querySelector('video').$$getContext().then(context => {
  2. // 这里的 context 仅限于文档中支持的那些:https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.context.html
  3. })

dom.$$getNodesRef

获取小程序组件的 NodesRef 对象,返回一个 promise。

PS:此接口是小程序的 SelectorQuery 的二次封装

  1. document.querySelector('video').$$getNodesRef().then(nodesRef => {
  2. // NodesRef 对象文档:https://developers.weixin.qq.com/miniprogram/dev/api/wxml/NodesRef.html
  3. nodesRef.node(res => {
  4. console.log(res.node)
  5. }).exec()
  6. })

dom: $$domNodeUpdate 事件

当前节点有更新时触发。

dom: $$childNodesUpdate 事件

儿子节点有更新时触发。

PS:注意此处孙子节点更新是不会触发的。