diff --git a/src/components/slider/Slider.vue b/src/components/slider/Slider.vue index a15b327be..344b7d0b7 100755 --- a/src/components/slider/Slider.vue +++ b/src/components/slider/Slider.vue @@ -1,12 +1,12 @@ @@ -53,7 +53,7 @@ export default { barWidth: null, barHeight: null, dragListener: null, - mouseupListener: null, + dragEndListener: null, beforeUnmount() { this.unbindDragListeners(); }, @@ -65,36 +65,29 @@ export default { this.barWidth = this.$el.offsetWidth; this.barHeight = this.$el.offsetHeight; }, - setValueFromHandlePosition(event, handlePosition) { - let newValue = (this.max - this.min) * (handlePosition / 100) + this.min; + setValue(event) { + let handleValue; + let pageX = event.touches ? event.touches[0].pageX : event.pageX; + let pageY = event.touches ? event.touches[0].pageY : event.pageY; - if (this.range) { - if (this.step) - this.handleStepChange(event, newValue, this.modelValue[this.handleIndex]); - else - this.updateModel(event, newValue); + if(this.orientation === 'horizontal') + handleValue = ((pageX - this.initX) * 100) / (this.barWidth); + else + handleValue = (((this.initY + this.barHeight) - pageY) * 100) / (this.barHeight); + + + let newValue = (this.max - this.min) * (handleValue / 100) + this.min; + + if (this.step) { + const oldValue = this.range ? this.value[this.handleIndex] : this.value; + const diff = (newValue - oldValue); + if (diff < 0) + newValue = oldValue + Math.ceil(newValue / this.step - oldValue / this.step) * this.step; + else if (diff > 0) + newValue = oldValue + Math.floor(newValue / this.step - oldValue / this.step) * this.step; } - else { - if (this.step) - this.handleStepChange(event, newValue, this.modelValue); - else - this.updateModel(event, newValue); - } - }, - onSlide(event) { - let handlePosition = this.horizontal ? ((event.pageX - this.initX) * 100) / (this.barWidth) : (((this.initY + this.barHeight) - event.pageY) * 100) / (this.barHeight); - this.setValueFromHandlePosition(event, handlePosition); - }, - handleStepChange(event, newValue, oldValue) { - let diff = (newValue - oldValue); - let val = oldValue; - if (diff < 0) - val = oldValue + Math.ceil(newValue / this.step - oldValue / this.step) * this.step; - else if (diff > 0) - val = oldValue + Math.floor(newValue / this.step - oldValue / this.step) * this.step; - - this.updateModel(event, val); + this.updateModel(event, newValue); }, updateModel(event, value) { let newValue = value; @@ -129,17 +122,7 @@ export default { this.$emit('update:modelValue', modelValue); this.$emit('change', modelValue); }, - onBarClick(event) { - if (this.disabled) { - return; - } - - if (!DomHandler.hasClass(event.target, 'p-slider-handle')) { - this.updateDomData(); - this.onSlide(event); - } - }, - onHandleMouseDown(event, index) { + onDragStart(event, index) { if (this.disabled) { return; } @@ -149,10 +132,37 @@ export default { this.dragging = true; this.updateDomData(); this.handleIndex = index; - this.bindDragListeners(); event.preventDefault(); }, - onHandleKeyDown(event, index) { + onDrag(event) { + if (this.dragging) { + this.setValue(event); + event.preventDefault(); + } + }, + onDragEnd(event) { + if (this.dragging) { + this.dragging = false; + + DomHandler.removeClass(this.$el, 'p-slider-sliding'); + this.$emit('slideend', {originalEvent: event, value: this.value}); + } + }, + onBarClick(event) { + if (this.disabled) { + return; + } + + if (!DomHandler.hasClass(event.target, 'p-slider-handle')) { + this.updateDomData(); + this.setValue(event); + } + }, + onMouseDown(event, index) { + this.bindDragListeners(); + this.onDragStart(event, index); + }, + onKeyDown(event, index) { this.handleIndex = index; switch (event.which) { @@ -234,23 +244,13 @@ export default { }, bindDragListeners() { if (!this.dragListener) { - this.dragListener = (event) => { - if (this.dragging) { - this.onSlide(event); - } - }; + this.dragListener = this.onDrag.bind(this); document.addEventListener('mousemove', this.dragListener); } if (!this.mouseupListener) { - this.mouseupListener = (event) => { - if (this.dragging) { - this.dragging = false; - DomHandler.removeClass(this.$el, 'p-slider-sliding'); - this.$emit('slideend', {originalEvent: event, values: this.modelValue}); - } - }; + this.dragEndListener = this.onDragEnd.bind(this); document.addEventListener('mouseup', this.mouseupListener); } @@ -261,9 +261,9 @@ export default { this.dragListener = null; } - if (this.mouseupListener) { - document.removeEventListener('mouseup', this.mouseupListener); - this.mouseupListener = null; + if (this.dragEndListener) { + document.removeEventListener('mouseup', this.dragEndListener); + this.dragEndListener = null; } } },