提交 78a59e0e 编写于 作者: Q qiang

feat(App): pageScrollTo、loadFontFace

上级 055fb19e
...@@ -4832,6 +4832,34 @@ var serviceContext = (function (vue) { ...@@ -4832,6 +4832,34 @@ var serviceContext = (function (vue) {
const API_HIDE_TOAST = 'hideToast'; const API_HIDE_TOAST = 'hideToast';
const API_LOAD_FONT_FACE = 'loadFontFace';
const LoadFontFaceProtocol = {
family: {
type: String,
required: true,
},
source: {
type: String,
required: true,
},
desc: Object,
};
const API_PAGE_SCROLL_TO = 'pageScrollTo';
const PageScrollToProtocol = {
scrollTop: Number,
selector: String,
duration: Number,
};
const DEFAULT_DURATION = 300;
const PageScrollToOptions = {
formatArgs: {
duration(value, params) {
params.duration = Math.max(0, parseInt(value + '') || DEFAULT_DURATION);
},
},
};
const API_SHOW_ACTION_SHEET = 'showActionSheet'; const API_SHOW_ACTION_SHEET = 'showActionSheet';
const ShowActionSheetProtocol = { const ShowActionSheetProtocol = {
itemList: { itemList: {
...@@ -8114,6 +8142,29 @@ var serviceContext = (function (vue) { ...@@ -8114,6 +8142,29 @@ var serviceContext = (function (vue) {
resolve(); resolve();
}); });
const VD_SYNC = 'vdSync';
const ON_WEBVIEW_READY = 'onWebviewReady';
const PAGE_SCROLL_TO = 'pageScrollTo';
const LOAD_FONT_FACE = 'loadFontFace';
const ACTION_TYPE_DICT = 0;
const loadFontFace = defineAsyncApi(API_LOAD_FONT_FACE, (options, { resolve, reject }) => {
const pageId = getPageIdByVm(getCurrentPageVm());
UniServiceJSBridge.invokeViewMethod(LOAD_FONT_FACE, options, pageId, (err) => {
if (err) {
reject(err);
}
else {
resolve();
}
});
}, LoadFontFaceProtocol);
const pageScrollTo = defineAsyncApi(API_PAGE_SCROLL_TO, (options, { resolve }) => {
const pageId = getPageIdByVm(getCurrentPageVm());
UniServiceJSBridge.invokeViewMethod(PAGE_SCROLL_TO, options, pageId, resolve);
}, PageScrollToProtocol, PageScrollToOptions);
const providers = { const providers = {
oauth(callback) { oauth(callback) {
plus.oauth.getServices((services) => { plus.oauth.getServices((services) => {
...@@ -8892,10 +8943,6 @@ var serviceContext = (function (vue) { ...@@ -8892,10 +8943,6 @@ var serviceContext = (function (vue) {
}); });
} }
const VD_SYNC = 'vdSync';
const ON_WEBVIEW_READY = 'onWebviewReady';
const ACTION_TYPE_DICT = 0;
function onNodeEvent(nodeId, evt, pageNode) { function onNodeEvent(nodeId, evt, pageNode) {
pageNode.fireEvent(nodeId, evt); pageNode.fireEvent(nodeId, evt);
} }
...@@ -10840,6 +10887,8 @@ var serviceContext = (function (vue) { ...@@ -10840,6 +10887,8 @@ var serviceContext = (function (vue) {
hideLoading: hideLoading, hideLoading: hideLoading,
startPullDownRefresh: startPullDownRefresh, startPullDownRefresh: startPullDownRefresh,
stopPullDownRefresh: stopPullDownRefresh, stopPullDownRefresh: stopPullDownRefresh,
loadFontFace: loadFontFace,
pageScrollTo: pageScrollTo,
getProvider: getProvider, getProvider: getProvider,
login: login, login: login,
getUserInfo: getUserInfo, getUserInfo: getUserInfo,
......
...@@ -171,6 +171,64 @@ ...@@ -171,6 +171,64 @@
offsetLeft offsetLeft
}; };
} }
function addFont(family, source, desc) {
const fonts = document.fonts;
if (fonts) {
const fontFace = new FontFace(family, source, desc);
return fontFace.load().then(() => {
fonts.add(fontFace);
});
}
return new Promise((resolve2) => {
const style = document.createElement("style");
const values = [];
if (desc) {
const { style: style2, weight, stretch, unicodeRange, variant, featureSettings } = desc;
style2 && values.push(`font-style:${style2}`);
weight && values.push(`font-weight:${weight}`);
stretch && values.push(`font-stretch:${stretch}`);
unicodeRange && values.push(`unicode-range:${unicodeRange}`);
variant && values.push(`font-variant:${variant}`);
featureSettings && values.push(`font-feature-settings:${featureSettings}`);
}
style.innerText = `@font-face{font-family:"${family}";src:${source};${values.join(";")}}`;
document.head.appendChild(style);
resolve2();
});
}
function scrollTo(scrollTop, duration) {
if (isString(scrollTop)) {
const el = document.querySelector(scrollTop);
if (el) {
scrollTop = el.getBoundingClientRect().top + window.pageYOffset;
}
}
if (scrollTop < 0) {
scrollTop = 0;
}
const documentElement = document.documentElement;
const { clientHeight, scrollHeight } = documentElement;
scrollTop = Math.min(scrollTop, scrollHeight - clientHeight);
if (duration === 0) {
documentElement.scrollTop = document.body.scrollTop = scrollTop;
return;
}
if (window.scrollY === scrollTop) {
return;
}
const scrollTo2 = (duration2) => {
if (duration2 <= 0) {
window.scrollTo(0, scrollTop);
return;
}
const distaince = scrollTop - window.scrollY;
requestAnimationFrame(function() {
window.scrollTo(0, window.scrollY + distaince / duration2 * 10);
scrollTo2(duration2 - 10);
});
};
scrollTo2(duration);
}
function plusReady(callback) { function plusReady(callback) {
if (typeof callback !== "function") { if (typeof callback !== "function") {
return; return;
...@@ -5445,6 +5503,8 @@ ...@@ -5445,6 +5503,8 @@
[ON_PAGE_SCROLL, ON_REACH_BOTTOM]; [ON_PAGE_SCROLL, ON_REACH_BOTTOM];
const VD_SYNC = "vdSync"; const VD_SYNC = "vdSync";
const ON_WEBVIEW_READY = "onWebviewReady"; const ON_WEBVIEW_READY = "onWebviewReady";
const PAGE_SCROLL_TO = "pageScrollTo";
const LOAD_FONT_FACE = "loadFontFace";
const ACTION_TYPE_DICT = 0; const ACTION_TYPE_DICT = 0;
const APP_SERVICE_ID = "__uniapp__service"; const APP_SERVICE_ID = "__uniapp__service";
const UniViewJSBridge$1 = /* @__PURE__ */ extend(ViewJSBridge, { const UniViewJSBridge$1 = /* @__PURE__ */ extend(ViewJSBridge, {
...@@ -12669,7 +12729,7 @@ ...@@ -12669,7 +12729,7 @@
let val = Number(props2.lowerThreshold); let val = Number(props2.lowerThreshold);
return isNaN(val) ? 50 : val; return isNaN(val) ? 50 : val;
}); });
function scrollTo(scrollToValue, direction2) { function scrollTo2(scrollToValue, direction2) {
const container = main.value; const container = main.value;
let transformValue = 0; let transformValue = 0;
let transform = ""; let transform = "";
...@@ -12746,7 +12806,7 @@ ...@@ -12746,7 +12806,7 @@
if (props2.scrollY) { if (props2.scrollY) {
{ {
if (props2.scrollWithAnimation) { if (props2.scrollWithAnimation) {
scrollTo(val, "y"); scrollTo2(val, "y");
} else { } else {
main.value.scrollTop = val; main.value.scrollTop = val;
} }
...@@ -12757,7 +12817,7 @@ ...@@ -12757,7 +12817,7 @@
if (props2.scrollX) { if (props2.scrollX) {
{ {
if (props2.scrollWithAnimation) { if (props2.scrollWithAnimation) {
scrollTo(val, "x"); scrollTo2(val, "x");
} else { } else {
main.value.scrollLeft = val; main.value.scrollLeft = val;
} }
...@@ -12779,7 +12839,7 @@ ...@@ -12779,7 +12839,7 @@
let scrollLeft = main.value.scrollLeft; let scrollLeft = main.value.scrollLeft;
let x = scrollLeft + left; let x = scrollLeft + left;
if (props2.scrollWithAnimation) { if (props2.scrollWithAnimation) {
scrollTo(x, "x"); scrollTo2(x, "x");
} else { } else {
main.value.scrollLeft = x; main.value.scrollLeft = x;
} }
...@@ -12789,7 +12849,7 @@ ...@@ -12789,7 +12849,7 @@
let scrollTop = main.value.scrollTop; let scrollTop = main.value.scrollTop;
let y = scrollTop + top; let y = scrollTop + top;
if (props2.scrollWithAnimation) { if (props2.scrollWithAnimation) {
scrollTo(y, "y"); scrollTo2(y, "y");
} else { } else {
main.value.scrollTop = y; main.value.scrollTop = y;
} }
...@@ -15845,6 +15905,10 @@ ...@@ -15845,6 +15905,10 @@
} }
requestAnimationFrame(() => document.addEventListener("scroll", createScrollListener(opts))); requestAnimationFrame(() => document.addEventListener("scroll", createScrollListener(opts)));
} }
function pageScrollTo({ scrollTop, selector, duration }, publish) {
scrollTo(selector || scrollTop || 0, duration);
publish();
}
function onVdSync(actions) { function onVdSync(actions) {
const dictAction = actions[0]; const dictAction = actions[0];
const getDict = createGetDict(dictAction[0] === ACTION_TYPE_DICT ? dictAction[1] : []); const getDict = createGetDict(dictAction[0] === ACTION_TYPE_DICT ? dictAction[1] : []);
...@@ -16015,6 +16079,13 @@ ...@@ -16015,6 +16079,13 @@
}); });
callback(result); callback(result);
} }
function loadFontFace({ family, source, desc }, publish) {
addFont(family, source, desc).then(() => {
publish();
}).catch((err) => {
publish(err.toString());
});
}
const pageVm = { $el: document.body }; const pageVm = { $el: document.body };
function initViewMethods() { function initViewMethods() {
const pageId = getCurrentPageId(); const pageId = getCurrentPageId();
...@@ -16022,6 +16093,8 @@ ...@@ -16022,6 +16093,8 @@
registerViewMethod(pageId, "requestComponentInfo", (args, publish) => { registerViewMethod(pageId, "requestComponentInfo", (args, publish) => {
requestComponentInfo(pageVm, args.reqs, publish); requestComponentInfo(pageVm, args.reqs, publish);
}); });
registerViewMethod(pageId, PAGE_SCROLL_TO, pageScrollTo);
registerViewMethod(pageId, LOAD_FONT_FACE, loadFontFace);
} }
window.uni = uni$1; window.uni = uni$1;
window.UniViewJSBridge = UniViewJSBridge$1; window.UniViewJSBridge = UniViewJSBridge$1;
......
...@@ -2,6 +2,10 @@ export const VD_SYNC = 'vdSync' ...@@ -2,6 +2,10 @@ export const VD_SYNC = 'vdSync'
export const ON_WEBVIEW_READY = 'onWebviewReady' export const ON_WEBVIEW_READY = 'onWebviewReady'
export const PAGE_SCROLL_TO = 'pageScrollTo'
export const LOAD_FONT_FACE = 'loadFontFace'
export let ACTION_MINIFY = true export let ACTION_MINIFY = true
// __tests__ // __tests__
export function setActionMinify(minify: boolean) { export function setActionMinify(minify: boolean) {
......
...@@ -45,6 +45,8 @@ export * from './ui/popup/showActionSheet' ...@@ -45,6 +45,8 @@ export * from './ui/popup/showActionSheet'
export * from './ui/popup/showToast' export * from './ui/popup/showToast'
export * from './ui/startPullDownRefresh' export * from './ui/startPullDownRefresh'
export * from './ui/stopPullDownRefresh' export * from './ui/stopPullDownRefresh'
export * from './ui/loadFontFace'
export * from './ui/pageScrollTo'
export * from './plugin/getProvider' export * from './plugin/getProvider'
export * from './plugin/oauth' export * from './plugin/oauth'
......
import {
API_LOAD_FONT_FACE,
API_TYPE_LOAD_FONT_FACE,
defineAsyncApi,
LoadFontFaceProtocol,
} from '@dcloudio/uni-api'
import { getPageIdByVm, getCurrentPageVm } from '@dcloudio/uni-core'
import { LOAD_FONT_FACE } from '../../../constants'
export const loadFontFace = defineAsyncApi<API_TYPE_LOAD_FONT_FACE>(
API_LOAD_FONT_FACE,
(options, { resolve, reject }) => {
const pageId = getPageIdByVm(getCurrentPageVm()!)!
UniServiceJSBridge.invokeViewMethod(
LOAD_FONT_FACE,
options,
pageId,
(err: string) => {
if (err) {
reject(err)
} else {
resolve()
}
}
)
},
LoadFontFaceProtocol
)
import {
API_PAGE_SCROLL_TO,
API_TYPE_PAGE_SCROLL_TO,
defineAsyncApi,
PageScrollToOptions,
PageScrollToProtocol,
} from '@dcloudio/uni-api'
import { getPageIdByVm, getCurrentPageVm } from '@dcloudio/uni-core'
import { PAGE_SCROLL_TO } from '../../../constants'
export const pageScrollTo = defineAsyncApi<API_TYPE_PAGE_SCROLL_TO>(
API_PAGE_SCROLL_TO,
(options, { resolve }) => {
const pageId = getPageIdByVm(getCurrentPageVm()!)!
UniServiceJSBridge.invokeViewMethod(
PAGE_SCROLL_TO,
options,
pageId,
resolve
)
},
PageScrollToProtocol,
PageScrollToOptions
)
import { addFont } from '@dcloudio/uni-shared'
export function loadFontFace(
{
family,
source,
desc,
}: { family: string; source: string; desc?: UniApp.LoadFontFaceOptionsDesc },
publish: (err?: string) => void
) {
addFont(family, source, desc)
.then(() => {
publish()
})
.catch((err) => {
publish(err.toString())
})
}
...@@ -10,6 +10,7 @@ import { ...@@ -10,6 +10,7 @@ import {
ON_REACH_BOTTOM, ON_REACH_BOTTOM,
PageCreateData, PageCreateData,
UniNodeJSON, UniNodeJSON,
scrollTo,
} from '@dcloudio/uni-shared' } from '@dcloudio/uni-shared'
import { UniElement } from './elements/UniElement' import { UniElement } from './elements/UniElement'
...@@ -172,3 +173,15 @@ function initPageScroll( ...@@ -172,3 +173,15 @@ function initPageScroll(
document.addEventListener('scroll', createScrollListener(opts)) document.addEventListener('scroll', createScrollListener(opts))
) )
} }
export function pageScrollTo(
{
scrollTop,
selector,
duration,
}: { selector?: string; scrollTop?: number; duration?: number },
publish: (err?: string) => void
) {
scrollTo(selector! || scrollTop! || 0, duration!)
publish()
}
...@@ -5,8 +5,10 @@ import { ...@@ -5,8 +5,10 @@ import {
getCurrentPageId, getCurrentPageId,
} from '@dcloudio/uni-core' } from '@dcloudio/uni-core'
import { ComponentPublicInstance } from 'vue' import { ComponentPublicInstance } from 'vue'
import { requestComponentInfo } from '../../../../uni-h5/src/platform' import { requestComponentInfo } from '../../../../uni-h5/src/platform'
import { PAGE_SCROLL_TO, LOAD_FONT_FACE } from '../../constants'
import { loadFontFace } from './dom/font'
import { pageScrollTo } from './dom/page'
const pageVm = { $el: document.body } as ComponentPublicInstance const pageVm = { $el: document.body } as ComponentPublicInstance
...@@ -20,4 +22,6 @@ export function initViewMethods() { ...@@ -20,4 +22,6 @@ export function initViewMethods() {
requestComponentInfo(pageVm, args.reqs, publish) requestComponentInfo(pageVm, args.reqs, publish)
} }
) )
registerViewMethod(pageId, PAGE_SCROLL_TO, pageScrollTo)
registerViewMethod(pageId, LOAD_FONT_FACE, loadFontFace)
} }
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册