蔡cai
蔡cai
  • 发布:2024-08-05 11:54
  • 更新:2025-11-21 14:32
  • 阅读:1189

【webview】实现应用页面刷新,webview重新请求接口

分类:uni-app

1、h5环境,webview可以接收主项目发过来的值

主项目(vue2)添加以下代码:

<web-view ref="webview" :src="path"></web-view>  

onShow() {  
    this.$nextTick(function() {  
        if (this.path) {  
            // #ifdef H5  
            // 向webview发送消息  
            this.$refs.webview.iframe.contentWindow.postMessage({ isOnShow: true }, "*");  
            // #endif  
        }  
    })  
},

主项目(vue3选项式)添加以下代码:

<web-view ref="webviewRef" :src="path"></web-view>  

onShow() {  
    this.$nextTick(function() {  
        if (this.path) {  
            // #ifdef H5  
            // 向webview发送消息  
            // 方式一:  
            this.$refs.webviewRef.$el.ownerDocument.body.lastChild.contentWindow.postMessage({ isOnShow: true }, "*");  
            // 方式二:  
            // this.$refs.webviewRef.$el.ownerDocument.body.lastElementChild.contentWindow.postMessage({ isOnShow: true }, "*");  
            // #endif  
        }  
    })  
}

主项目(vue3组合式)添加以下代码:

<web-view ref="webviewRef" :src="path"></web-view>  

const webviewRef = ref(null);  
onShow(() => {  
    nextTick(function() {  
        if (path.value) {  
            // #ifdef H5  
            // 向webview发送消息  
            // 方式一:  
            webviewRef.value.$el.ownerDocument.body.lastChild.contentWindow.postMessage({ isOnShow: true }, "*");  
            // 方式二:  
            // webviewRef.value.$el.ownerDocument.body.lastElementChild.contentWindow.postMessage({ isOnShow: true }, "*");  
            // #endif  
        }  
    })  
})

webview项目添加以下代码:

// h5环境的webview环境  
window.addEventListener("message", (e) => {  
    if (e.data.isOnShow) {  
        // 执行相关逻辑  
    }  
}, false);

2、app环境,webview可以接收主项目发过来的值

主项目添加以下代码:

<web-view :src="path"></web-view>  

onShow() {  
    this.$nextTick(function() {  
        // #ifdef APP  
        if (this.$scope.$getAppWebview().children() && this.$scope.$getAppWebview().children().length > 0) {  
            const webview = this.$scope.$getAppWebview().children()[0];  
            const msg = { isOnShow: true }  
            webview.evalJS(`msgFromApp(${JSON.stringify(msg)})`);  
        }  
        // #endif  
    })  
}

webview项目添加以下代码:

// app环境的webview环境  
window.msgFromApp = (e) => {  
    if (e.isOnShow) {  
        // 执行相关逻辑  
    }  
}

3、微信小程序环境(只在手机上生效),webview不可以接收主项目发过来的值,除非更换webview标签上的src属性

主项目添加以下代码:

<web-view :src="path"></web-view>

webview项目添加以下代码:

const enums = {  
    "hidden": "visibilitychange",  
    "mozHidden": "mozVisibilitychange",  
    "msHidden": "msVisibilitychange",  
    "webkitHidden": "webkitVisibilitychange"  
}  
let visibilitychange = "";  
let hidden = "";  
Object.keys(enums).map(key => {  
    if (typeof document[key] === "boolean" && !visibilitychange) {  
        hidden = key;  
        visibilitychange = enums[key];  
    }  
})  
visibilitychange = visibilitychange || "visibilitychange";  
hidden = hidden || "hidden";  
window.frames.document.addEventListener(visibilitychange, () => {  
    console.log("当前页面是否隐藏:", document[hidden]);  
    if (document[hidden]) {  
        console.log('页面隐藏');  
    } else {  
        console.log('页面显示')  
        // 执行相关逻辑  
    }  
})

↓↓↓ 各位大佬点点赞

1 关注 分享
aliang888

要回复文章请先登录注册

蔡cai

蔡cai (作者)

回复 蔡cai :
写错,具体看文章内容
2025-11-21 14:32
蔡cai

蔡cai (作者)

回复 蔡cai :
组合式写法:
const webviewRef = ref(null);
webviewRef.$el.ownerDocument.body.lastChild.contentWindow.postMessage({ isOnShow: true }, "*");
2025-11-21 14:16
蔡cai

蔡cai (作者)

回复 aliang888 :
this.$refs.webview.iframe.contentWindow.postMessage({ isOnShow: true }, "*");替换以下代码:
方式一:this.$refs.webviewRef.$el.ownerDocument.body.lastChild.contentWindow.postMessage({ isOnShow: true }, "*");
方式二:this.$refs.webviewRef.$el.ownerDocument.body.lastElementChild.contentWindow.postMessage({ isOnShow: true }, "*");
2025-11-21 14:13
蔡cai

蔡cai (作者)

回复 aliang888 :
我试试vue3
2025-11-21 10:27
蔡cai

蔡cai (作者)

回复 aliang888 :
这个是vue2版本的
2025-11-21 10:27
aliang888

aliang888

回复 蔡cai :
您是啥版本啊,我的确实不行HBuilder X 4.85,"compilerVersion": 3, "vueVersion": "3"
this.$refs.webview.iframe=undefined this.$refs.webview=Proxy(Object)
2025-11-21 10:18
蔡cai

蔡cai (作者)

回复 aliang888 :
是字段,不是元素
2025-11-20 17:31
蔡cai

蔡cai (作者)

回复 aliang888 :
刚试了下,有的;你打印下this.$refs.webview,里面有iframe这个字段
2025-11-20 17:30
aliang888

aliang888

2025-11-20 在h5环境,父页面this.$refs.webview.iframe这个不行,打开打开者工具,看html树结构,uni-web-view下面根本就没有iframe元素
2025-11-20 15:21