first
This commit is contained in:
@@ -0,0 +1,224 @@
|
||||
'use strict'
|
||||
|
||||
// 等待初始化完毕
|
||||
document.addEventListener('UniAppJSBridgeReady', () => {
|
||||
document.body.onclick = function () {
|
||||
return uni.postMessage({
|
||||
data: {
|
||||
action: 'onClick'
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onJSBridgeReady'
|
||||
}
|
||||
})
|
||||
})
|
||||
let options
|
||||
let medias = []
|
||||
/**
|
||||
* @description 获取标签的所有属性
|
||||
* @param {Element} ele
|
||||
*/
|
||||
|
||||
function getAttrs(ele) {
|
||||
const attrs = Object.create(null)
|
||||
|
||||
for (let i = ele.attributes.length; i--;) {
|
||||
attrs[ele.attributes[i].name] = ele.attributes[i].value
|
||||
}
|
||||
|
||||
return attrs
|
||||
}
|
||||
/**
|
||||
* @description 图片加载出错
|
||||
*/
|
||||
|
||||
function onImgError() {
|
||||
if (options[1]) {
|
||||
this.src = options[1]
|
||||
this.onerror = null
|
||||
} // 取消监听点击
|
||||
|
||||
this.onclick = null
|
||||
this.ontouchstart = null
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onError',
|
||||
source: 'img',
|
||||
attrs: getAttrs(this)
|
||||
}
|
||||
})
|
||||
}
|
||||
/**
|
||||
* @description 创建 dom 结构
|
||||
* @param {object[]} nodes 节点数组
|
||||
* @param {Element} parent 父节点
|
||||
* @param {string} namespace 命名空间
|
||||
*/
|
||||
|
||||
function createDom(nodes, parent, namespace) {
|
||||
const _loop = function _loop(i) {
|
||||
const node = nodes[i]
|
||||
let ele = void 0
|
||||
|
||||
if (!node.type || node.type == 'node') {
|
||||
let { name } = node // svg 需要设置 namespace
|
||||
|
||||
if (name == 'svg') namespace = 'http://www.w3.org/2000/svg'
|
||||
if (name == 'html' || name == 'body') name = 'div' // 创建标签
|
||||
|
||||
if (!namespace) ele = document.createElement(name); else ele = document.createElementNS(namespace, name) // 设置属性
|
||||
|
||||
for (const item in node.attrs) {
|
||||
ele.setAttribute(item, node.attrs[item])
|
||||
} // 递归创建子节点
|
||||
|
||||
if (node.children) createDom(node.children, ele, namespace) // 处理图片
|
||||
|
||||
if (name == 'img') {
|
||||
if (!ele.src && ele.getAttribute('data-src')) ele.src = ele.getAttribute('data-src')
|
||||
|
||||
if (!node.attrs.ignore) {
|
||||
// 监听图片点击事件
|
||||
ele.onclick = function (e) {
|
||||
e.stopPropagation()
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onImgTap',
|
||||
attrs: getAttrs(this)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
if (options[2]) {
|
||||
image = new Image()
|
||||
image.src = ele.src
|
||||
ele.src = options[2]
|
||||
|
||||
image.onload = function () {
|
||||
ele.src = this.src
|
||||
}
|
||||
|
||||
image.onerror = function () {
|
||||
ele.onerror()
|
||||
}
|
||||
}
|
||||
|
||||
ele.onerror = onImgError
|
||||
} // 处理链接
|
||||
else if (name == 'a') {
|
||||
ele.addEventListener('click', function (e) {
|
||||
e.stopPropagation()
|
||||
e.preventDefault() // 阻止默认跳转
|
||||
|
||||
const href = this.getAttribute('href')
|
||||
let offset
|
||||
if (href && href[0] == '#') offset = (document.getElementById(href.substr(1)) || {}).offsetTop
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onLinkTap',
|
||||
attrs: getAttrs(this),
|
||||
offset
|
||||
}
|
||||
})
|
||||
}, true)
|
||||
} // 处理音视频
|
||||
else if (name == 'video' || name == 'audio') {
|
||||
medias.push(ele)
|
||||
|
||||
if (!node.attrs.autoplay) {
|
||||
if (!node.attrs.controls) ele.setAttribute('controls', 'true') // 空白图占位
|
||||
|
||||
if (!node.attrs.poster) ele.setAttribute('poster', "data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg'/>")
|
||||
}
|
||||
|
||||
if (options[3]) {
|
||||
ele.onplay = function () {
|
||||
for (let _i = 0; _i < medias.length; _i++) {
|
||||
if (medias[_i] != this) medias[_i].pause()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ele.onerror = function () {
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onError',
|
||||
source: name,
|
||||
attrs: getAttrs(this)
|
||||
}
|
||||
})
|
||||
}
|
||||
} // 处理表格
|
||||
else if (name == 'table' && options[4] && !ele.style.cssText.includes('inline')) {
|
||||
const div = document.createElement('div')
|
||||
div.style.overflow = 'auto'
|
||||
div.appendChild(ele)
|
||||
ele = div
|
||||
} else if (name == 'svg') namespace = void 0
|
||||
} else ele = document.createTextNode(node.text.replace(/&/g, '&'))
|
||||
|
||||
parent.appendChild(ele)
|
||||
}
|
||||
|
||||
for (let i = 0; i < nodes.length; i++) {
|
||||
var image
|
||||
|
||||
_loop(i)
|
||||
}
|
||||
} // 设置 html 内容
|
||||
|
||||
window.setContent = function (nodes, opts, append) {
|
||||
const ele = document.getElementById('content') // 背景颜色
|
||||
|
||||
if (opts[0]) document.body.bgColor = opts[0] // 长按复制
|
||||
|
||||
if (!opts[5]) ele.style.userSelect = 'none'
|
||||
|
||||
if (!append) {
|
||||
ele.innerHTML = '' // 不追加则先清空
|
||||
|
||||
medias = []
|
||||
}
|
||||
|
||||
options = opts
|
||||
const fragment = document.createDocumentFragment()
|
||||
createDom(nodes, fragment)
|
||||
ele.appendChild(fragment) // 触发事件
|
||||
|
||||
let height = ele.scrollHeight
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onLoad',
|
||||
height
|
||||
}
|
||||
})
|
||||
clearInterval(window.timer)
|
||||
let ready = false
|
||||
window.timer = setInterval(() => {
|
||||
if (ele.scrollHeight != height) {
|
||||
height = ele.scrollHeight
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onHeightChange',
|
||||
height
|
||||
}
|
||||
})
|
||||
} else if (!ready) {
|
||||
ready = true
|
||||
uni.postMessage({
|
||||
data: {
|
||||
action: 'onReady'
|
||||
}
|
||||
})
|
||||
}
|
||||
}, 350)
|
||||
} // 回收计时器
|
||||
|
||||
window.onunload = function () {
|
||||
clearInterval(window.timer)
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
!(function (e, n) { typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = n() : typeof define === 'function' && define.amd ? define(n) : (e = e || self).uni = n() }(this, (() => {
|
||||
'use strict'
|
||||
|
||||
try { const e = {}; Object.defineProperty(e, 'passive', { get() { !0 } }), window.addEventListener('test-passive', null, e) } catch (e) {} const n = Object.prototype.hasOwnProperty; function t(e, t) { return n.call(e, t) } const i = []; const a = function (e, n) { const t = { options: { timestamp: +new Date() }, name: e, arg: n }; if (window.__dcloud_weex_postMessage || window.__dcloud_weex_) { if (e === 'postMessage') { const a = { data: [n] }; return window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessage(a) : window.__dcloud_weex_.postMessage(JSON.stringify(a)) } const o = { type: 'WEB_INVOKE_APPSERVICE', args: { data: t, webviewIds: i } }; window.__dcloud_weex_postMessage ? window.__dcloud_weex_postMessageToService(o) : window.__dcloud_weex_.postMessageToService(JSON.stringify(o)) } if (!window.plus) return window.parent.postMessage({ type: 'WEB_INVOKE_APPSERVICE', data: t, pageId: '' }, '*'); if (i.length === 0) { const r = plus.webview.currentWebview(); if (!r) throw new Error('plus.webview.currentWebview() is undefined'); const d = r.parent(); let s = ''; s = d ? d.id : r.id, i.push(s) } if (plus.webview.getWebviewById('__uniapp__service'))plus.webview.postMessageToUniNView({ type: 'WEB_INVOKE_APPSERVICE', args: { data: t, webviewIds: i } }, '__uniapp__service'); else { const w = JSON.stringify(t); plus.webview.getLaunchWebview().evalJS('UniPlusBridge.subscribeHandler("'.concat('WEB_INVOKE_APPSERVICE', '",').concat(w, ',').concat(JSON.stringify(i), ');')) } }; const o = {
|
||||
navigateTo() { const e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; const n = e.url; a('navigateTo', { url: encodeURI(n) }) }, navigateBack() { const e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; const n = e.delta; a('navigateBack', { delta: parseInt(n) || 1 }) }, switchTab() { const e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; const n = e.url; a('switchTab', { url: encodeURI(n) }) }, reLaunch() { const e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; const n = e.url; a('reLaunch', { url: encodeURI(n) }) }, redirectTo() { const e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; const n = e.url; a('redirectTo', { url: encodeURI(n) }) }, getEnv(e) { window.plus ? e({ plus: !0 }) : e({ h5: !0 }) }, postMessage() { const e = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : {}; a('postMessage', e.data || {}) }
|
||||
}; const r = /uni-app/i.test(navigator.userAgent); const d = /Html5Plus/i.test(navigator.userAgent); const s = /complete|loaded|interactive/; const w = window.my && navigator.userAgent.indexOf('AlipayClient') > -1; const u = window.swan && window.swan.webView && /swan/i.test(navigator.userAgent); const c = window.qq && window.qq.miniProgram && /QQ/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent); const g = window.tt && window.tt.miniProgram && /toutiaomicroapp/i.test(navigator.userAgent); const v = window.wx && window.wx.miniProgram && /micromessenger/i.test(navigator.userAgent) && /miniProgram/i.test(navigator.userAgent); const p = window.qa && /quickapp/i.test(navigator.userAgent); for (var l, _ = function () { window.UniAppJSBridge = !0, document.dispatchEvent(new CustomEvent('UniAppJSBridgeReady', { bubbles: !0, cancelable: !0 })) }, f = [function (e) { if (r || d) return window.__dcloud_weex_postMessage || window.__dcloud_weex_ ? document.addEventListener('DOMContentLoaded', e) : window.plus && s.test(document.readyState) ? setTimeout(e, 0) : document.addEventListener('plusready', e), o }, function (e) { if (v) return window.WeixinJSBridge && window.WeixinJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener('WeixinJSBridgeReady', e), window.wx.miniProgram }, function (e) { if (c) return window.QQJSBridge && window.QQJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener('QQJSBridgeReady', e), window.qq.miniProgram }, function (e) {
|
||||
if (w) {
|
||||
document.addEventListener('DOMContentLoaded', e); const n = window.my; return {
|
||||
navigateTo: n.navigateTo, navigateBack: n.navigateBack, switchTab: n.switchTab, reLaunch: n.reLaunch, redirectTo: n.redirectTo, postMessage: n.postMessage, getEnv: n.getEnv
|
||||
}
|
||||
}
|
||||
}, function (e) { if (u) return document.addEventListener('DOMContentLoaded', e), window.swan.webView }, function (e) { if (g) return document.addEventListener('DOMContentLoaded', e), window.tt.miniProgram }, function (e) {
|
||||
if (p) {
|
||||
window.QaJSBridge && window.QaJSBridge.invoke ? setTimeout(e, 0) : document.addEventListener('QaJSBridgeReady', e); const n = window.qa; return {
|
||||
navigateTo: n.navigateTo, navigateBack: n.navigateBack, switchTab: n.switchTab, reLaunch: n.reLaunch, redirectTo: n.redirectTo, postMessage: n.postMessage, getEnv: n.getEnv
|
||||
}
|
||||
}
|
||||
}, function (e) { return document.addEventListener('DOMContentLoaded', e), o }], m = 0; m < f.length && !(l = f[m](_)); m++);l || (l = {}); const E = typeof uni !== 'undefined' ? uni : {}; if (!E.navigateTo) for (const b in l)t(l, b) && (E[b] = l[b]); return E.webView = l, E
|
||||
})))
|
||||
@@ -0,0 +1 @@
|
||||
<head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no"><style>body,html{width:100%;height:100%;overflow:hidden}body{margin:0}video{width:300px;height:225px}img{max-width:100%;-webkit-touch-callout:none}@keyframes show{0%{opacity:0}100%{opacity:1}}</style></head><body><div id="content"></div><script type="text/javascript" src="./js/uni.webview.min.js"></script><script type="text/javascript" src="./js/handler.js"></script></body>
|
||||
Reference in New Issue
Block a user