mui.PopPicker添加选择改变事件

昨天在开发收货地址功能时遇到一个问题,使用mui.PopPicker选择行政区时发现没有监控选择值发生改变的事件,这就意味着需要加载全国数据,很显然这是不现实的,百度无果后决定从mui.PopPicker.js源码中入手,在源码中发现如下代码:

pickerElement.addEventListener('change', function(event) {
	var nextPickerElement = this.nextSibling;
	if (nextPickerElement && nextPickerElement.picker) {	
		var eventData = event.detail || {};
		var preItem = eventData.item || {};
		nextPickerElement.picker.setItems(preItem.children);
	}
}, false);

经过实验这个change就是我需要的事件,于是我就在这个事件处理函数里添加如下代码:

if(self.selectionChanged){
   //当选择改变时调用此方法
   self.selectionChanged();
}

使用方法如下:

var picker = new mui.PopPicker({
	layer: 4,
	buttons: ['取消', '确定'],
});
picker.selectionChanged = function(){
   //处理代码
}

完整的mui.PopPicker.js如下:

/**
 * 弹出选择列表插件
 * 此组件依赖 listpcker ,请在页面中先引入 mui.picker.css + mui.picker.js
 * varstion 1.0.1
 * by Houfeng
 * Houfeng@DCloud.io
 */

(function($, document) {

	//创建 DOM
	$.dom = function(str) {
		if (typeof(str) !== 'string') {
			if ((str instanceof Array) || (str[0] && str.length)) {
				return [].slice.call(str);
			} else {
				return [str];
			}
		}
		if (!$.__create_dom_div__) {
			$.__create_dom_div__ = document.createElement('div');
		}
		$.__create_dom_div__.innerHTML = str;
		return [].slice.call($.__create_dom_div__.childNodes);
	};

	var panelBuffer = '<div class="mui-poppicker">\
		<div class="mui-poppicker-header">\
			<button class="mui-btn mui-poppicker-btn-cancel">取消</button>\
			<button class="mui-btn mui-btn-blue mui-poppicker-btn-ok">确定</button>\
			<div class="mui-poppicker-clear"></div>\
		</div>\
		<div class="mui-poppicker-body">\
		</div>\
	</div>';

	var pickerBuffer = '<div class="mui-picker">\
		<div class="mui-picker-inner">\
			<div class="mui-pciker-rule mui-pciker-rule-ft"></div>\
			<ul class="mui-pciker-list">\
			</ul>\
			<div class="mui-pciker-rule mui-pciker-rule-bg"></div>\
		</div>\
	</div>';

	//定义弹出选择器类
	var PopPicker = $.PopPicker = $.Class.extend({
		//构造函数
		init: function(options) {
			var self = this;
			self.options = options || {};
			self.options.buttons = self.options.buttons || ['取消', '确定'];
			self.panel = $.dom(panelBuffer)[0];
			document.body.appendChild(self.panel);
			self.ok = self.panel.querySelector('.mui-poppicker-btn-ok');
			self.cancel = self.panel.querySelector('.mui-poppicker-btn-cancel');
			self.body = self.panel.querySelector('.mui-poppicker-body');
			self.mask = $.createMask();
			self.cancel.innerText = self.options.buttons[0];
			self.ok.innerText = self.options.buttons[1];
			self.cancel.addEventListener('tap', function(event) {
				self.hide();
			}, false);
			self.ok.addEventListener('tap', function(event) {
				if (self.callback) {
					var rs = self.callback(self.getSelectedItems());
					if (rs !== false) {
						self.hide();
					}
				}
			}, false);
			self.mask[0].addEventListener('tap', function() {
				self.hide();
			}, false);
			self._createPicker();
			//防止滚动穿透
			self.panel.addEventListener('touchstart', function(event) {
				event.preventDefault();
			}, false);
			self.panel.addEventListener('touchmove', function(event) {
				event.preventDefault();
			}, false);
		},
		_createPicker: function() {
			var self = this;
			var layer = self.options.layer || 1;
			var width = (100 / layer) + '%';
			self.pickers = [];
			for (var i = 1; i <= layer; i++) {
				var pickerElement = $.dom(pickerBuffer)[0];
				pickerElement.style.width = width;
				self.body.appendChild(pickerElement);
				var picker = $(pickerElement).picker();
				self.pickers.push(picker);
				pickerElement.addEventListener('change', function(event) {
					var nextPickerElement = this.nextSibling;
					if (nextPickerElement && nextPickerElement.picker) {
						var eventData = event.detail || {};
						var preItem = eventData.item || {};
						nextPickerElement.picker.setItems(preItem.children);
					}
					if(self.selectionChanged){
					    //当选择改变时调用此方法
						self.selectionChanged();
					}
				}, false);
			}
		},
		//填充数据
		setData: function(data) {
			var self = this;
			data = data || [];
			self.pickers[0].setItems(data);
		},
		//获取选中的项(数组)
		getSelectedItems: function() {
			var self = this;
			var items = [];
			for (var i in self.pickers) {
				var picker = self.pickers[i];
				items.push(picker.getSelectedItem() || {});
			}
			return items;
		},
		//显示
		show: function(callback) {
			var self = this;
			self.callback = callback;
			self.mask.show();
			document.body.classList.add($.className('poppicker-active-for-page'));
			self.panel.classList.add($.className('active'));
			//处理物理返回键
			self.__back = $.back;
			$.back = function() {
				self.hide();
			};
		},
		//隐藏
		hide: function() {
			var self = this;
			if (self.disposed) return;
			self.panel.classList.remove($.className('active'));
			self.mask.close();
			document.body.classList.remove($.className('poppicker-active-for-page'));
			//处理物理返回键
			$.back=self.__back;
		},
		dispose: function() {
			var self = this;
			self.hide();
			setTimeout(function() {
				self.panel.parentNode.removeChild(self.panel);
				for (var name in self) {
					self[name] = null;
					delete self[name];
				};
				self.disposed = true;
			}, 300);
		}
		
	});

})(mui, document);

