uni-app swiper 内web-view 调用evalJs 失败,this.$refs.webview.evalJs is not a function

发布于 1周前 作者 h691938207 来自 Uni-App

uni-app swiper 内web-view 调用evalJs 失败,this.$refs.webview.evalJs is not a function

测试过的手机

华为Novaz, iOS 模拟器

示例代码

<swiper>  
    <swiper-item>  
           <text>演示,非真实代码</text>  
        </swiper-item>  
         <swiper-item>    
                        <web-view ref="webview" :style="{width:'750rpx',height:mainHeight}" :src="nav.apiUrl" :webview-styles="webviewStyles" @message="onWebviewPostMessage" @onPostMessage="onWebviewPostMessage"></web-view>  

    </swiper-item>  
</swiper>  

this.$refs.webview.evalJs("document.body.style.background ='#00FF00'");

操作步骤

在一个nvue 页面里swiper 里面放一个web-view,使用ref 来调用evalJs

预期结果

成功执行evalJs

实际结果

this.$refs.webview.evalJs is not a function

bug描述

swiper 内web-view 调用evalJs 失败,显示:this.$refs.webview.evalJs is not a function,其它场景可以正常调用

相关链接


2 回复

复制我的去调试看看
onReady() {
var currentWebview = this.$scope.$getAppWebview(); //获取当前页面的webview对象,此对象相当于html5plus里的plus.webview.currentWebview()
setTimeout(function() {
let webview = currentWebview.children()[0];
webview.evalJS(alert(123));
}, 5000); //如果是页面初始化调用时,需要延时一下
},


uni-app 中使用 swiper 组件嵌套 web-view 组件时,调用 evalJs 方法失败,提示 this.$refs.webview.evalJs is not a function,可能是由于以下几个原因导致的:

1. web-view 组件未正确引用

确保你在 web-view 组件上正确设置了 ref 属性,并且在 swiper 组件中正确引用了 web-view

<template>
  <swiper>
    <swiper-item>
      <web-view ref="webview" :src="webViewUrl"></web-view>
    </swiper-item>
  </swiper>
</template>

<script>
export default {
  data() {
    return {
      webViewUrl: 'https://example.com'
    };
  },
  methods: {
    evalJsInWebView() {
      this.$refs.webview.evalJs('alert("Hello from uni-app!");');
    }
  }
};
</script>

2. web-view 组件未加载完成

web-view 组件需要加载完成后才能调用 evalJs 方法。你可以在 web-view@load 事件中确保页面加载完成后再调用 evalJs

<template>
  <swiper>
    <swiper-item>
      <web-view ref="webview" :src="webViewUrl" @load="onWebViewLoad"></web-view>
    </swiper-item>
  </swiper>
</template>

<script>
export default {
  data() {
    return {
      webViewUrl: 'https://example.com'
    };
  },
  methods: {
    onWebViewLoad() {
      this.$refs.webview.evalJs('alert("Hello from uni-app!");');
    }
  }
};
</script>

3. swiper 组件导致的问题

swiper 组件可能会导致 web-view 组件的引用问题。你可以尝试在 swiper@change 事件中重新获取 web-view 的引用。

<template>
  <swiper @change="onSwiperChange">
    <swiper-item>
      <web-view ref="webview" :src="webViewUrl" @load="onWebViewLoad"></web-view>
    </swiper-item>
  </swiper>
</template>

<script>
export default {
  data() {
    return {
      webViewUrl: 'https://example.com'
    };
  },
  methods: {
    onSwiperChange() {
      this.$nextTick(() => {
        this.$refs.webview.evalJs('alert("Hello from uni-app!");');
      });
    },
    onWebViewLoad() {
      this.$refs.webview.evalJs('alert("Hello from uni-app!");');
    }
  }
};
</script>

4. web-view 组件的兼容性问题

某些平台可能对 web-view 组件的支持不完全,导致 evalJs 方法不可用。你可以检查目标平台的文档,确认 web-view 组件是否支持 evalJs 方法。

5. web-view 组件的版本问题

确保你使用的 uni-app 版本是最新的,因为旧版本可能存在一些 bug 或兼容性问题。

6. 使用 uni.webView.evalJS

如果 this.$refs.webview.evalJs 不可用,你可以尝试使用 uni.webView.evalJS 方法。

uni.webView.evalJS('alert("Hello from uni-app!");');
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!