|
|
/**
|
|
|
* Toggles switch
|
|
|
* @param {type} $
|
|
|
* @param {type} window
|
|
|
* @param {type} name
|
|
|
* @returns {undefined}
|
|
|
*/
|
|
|
(function($, window, name) {
|
|
|
|
|
|
var CLASS_SWITCH = $.className('switch');
|
|
|
var CLASS_SWITCH_HANDLE = $.className('switch-handle');
|
|
|
var CLASS_ACTIVE = $.className('active');
|
|
|
var CLASS_DRAGGING = $.className('dragging');
|
|
|
|
|
|
var CLASS_DISABLED = $.className('disabled');
|
|
|
|
|
|
var SELECTOR_SWITCH_HANDLE = '.' + CLASS_SWITCH_HANDLE;
|
|
|
|
|
|
var handle = function(event, target) {
|
|
|
if (target.classList && target.classList.contains(CLASS_SWITCH)) {
|
|
|
return target;
|
|
|
}
|
|
|
return false;
|
|
|
};
|
|
|
|
|
|
$.registerTarget({
|
|
|
name: name,
|
|
|
index: 100,
|
|
|
handle: handle,
|
|
|
target: false
|
|
|
});
|
|
|
|
|
|
|
|
|
var Toggle = function(element) {
|
|
|
this.element = element;
|
|
|
this.classList = this.element.classList;
|
|
|
this.handle = this.element.querySelector(SELECTOR_SWITCH_HANDLE);
|
|
|
this.init();
|
|
|
this.initEvent();
|
|
|
};
|
|
|
Toggle.prototype.init = function() {
|
|
|
this.toggleWidth = this.element.offsetWidth;
|
|
|
this.handleWidth = this.handle.offsetWidth;
|
|
|
this.handleX = this.toggleWidth - this.handleWidth - 3;
|
|
|
};
|
|
|
Toggle.prototype.initEvent = function() {
|
|
|
this.element.addEventListener($.EVENT_START, this);
|
|
|
this.element.addEventListener('drag', this);
|
|
|
this.element.addEventListener('swiperight', this);
|
|
|
this.element.addEventListener($.EVENT_END, this);
|
|
|
this.element.addEventListener($.EVENT_CANCEL, this);
|
|
|
|
|
|
};
|
|
|
Toggle.prototype.handleEvent = function(e) {
|
|
|
if (this.classList.contains(CLASS_DISABLED)) {
|
|
|
return;
|
|
|
}
|
|
|
switch (e.type) {
|
|
|
case $.EVENT_START:
|
|
|
this.start(e);
|
|
|
break;
|
|
|
case 'drag':
|
|
|
this.drag(e);
|
|
|
break;
|
|
|
case 'swiperight':
|
|
|
this.swiperight();
|
|
|
break;
|
|
|
case $.EVENT_END:
|
|
|
case $.EVENT_CANCEL:
|
|
|
this.end(e);
|
|
|
break;
|
|
|
}
|
|
|
};
|
|
|
Toggle.prototype.start = function(e) {
|
|
|
this.handle.style.webkitTransitionDuration = this.element.style.webkitTransitionDuration = '.2s';
|
|
|
this.classList.add(CLASS_DRAGGING);
|
|
|
if (this.toggleWidth === 0 || this.handleWidth === 0) { //当switch处于隐藏状态时,width为0,需要重新初始化
|
|
|
this.init();
|
|
|
}
|
|
|
};
|
|
|
Toggle.prototype.drag = function(e) {
|
|
|
var detail = e.detail;
|
|
|
if (!this.isDragging) {
|
|
|
if (detail.direction === 'left' || detail.direction === 'right') {
|
|
|
this.isDragging = true;
|
|
|
this.lastChanged = undefined;
|
|
|
this.initialState = this.classList.contains(CLASS_ACTIVE);
|
|
|
}
|
|
|
}
|
|
|
if (this.isDragging) {
|
|
|
this.setTranslateX(detail.deltaX);
|
|
|
e.stopPropagation();
|
|
|
detail.gesture.preventDefault();
|
|
|
}
|
|
|
};
|
|
|
Toggle.prototype.swiperight = function(e) {
|
|
|
if (this.isDragging) {
|
|
|
e.stopPropagation();
|
|
|
}
|
|
|
};
|
|
|
Toggle.prototype.end = function(e) {
|
|
|
this.classList.remove(CLASS_DRAGGING);
|
|
|
if (this.isDragging) {
|
|
|
this.isDragging = false;
|
|
|
e.stopPropagation();
|
|
|
$.trigger(this.element, 'toggle', {
|
|
|
isActive: this.classList.contains(CLASS_ACTIVE)
|
|
|
});
|
|
|
} else {
|
|
|
this.toggle();
|
|
|
}
|
|
|
};
|
|
|
Toggle.prototype.toggle = function(animate) {
|
|
|
var classList = this.classList;
|
|
|
if (animate === false) {
|
|
|
this.handle.style.webkitTransitionDuration = this.element.style.webkitTransitionDuration = '0s';
|
|
|
} else {
|
|
|
this.handle.style.webkitTransitionDuration = this.element.style.webkitTransitionDuration = '.2s';
|
|
|
}
|
|
|
if (classList.contains(CLASS_ACTIVE)) {
|
|
|
classList.remove(CLASS_ACTIVE);
|
|
|
this.handle.style.webkitTransform = 'translate(0,0)';
|
|
|
} else {
|
|
|
classList.add(CLASS_ACTIVE);
|
|
|
this.handle.style.webkitTransform = 'translate(' + this.handleX + 'px,0)';
|
|
|
}
|
|
|
$.trigger(this.element, 'toggle', {
|
|
|
isActive: this.classList.contains(CLASS_ACTIVE)
|
|
|
});
|
|
|
};
|
|
|
Toggle.prototype.setTranslateX = $.animationFrame(function(x) {
|
|
|
if (!this.isDragging) {
|
|
|
return;
|
|
|
}
|
|
|
var isChanged = false;
|
|
|
if ((this.initialState && -x > (this.handleX / 2)) || (!this.initialState && x > (this.handleX / 2))) {
|
|
|
isChanged = true;
|
|
|
}
|
|
|
if (this.lastChanged !== isChanged) {
|
|
|
if (isChanged) {
|
|
|
this.handle.style.webkitTransform = 'translate(' + (this.initialState ? 0 : this.handleX) + 'px,0)';
|
|
|
this.classList[this.initialState ? 'remove' : 'add'](CLASS_ACTIVE);
|
|
|
} else {
|
|
|
this.handle.style.webkitTransform = 'translate(' + (this.initialState ? this.handleX : 0) + 'px,0)';
|
|
|
this.classList[this.initialState ? 'add' : 'remove'](CLASS_ACTIVE);
|
|
|
}
|
|
|
this.lastChanged = isChanged;
|
|
|
}
|
|
|
|
|
|
});
|
|
|
|
|
|
$.fn['switch'] = function(options) {
|
|
|
var switchApis = [];
|
|
|
this.each(function() {
|
|
|
var switchApi = null;
|
|
|
var id = this.getAttribute('data-switch');
|
|
|
if (!id) {
|
|
|
id = ++$.uuid;
|
|
|
$.data[id] = new Toggle(this);
|
|
|
this.setAttribute('data-switch', id);
|
|
|
} else {
|
|
|
switchApi = $.data[id];
|
|
|
}
|
|
|
switchApis.push(switchApi);
|
|
|
});
|
|
|
return switchApis.length > 1 ? switchApis : switchApis[0];
|
|
|
};
|
|
|
$.ready(function() {
|
|
|
$('.' + CLASS_SWITCH)['switch']();
|
|
|
});
|
|
|
})(mui, window, 'toggle'); |