I try to achieve a functionality, that input-Elements with the type range
allways parse their value to a span element which is located after the range.
Console does not output any issues, is it possible, that i can't define the type of the input in the
HTML
<div class="rowitem rowinput w100">
<label for="person">Units</label>
<input type="range" id="units" name="units" min="1" max="30" value="1" step="1" />
<div class="range_sel_cont">
<span class="range_sel">1</span>
Units
<div>
</div>
JS (Vanilla)
let ranges = document.getElementsByTagName('input[type=range]');
for (var i = 0 ; i < ranges.length; i ) {
ranges.addEventListener ("change", function () {
let show = this.closest('.range_sel');
show.innerHTML = this.value;
});
};
CodePudding user response:
Few things:
You should be adding the event listener to the item in
ranges
at indexi
, notranges
itself (which is an HTMLCollection)closest()
gets the closest parent element that matches the selector. The element you are trying to select inside the event listener is the child of a sibling. You can select it by getting the input'snextElementSibling
.There is no element with the tag
input[type=range]
. If you want to get all elements that match that selector, usequerySelectorAll
let ranges = document.querySelectorAll('input[type=range]');
for (var i = 0; i < ranges.length; i ) {
ranges[i].addEventListener("change", function() {
let show = this.nextElementSibling.querySelector('.range_sel');
show.innerHTML = this.value;
});
};
<div class="rowitem rowinput w100">
<label for="person">Units</label>
<input type="range" id="units" name="units" min="1" max="30" value="1" step="1" />
<div class="range_sel_cont">
<span class="range_sel">1</span> Units
<div>
</div>
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" frameborder="0"></iframe>