效果如下:

效果图

mui.PopPicker.js使用方法参考:MUI-picker(选择器),一级、二级联动、三级联动

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: 据了解,苹果于2020年9月15日发布的iOS 14中,引入了一种叫做“特定地区设置”的新功能,该功能会根据用户所在的地理位置,限制部分应用的可用范围。在某些地区,该设置可能会影响mui.picker选择器在iPhone 12上的正常使用。 此外,苹果在12系列中进行了诸多技术和硬件方面的升级,这可能会导致mui.picker选择器未作出相应更改,无法与新的硬件设备进行兼容。因此,选择器使用者可能需要更新选择器的版本或等待厂商发布更新版本。 然而,需要注意的是,以上分析仅仅是对此问题的一种猜测,并未得到官方的确认。还需交流合作,共同解决此类问题。 ### 回答2: 据我们了解,最近在使用 mui.picker 选择器时发现苹果12无法正常选择的情况确实存在。这个问题主要出现在 iOS 14 系统上,尤其是在苹果12设备上。实际上,mui.picker 选择器是基于浮动层实现的,而由于 iOS 14 在设计上进行了调整,导致了选择器无法弹出。 如果使用mui.picker选择器无法选择的话,我们可以尝试使用其它替代方案,比如常规的HTML表单元素、jQuery、zepto插件等。如果非要使用mui.picker选择器的话,我们可以尝试将mui.picker插件更新至最新版,或者自行调整插件代码以适应 iOS 14 的设计变化。 还有一种方法是使用H5的input[type="date"],它的UI也很好看,适用于弹窗中使用。 总之,由于这个问题的根本原因是 iOS 14 系统在设计上出现了问题,因此我们只能通过调整插件代码或者使用其它解决方案来解决这个问题。希望我们的回答能够帮到你,如果还有其他问题,请随时让我们知道。 ### 回答3: mui.picker选择器是一款非常受欢迎的前端开发工具,它可以很好地实现数据选择的功能。然而,在苹果12上,用户在使用该工具时可能会发现无法正常选择数据的情况。 这主要是由于苹果12的操作系统更新,导致mui.picker选择器与操作系统之间的兼容性出现了问题。虽然该问题可能会给一些开发者带来困扰,但是这并不意味着mui.picker选择器已经不适用于苹果12了。实际上,开发者可以通过一些调试和优化的方法来解决这个问题。 首先,开发者可以尝试更新mui.picker选择器的版本,以确保它可以与最新的操作系统兼容。如果这种方法没有效果,那么开发者还可以尝试寻找其他类似的数据选择工具,如各种插件程序和组件库,来替代mui.picker选择器实现数据选择功能。当然,这些替代方案需要进行充分的测试和验证,以确保它们可以完美地和苹果12的操作系统兼容。 总之,对于苹果12上使用mui.picker选择器无法选择数据的问题,开发者可以通过更新版本、替代方案等多种方法来解决。毕竟,随着科技的日益发展,前端开发工具和技术也在不断更新和进化,做好更新和迭代将能更好地服务于用户。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

电脑狂人-菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值