diff --git a/src/platforms/mp-alipay/service/api/index.js b/src/platforms/mp-alipay/service/api/index.js index bef4c24784ca1bfa7e35468447169684ca501ee0..ddd302f3e6c302e390b045fc0f976c8a87493503 100644 --- a/src/platforms/mp-alipay/service/api/index.js +++ b/src/platforms/mp-alipay/service/api/index.js @@ -1,4 +1,5 @@ import { + isFn, hasOwn } from 'uni-shared' @@ -32,3 +33,58 @@ export function startGyroscope (params) { errMsg: 'startGyroscope:ok' }) } + +function createExecCallback (execCallback) { + return function wrapperExecCallback (res) { + this.actions.forEach((action, index) => { + (action._$callbacks || []).forEach(callback => { + callback(res[index]) + }) + }) + execCallback(res) + } +} + +function addCallback (callback) { + if (isFn(callback)) { + const action = this.actions[this.actions.length - 1] + if (action) { + (action._$callbacks || (action._$callbacks = [])).push(callback) + } + } +} + +export function createSelectorQuery () { + const query = my.createSelectorQuery() + + const oldExec = query.exec + const oldScrollOffset = query.scrollOffset + const oldBoundingClientRect = query.boundingClientRect + query.exec = function exec (callback) { + return oldExec.call(this, createExecCallback(callback).bind(this)) + } + query.scrollOffset = function scrollOffset (callback) { + const ret = oldScrollOffset.call(this) + addCallback.call(this, callback) + return ret + } + query.boundingClientRect = function boundingClientRect (callback) { + const ret = oldBoundingClientRect.call(this) + addCallback.call(this, callback) + return ret + } + + if (!query.fields) { + query.fields = function ({ rect, size, scrollOffset } = {}, callback) { + if (rect || size) { + this.boundingClientRect() + } + if (scrollOffset) { + this.scrollOffset() + } + addCallback.call(this, callback) + return this + } + } + return query +}