uni-app使用web-view组件APP实现返回上一页

一、功能概述

本案例实现了在Uniapp中内嵌H5网页并深度控制的三项核心功能:

  • 隐藏指定特征的内链元素
  • 自定义导航栏返回逻辑
  • Webview原生特性保留

二、代码解析

2.1 基础结构
html 复制代码
<template>
  <view>
    <web-view 
      :webview-styles="webviewStyles" 
      src="www.xxx.cn">
    </web-view>
  </view>
</template>
  • webview-styles:控制原生Webview样式
  • src:指定加载的H5页面地址
2.2 核心控制逻辑
js 复制代码
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;
  }
}

三、关键技术点

3.1 DOM操作时机控制
  • onReady生命周期保证组件初始化完成
  • loaded事件监听确保H5页面完全加载
  • evalJS执行时机验证:
    • 100ms延迟检测
    • DOMContentLoaded事件绑定
    • 重试机制实现
3.2 选择器优化方案
js 复制代码
// 原生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());
3.3 返回逻辑增强
js 复制代码
// 多页面栈处理
const webview = this.$scope.$getAppWebview().children()[0];
if (webview.canBack()) {
  webview.back();
} else {
  uni.navigateBack();
}
return true;

四、安全与优化实践

4.1 安全防护措施
  • 内容安全策略(CSP)设置
  • 白名单域名验证
  • 执行脚本过滤正则:
js 复制代码
const sanitize = code => code.replace(/<\/?script>/gi, '');
4.2 性能优化方案
  • Intersection Observer实现懒执行
  • MutationObserver监听DOM变化
  • 防抖执行机制:
js 复制代码
let timeout;
const debounceEval = (code, delay = 300) => {
  clearTimeout(timeout);
  timeout = setTimeout(() => {
    currentWebview.evalJS(code);
  }, delay);
}

五、跨平台适配方案

特性 Android iOS
滚动效果 需配置硬件加速 原生弹性滚动
缓存策略 多进程共享 WebKit独立管理
手势事件 需处理长按延迟 3D Touch支持
调试工具 Chrome Inspect Safari Webkit

六、扩展应用场景

6.1 双向通信实现
js 复制代码
// H5页面
window.postMessage({ type: 'FROM_H5', data: ... });

// Uniapp
const webview = ...;
webview.addEventListener('message', e => {
  console.log('Received:', JSON.parse(e.message));
});
6.2 混合渲染方案
js 复制代码
// 原生组件覆盖
const coverView = new plus.nativeObj.View({
  position: 'absolute',
  styles: { background: 'transparent' }
});
coverView.addEventListener('click', () => {
  // 处理自定义交互
});

七、最佳实践建议

  • 使用<iframe>替代方案时需进行沙箱隔离
  • 关键操作建议通过postMessage进行数据通信
  • 定期检查Webview安全更新
  • 复杂交互推荐使用Uni-WebSDK方案
  • 性能监控建议:
js 复制代码
const metrics = await currentWebview.getWebPerformance();
console.log('FPS:', metrics.framesPerSecond);

页面完整代码如下:

html 复制代码
<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>
相关推荐
华玥作者16 小时前
[特殊字符] VitePress 对接 Algolia AI 问答(DocSearch + AI Search)完整实战(下)
前端·人工智能·ai
Mr Xu_16 小时前
告别冗长 switch-case:Vue 项目中基于映射表的优雅路由数据匹配方案
前端·javascript·vue.js
前端摸鱼匠16 小时前
Vue 3 的toRefs保持响应性:讲解toRefs在解构响应式对象时的作用
前端·javascript·vue.js·前端框架·ecmascript
lang2015092816 小时前
JSR-340 :高性能Web开发新标准
java·前端·servlet
好家伙VCC17 小时前
### WebRTC技术:实时通信的革新与实现####webRTC(Web Real-TimeComm
java·前端·python·webrtc
未来之窗软件服务18 小时前
未来之窗昭和仙君(六十五)Vue与跨地区多部门开发—东方仙盟练气
前端·javascript·vue.js·仙盟创梦ide·东方仙盟·昭和仙君
嘿起屁儿整18 小时前
面试点(网络层面)
前端·网络
VT.馒头18 小时前
【力扣】2721. 并行执行异步函数
前端·javascript·算法·leetcode·typescript
phltxy19 小时前
Vue 核心特性实战指南:指令、样式绑定、计算属性与侦听器
前端·javascript·vue.js
Byron070720 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js