mui.back()遇到的问题,返回之后键盘事件失效

262 阅读3分钟

背景:mui开发扫描枪应用(扫码枪有专属的按钮),A页面监听用户按钮扫码操作,首次进入A页面时候,键盘事件可以正常的触发,从A页面跳转到B页面,B页面没有进行任何操作,直接使用mui.back()方法返回A页面,直接按压扫码,事件不触发,注意是返回A页面后,页面没有进行任何操作,如果用户点击了屏幕,再次按压扫码,事件可以正常触发!目前的问题是为什么一定要点击屏幕键盘事件才可以正常的激活?

一 :既然页面好像属于未激活状态,那就返回后刷新页面试试,在B页面的配置信息编辑返回之前的自定义函数,beforeback:{...配置自定义函数},A页面监听自定义函数,触发页面刷新,然鹅并没有什么用...

mui.init({
	beforeback: function(){
		//获得列表界面的webview
		var list = plus.webview.getWebviewById('list');
		//触发列表界面的自定义事件(refresh),从而进行数据刷新
		mui.fire(list,'refresh');
		//返回true,继续页面关闭逻辑
		return true;
	}
});

二 :又是一阵折腾,发现返回后的A页面文档没有聚焦,所以键盘事件无法被监听到,即document.hasFocus()为false,那么我手动聚焦一个边界以外的文本框是不是就可以了,结果发现仅仅通过js 代码依然无法聚焦到文本框,无论是之前已有的元素,还是返回之后创建的元素,再手动聚焦,就是无法通过ele.focus()方式聚焦,延迟聚焦等方式都尝试过了,就是不能把焦点干上去,无语了...这也就表示文档依然无法聚焦,事件就没法监听到,怀疑是mui.back()返回页面时候保存了之前的一些页面状态,但是这个页面状态需要用户点击屏幕才能触发,目前没有什么好的方式激活这个状态.

三 :既然mui.back()返回页面会导致键盘事件无法第一事件被监听到,那么就换一种方式回退的到A页面,其实不应该叫回退了,我是直接打开新页面的方式,即mui.openWindow(),这样就和每次进入A页面一样的了,在每次打开(返回)A页面时候关闭B页面,这样就可以在返回A页面时候不用点击屏幕就可以触发键盘事件了,注意关闭B页面逻辑需要延迟100毫秒以上,mui官方关闭动画duration:animationTime//页面动画持续时间,Android平台默认100毫秒,iOS平台默认200毫秒.

总结 :目前使用的是第三种方式解决业务需求的,只能说是曲线救国了,相当于每次返回A页面都是新开的,为什么mui.back返回会导致第一时间键盘事件无法被监听到,底层原因没有找到,我使用的是真机扫码枪调试,不知是否这个设备问题还是mui.back的问题,好像网上没人反馈过类似的问题