uni-app webview加载h5页面时物理键返回会让h5页面back两级中断http请求导致客户端报错

uni-app webview加载h5页面时物理键返回会让h5页面back两级中断http请求导致客户端报错

开发环境 版本号 项目创建方式
Windows 10 HBuilderX

示例代码:

onBack() {  
    ab_.debug && console.log('webview canBack')  
    webview.canBack(function(e) {  
        if (e && e.canBack) {  
            ab_.debug && console.log('canBack')  
           webview.back()  
        } else {  
            ab_.debug && console.log('navBack')  
            navBack ? navBack() : abUni.navigateBack()  
        }  
    })  
},  

更多关于uni-app webview加载h5页面时物理键返回会让h5页面back两级中断http请求导致客户端报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

能否给一个能复现的demo

更多关于uni-app webview加载h5页面时物理键返回会让h5页面back两级中断http请求导致客户端报错的实战教程也可以访问 https://www.itying.com/category-93-b0.html


创建webview时设置一下返回键的处理方式。见文档:
https://www.html5plus.org/doc/zh_cn/webview.html#plus.webview.WebviewStyles

backButtonAutoControl: (String 类型 )Webview窗口自动处理返回键逻辑
当Webview窗口在显示栈顶,并且Webview窗口中没有调用JS监听返回键(plus.key.addEventListener(‘backbutton’,…))时按下返回键响应行为。 可取值: “hide” - 隐藏Webview窗口,隐藏动画与上一次调用显示时设置的动画类型相对应(如“slide-in-right”对应的关闭动画为“slid-out-right”); “close” - 关闭Webview窗口,关闭动画与上一次调用显示时设置的动画类型相对应(如“slide-in-right”对应的关闭动画为“slid-out-right”) ; “none” - 不做操作,将返回键传递给下一Webview窗口处理; “quit” - 退出应用。

uni-app 中使用 webview 加载 H5 页面时,物理返回键默认会触发 webview 的返回行为,这可能会导致 H5 页面的历史记录回退两级或中断正在进行的 HTTP 请求,进而引发客户端报错。为了解决这个问题,你可以通过以下方式来处理物理返回键的行为:

1. 监听物理返回键事件

uni-app 中,你可以通过监听 onBackPress 事件来捕获物理返回键的点击事件,并自定义处理逻辑。

export default {
  onBackPress() {
    // 获取当前 webview 实例
    const pages = getCurrentPages();
    const currentPage = pages[pages.length - 1];
    const webview = currentPage.$getAppWebview();

    // 判断当前页面是否是 webview
    if (webview && webview.children && webview.children.length > 0) {
      const childWebview = webview.children[0];

      // 判断 webview 是否可以返回
      if (childWebview.canBack()) {
        // 让 webview 返回上一级
        childWebview.back();
        return true; // 阻止默认返回行为
      }
    }

    // 默认返回行为
    return false;
  }
};

2. 在 H5 页面中处理返回逻辑

如果 H5 页面中有复杂的路由逻辑或需要处理返回行为,可以在 H5 页面中通过 window.historywindow.onpopstate 事件来监听返回行为,并执行相应的逻辑。

window.onpopstate = function(event) {
  // 处理返回逻辑
  console.log('H5 页面返回事件触发');
  // 可以在这里取消正在进行的 HTTP 请求
};

3. 避免中断 HTTP 请求

如果返回行为导致 HTTP 请求中断,可以在 H5 页面中使用 AbortController 来手动取消请求,或者在请求完成前阻止返回行为。

const controller = new AbortController();
const signal = controller.signal;

fetch('https://example.com/api', { signal })
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(err => {
    if (err.name === 'AbortError') {
      console.log('请求被取消');
    } else {
      console.error('请求失败', err);
    }
  });

// 在返回时取消请求
window.onpopstate = function(event) {
  controller.abort();
};

4. 与原生端通信

如果需要在 uni-app 和 H5 页面之间进行更复杂的交互,可以通过 postMessageuni-appuni.postMessage 方法进行通信,确保返回行为不会影响 H5 页面的正常逻辑。

// uni-app 端
uni.postMessage({
  data: {
    type: 'backPress'
  }
});

// H5 页面
window.addEventListener('message', function(event) {
  if (event.data.type === 'backPress') {
    // 处理返回逻辑
  }
});
回到顶部