W swoim projekcie zaprzągłem do pracy skrypt (rangeSlider).
Moim celem jest przerobienie oryginalnego skryptu w taki sposób, aby użytkownik mógł posługiwać się zarówno "suwakiem", jak i polem input, wprowadzając tym samym swoją wagę lub wzrost i aby te zmiany były "od razu widoczne".
Oryginalny kod ma co prawda takie rozwiązanie, ale nie jest dla mnie wystarczające (sekcja "Programmatic value changes" na stronie domowej rangeSlider'a) - tam trzeba kliknąć na przycisk, aby wartość na suwaku uległa zmianie, co powoduje w moim przypadku submit całego formularza z pytaniami w ankiecie.
Kod HTML5:
<div class="range"> <input id="chanceSlider1" name="answer_text[1]" type="range" min="25" max="250" step="0.1" value="50" data-rangeslider> <input id="chance1" name="chance1" type="text" value="50"> </div> <div class="range"> <input id="chanceSlider2" name="answer_text[2]" type="range" min="120" max="250" step="0.1" value="50" data-rangeslider> <input id="chance2" name="chance2" type="text" value="120"> </div>
Kod JS:
(function($) { var $document = $(document); var selector = '[data-rangeslider]'; var $element = $(selector); // For ie8 support var textContent = ('textContent' in document) ? 'textContent' : 'innerText'; function valueOutput(element) { var value = element.value; var output = element.parentNode.getElementsByTagName('output')[0] || element.parentNode.parentNode.getElementsByTagName('output')[0]; output[textContent] = value; } $document.on('input', 'input[name="answer_text"], ' + selector, function(e) { valueOutput(e.target); }); $('#chanceSlider1').on('input change', function(){ $('#chance1').val($('#chanceSlider1').val()); }); $('#chance1').on('keyup', function(){ $('#ch1 output').val($('#chance1').val()); }); $('#chanceSlider2').on('input change', function(){ $('#chance2').val($('#chanceSlider2').val()); }); $('#chance2').on('keyup', function(){ $('#ch2 output').val($('#chance2').val()); }); /* $document.on('click', '#js-example-change-value button', function(e) { var $inputRange = $(selector, e.target.parentNode); var value = $('input[name="answer_text"]', e.target.parentNode)[0].value $inputRange.val(value).change(); }); */ $element.rangeslider({ polyfill: false, onInit: function() { valueOutput(this.$element[0]); }, onSlide: function(position, value) { console.log('onSlide'); console.log('position: ' + position, 'value: ' + value); }, onSlideEnd: function(position, value) { console.log('onSlideEnd'); console.log('position: ' + position, 'value: ' + value); } }); })(jQuery);
Po przeróbkach skrypt reaguje na wpisane wartości do pola input, zmienia wartość w <output>, ale nie zmienia wartości suwaka (<input id="chanceSlider1">) - stoi w miejscu, jak zaklęty. Nie za bardzo wiem, w jaki sposób to poprawić. Zdaję sobie sprawę, że mój kod nie jest profesjonalny - nie czuję się omnibusem, jeśli chodzi o JS, więc wybaczcie.
Gdyby ktoś z Was poświęcił swój czas i poradził coś na te moje problemy ze sliderem, będę wdzięczny.
Pozdrawiam wszystkich czytających tego posta.