移动端开发,我选mui。
移动端选择框插件,时间选择插件,我选mui.picker。
但是,它的坑,你踩过几次呢。
我不知道你踩过几次,我只知道我就踩过一个坑。对的,只有一个,反馈给官方,也没看到优化和修缮。
能咋办,自食其力吧,我就自己搞了一个修缮版本的mui.picker.min.js。
坑是啥
这个事情是这样的:页面使用了选择器,然后第一次使用选择器后再马上点击页面的任意一个输入框,在输入框获取焦点弹出输入法的时候页面会出现滚动条,这个时候上拉滚动会出现选择器插件。这个是个bug,bug,bug....
坑怎么来的
这个事情是这样的:当我们点击选择器,弹出选择器,然后再点击页面的任意一个输入框,这个过程没有调用选择器关闭事件(当我们使用选择器的时候,可以在选择器右上方看到关闭或者完成按钮,这个按钮就是关闭选择器的作用)。原来是这么个问题。
怎么填坑
这个事情是这样的:坑是因为插件在失去焦点的时候不能自动关闭,所以只要在失去焦点的时候让它关闭就可以填坑了。
失去焦点契机
这个事情是这样的:我们懂的关闭选择器,但是什么时候关闭,所以我们需要了解选择器什么时候失去焦点。分析下,只有输入框和文本框才有机会让选择器失去焦点,好,找到契机了。
填坑动作
所以,只要在每个页面里头,给每个input和textarea绑定获取焦点的事件,在获取焦点的时候,关闭选择器,问题就解决了。
填坑代码
因为是要给mui.picker做补丁,而且要侵入mui-picker的源码,所以我就直接在mui.picker.js里头直接添加补丁。主要补丁代码如下(下面只是部分补丁代码,还有部分需要写入mui.picker的源码里头):
/**
* picker补丁,部分补丁放在原始的picker的插件代码里头
* 扫地僧 20190401
*/
var futurePicker = {};
/**
* 给当前页面的所有的input textarea对象添加获得焦点监听事件
*/
futurePicker.pickerList = function() {
var inputList = document.getElementsByTagName("input");
var textareaList = document.getElementsByTagName("textarea");
if (inputList) {
for (var i = 0, l = inputList.length; i < l; i++) {
inputList[i].onfocus = function() {
futurePicker.hidePicker()
}
}
}
if (textareaList) {
for (var i = 0, l = textareaList.length; i < l; i++) {
textareaList[i].onfocus = function() {
futurePicker.hidePicker()
}
}
}
}
/**
* 隐藏所有的picker对象
*/
futurePicker.hidePicker = function() {
var pickerObjList = document.querySelectorAll(".mui-poppicker");
if (pickerObjList) {
for (var i = 0, l = pickerObjList.length; i < l; i++) {
pickerObjList[i].style.visibility = "hidden";
}
}
var dtPickerObjList = document.querySelectorAll(".mui-dtpicker");
if (dtPickerObjList) {
for (var i = 0, l = dtPickerObjList.length; i < l; i++) {
dtPickerObjList[i].style.visibility = "hidden";
}
}
}
// 启动补丁
futurePicker.pickerList();
附件