本案例实现了在Uniapp中内嵌H5网页并深度控制的三项核心功能:
<template>
<view>
<web-view
:webview-styles="webviewStyles"
src="www.xxx.cn">
web-view>
view>
template>
export default {
onReady() {
const currentWebview = this.$scope.$getAppWebview().children()[0];
currentWebview.addEventListener("loaded", () => {
currentWebview.evalJS(`
$("ul.fed-part-rows a[href*='www.xxx.cn']")
.parent()
.hide();
`);
});
},
onBackPress(e) {
this.$scope.$getAppWebview().children()[0].back();
return true;
}
}
// 原生DOM方案
document.querySelectorAll('ul.fed-part-rows a[href*="www.xxx.cn"]')
.forEach(el => el.parentNode.style.display = 'none');
// 现代浏览器API
Array.from(document.getElementsByClassName('fed-part-rows'))
.flatMap(ul => [...ul.getElementsByTagName('a')])
.filter(a => a.href.includes('www.xxx.cn'))
.forEach(a => a.parentElement.remove());
// 多页面栈处理
const webview = this.$scope.$getAppWebview().children()[0];
if (webview.canBack()) {
webview.back();
} else {
uni.navigateBack();
}
return true;
const sanitize = code => code.replace(/<\/?script>/gi, '');
let timeout;
const debounceEval = (code, delay = 300) => {
clearTimeout(timeout);
timeout = setTimeout(() => {
currentWebview.evalJS(code);
}, delay);
}
五、跨平台适配方案
特性 | Android | iOS |
---|---|---|
滚动效果 | 需配置硬件加速 | 原生弹性滚动 |
缓存策略 | 多进程共享 | WebKit独立管理 |
手势事件 | 需处理长按延迟 | 3D Touch支持 |
调试工具 | Chrome Inspect | Safari Webkit |
// H5页面
window.postMessage({ type: 'FROM_H5', data: ... });
// Uniapp
const webview = ...;
webview.addEventListener('message', e => {
console.log('Received:', JSON.parse(e.message));
});
// 原生组件覆盖
const coverView = new plus.nativeObj.View({
position: 'absolute',
styles: { background: 'transparent' }
});
coverView.addEventListener('click', () => {
// 处理自定义交互
});
替代方案时需进行沙箱隔离const metrics = await currentWebview.getWebPerformance();
console.log('FPS:', metrics.framesPerSecond);
页面完整代码如下:
<template>
<view>
<web-view :webview-styles="webviewStyles" src="www.xxx.cn">web-view>
view>
template>
<script>
export default {
data() {
return {};
},
onReady() {
var currentWebview = this.$scope.$getAppWebview().children()[0];
currentWebview.addEventListener("loaded", function() {
currentWebview.evalJS(
"$(\"ul.fed-part-rows a[href*='www.xxx.cn']\").parent().hide();"
);
});
},
onBackPress(e) {
this.$scope
.$getAppWebview()
.children()[0]
.back();
return true;
}
};
script>