在混合开发的场景中,有时需要把原生的返回事件交由H5进行处理,让H5去做一些操作:如点击原生返回时,h5要进行弹框提示或者进行一些数据保存。那么如何去做?
H5端实现,以Vue为例:
第1步:在mounted()中需要给页面挂载js方法,如下
mounted() {
/**
* 如果需要拦截原生的返回事件,需要挂载js方法(方法名任意).
* 该方法返回true代表H5拦截处理,见第2步.
*/
window.NativeBackListener = this.NativeBackListener;
},
第2步:在methods中添加要挂在的js方法
methods:{
NativeBackListener() {
this.handleNativeBack();//自定义方法,可以在该方法中进行场景处理。
return true;//这个true可以代表该H5页面要拦截原生的返回事件进行处理
},
handleNativeBack(){
//....进行场景处理
}
}
原生实现,以Android为例:
Android的原生返回可以通过手势(物理返回)或者点击返回箭头进行返回。处理时其实没差别,我们可以进行拦截让webview执行上面定义的NativeBackListener 方法,并根据回调结果进行判断该H5是否拦截原生的返回事件,从而进行相应的处理。
如物理处理时,重写onKeyDown方法
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
webContainer.evaluateJavascript("javascript:NativeBackListener()", new ValueCallback<String>() {
@Override
public void onReceiveValue(String value) {
if ("false".equals(value) || "null".equals(value)) {
finish();//h5页面不进行拦截,finish当前页
} else if ("true".equals(value)) {
// h5进行拦截了,就不能finish当前页
}
}
});
}
return true;
}
经测试发现,采用这种实现方式时,如果H5页面加载失败,不影响原生的返回功能。