1- function OmRangeSlider ( inputSelector ) {
1+ const OmRangeSliderInputValueStyles = {
2+ DEFAULT_COMMA_SEPARATED : 0 ,
3+ PHP_ARRAY : 1 ,
4+ ASP_ARRAY : 2
5+ }
6+
7+ function OmRangeSlider ( inputElement , inputValueStyle ) {
28 const that = this ;
39
4- let input = undefined ;
10+ let input = inputElement ;
11+ let inputValueEnd = undefined ;
512 let elementRange = undefined ;
613 let buttonStart = undefined ;
714 let buttonEnd = undefined ;
@@ -13,19 +20,30 @@ function OmRangeSlider(inputSelector) {
1320
1421 let debug = false ;
1522
16- this . settings = {
23+ let settings = {
1724 min : 0 ,
1825 max : 10 ,
19- unit : ''
26+ unit : '' ,
27+ inputValueStyle : inputValueStyle
2028 } ;
21- const settings = this . settings ;
2229
2330 this . setRange = function ( range ) {
2431 rangeValue = range ;
2532 displayValueStart . textContent = range [ 0 ] + settings . unit ;
2633 displayValueEnd . textContent = range [ 1 ] + settings . unit ;
2734 triggerRangeChangeEvent ( range ) ;
28- input . value = rangeValue . join ( ',' ) ;
35+
36+ switch ( settings . inputValueStyle ) {
37+ default :
38+ case OmRangeSliderInputValueStyles . DEFAULT_COMMA_SEPARATED :
39+ input . value = rangeValue . join ( ',' ) ;
40+ break ;
41+ case OmRangeSliderInputValueStyles . PHP_ARRAY :
42+ case OmRangeSliderInputValueStyles . ASP_ARRAY :
43+ input . value = rangeValue [ 0 ] ;
44+ inputValueEnd . value = rangeValue [ 1 ] ;
45+ break ;
46+ }
2947 return that ;
3048 } ;
3149
@@ -70,9 +88,7 @@ function OmRangeSlider(inputSelector) {
7088 } , { passive : false } ) ;
7189 }
7290
73- function initVisuals ( inputElement ) {
74-
75- input = inputElement ;
91+ function initVisuals ( ) {
7692
7793 const visualSliderContainer = document . createElement ( 'div' ) ;
7894 visualSliderContainer . className = input . className ;
@@ -138,27 +154,63 @@ function OmRangeSlider(inputSelector) {
138154
139155 const range = input . value ? input . value . split ( ',' ) . map ( x => + x . trim ( ) ) : undefined ;
140156
157+ switch ( settings . inputValueStyle ) {
158+ default :
159+ case OmRangeSliderInputValueStyles . DEFAULT_COMMA_SEPARATED :
160+ break ;
161+ case OmRangeSliderInputValueStyles . PHP_ARRAY :
162+ inputValueEnd = document . createElement ( 'input' ) ;
163+ inputValueEnd . hidden = true ;
164+ inputValueEnd . name = input . name + '[]' ;
165+ input . parentNode . insertBefore ( inputValueEnd , input . nextSibling ) ;
166+ input . name = input . name + '[]' ;
167+ break ;
168+ case OmRangeSliderInputValueStyles . ASP_ARRAY :
169+ inputValueEnd = document . createElement ( 'input' ) ;
170+ inputValueEnd . hidden = true ;
171+ inputValueEnd . name = input . name ;
172+ input . parentNode . insertBefore ( inputValueEnd , input . nextSibling ) ;
173+ break ;
174+ }
175+
141176 that . setRange ( [ range [ 0 ] ?? settings . min , range [ 1 ] ?? settings . max ] ) ;
142177 refreshButtonPositions ( ) ;
143178 refreshRangeIndicator ( ) ;
144179 }
145180
146181 function refreshButtonPositions ( ) {
182+ const elementRangeWidth = elementRange . getBoundingClientRect ( ) . width ;
183+ const buttonStartWidth = buttonStart . getBoundingClientRect ( ) . width ;
184+ const buttonEndWidth = buttonEnd . getBoundingClientRect ( ) . width ;
185+
147186 const range = settings . max - settings . min ;
148-
149- buttonStart . style . left = Math . round ( ( rangeValue [ 0 ] - settings . min ) * elementRange . clientWidth / range ) + 'px' ;
150- buttonEnd . style . left = Math . round ( ( ( rangeValue [ 1 ] - settings . min ) * elementRange . clientWidth / range ) - buttonEnd . clientWidth ) + 'px' ;
187+ const factor = ( elementRangeWidth - buttonStartWidth - buttonEndWidth ) / range ;
188+
189+ const valueStart = rangeValue [ 0 ] - settings . min ;
190+ const valueEnd = rangeValue [ 1 ] - settings . min ;
191+
192+ const buttonStartLeft = Math . floor ( valueStart * factor ) ;
193+ const buttonEndLeft = buttonStartWidth + Math . floor ( valueEnd * factor ) ;
194+
195+ buttonStart . style . left = buttonStartLeft + 'px' ;
196+ buttonEnd . style . left = buttonEndLeft + 'px' ;
151197 }
152198
153199 function refreshRangeIndicator ( ) {
154- rangeIndicator . style . left = parseInt ( buttonStart . style . left ) + ( buttonStart . getBoundingClientRect ( ) . width / 2 ) + 'px' ;
155- rangeIndicator . style . right = elementRange . getBoundingClientRect ( ) . width - parseInt ( buttonEnd . style . left ) - ( buttonEnd . getBoundingClientRect ( ) . width / 2 ) ;
200+ const elementRangeWidth = elementRange . getBoundingClientRect ( ) . width ;
201+ const buttonStartWidth = buttonStart . getBoundingClientRect ( ) . width ;
202+ const buttonEndWidth = buttonEnd . getBoundingClientRect ( ) . width ;
203+
204+ const buttonStartMiddle = Math . round ( parseInt ( buttonStart . style . left ) + ( buttonStartWidth / 2 ) ) ;
205+ const buttonEndMiddle = Math . round ( elementRangeWidth - ( parseInt ( buttonEnd . style . left ) + ( buttonEndWidth / 2 ) ) ) ;
206+ rangeIndicator . style . left = buttonStartMiddle + 'px' ;
207+ rangeIndicator . style . right = buttonEndMiddle + 'px' ;
156208 }
157209
158210 function triggerRangeChangeEvent ( range ) {
159- const event = new CustomEvent ( 'rangechange' , range ) ;
211+ const event = new CustomEvent ( 'rangechange' , { detail : rangeValue } ) ;
160212 input . value = this . range ? this . range . join ( ',' ) : '' ;
161- input . dispatchEvent ( event ) ;
213+ input . dispatchEvent ( event ) ;
162214 }
163215
164216 function updateValues ( ) {
@@ -236,8 +288,8 @@ function OmRangeSlider(inputSelector) {
236288
237289 if ( newX !== parseInt ( activeButton . style . left ) ) {
238290 activeButton . style . left = newX + 'px' ;
239- refreshRangeIndicator ( ) ;
240291 updateValues ( ) ;
292+ refreshRangeIndicator ( ) ;
241293 }
242294 }
243295 }
@@ -276,15 +328,22 @@ function OmRangeSlider(inputSelector) {
276328 }
277329
278330 this . initialize = function ( ) {
279- initVisuals ( inputSelector ) ;
331+ initVisuals ( ) ;
280332 initEventSubscriptions ( ) ;
281333 } ;
282334}
283335
284- OmRangeSlider . init = function ( selector = 'input[type=range][multiple]' ) {
285- const rangeSliders = document . querySelectorAll ( selector ) ;
336+ OmRangeSlider . init = function ( settings ) {
337+
338+ const defaultSettings = {
339+ selector : 'input[type=range][multiple]' ,
340+ inputValueStyle : OmRangeSliderInputValueStyles . DEFAULT_COMMA_SEPARATED
341+ } ;
342+ settings = settings ? Object . assign ( defaultSettings , settings ) : defaultSettings ;
343+
344+ const rangeSliders = document . querySelectorAll ( settings . selector ) ;
286345 for ( const rangeSlider of rangeSliders ) {
287- ( new OmRangeSlider ( rangeSlider ) )
346+ ( new OmRangeSlider ( rangeSlider , settings . inputValueStyle ) )
288347 . setDebug ( false )
289348 . initialize ( ) ;
290349 }
0 commit comments