J'ai une solution qui implique (Vanilla) JavaScript, mais seulement en tant que bibliothèque. Vous devez l'inclure une fois, puis tout ce que vous avez à faire est de définir les paramètres appropriés de la bibliothèque. source
de l'attribut des entrées numériques.
El source
doit être l'attribut querySelectorAll
de l'entrée de gamme que vous souhaitez écouter.
Il fonctionne même avec les selectcs. Et ça marche avec des écouteurs multiples. Et cela fonctionne dans l'autre sens : modifiez l'entrée du nombre et l'entrée de la plage s'adaptera. Et elle fonctionne sur les éléments ajoutés ultérieurement dans la page (voir https://codepen.io/HerrSerker/pen/JzaVQg pour cela)
Testé dans Chrome, Firefox, Edge et IE11
;(function(){
function emit(target, name) {
var event
if (document.createEvent) {
event = document.createEvent("HTMLEvents");
event.initEvent(name, true, true);
} else {
event = document.createEventObject();
event.eventType = name;
}
event.eventName = name;
if (document.createEvent) {
target.dispatchEvent(event);
} else {
target.fireEvent("on" + event.eventType, event);
}
}
var outputsSelector = "input[type=number][source],select[source]";
function onChange(e) {
var outputs = document.querySelectorAll(outputsSelector)
for (var index = 0; index < outputs.length; index++) {
var item = outputs[index]
var source = document.querySelector(item.getAttribute('source'));
if (source) {
if (item === e.target) {
source.value = item.value
emit(source, 'input')
emit(source, 'change')
}
if (source === e.target) {
item.value = source.value
}
}
}
}
document.addEventListener('change', onChange)
document.addEventListener('input', onChange)
}());
<div id="div">
<input name="example" type="range" max="2250000" min="-200000" value="0" step="50000">
<input id="example-value" type="number" max="2250000" min="-200000" value="0" step="50000" source="[name=example]">
<br>
<input name="example2" type="range" max="2240000" min="-160000" value="0" step="50000">
<input type="number" max="2240000" min="-160000" value="0" step="50000" source="[name=example2]">
<input type="number" max="2240000" min="-160000" value="0" step="50000" source="[name=example2]">
<br>
<input name="example3" type="range" max="20" min="0" value="10" step="1">
<select source="[name=example3]">
<option value="0">0</option>
<option value="1">1</option>
<option value="2">2</option>
<option value="3">3</option>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
<option value="8">8</option>
<option value="9">9</option>
<option value="10">10</option>
<option value="11">11</option>
<option value="12">12</option>
<option value="13">13</option>
<option value="14">14</option>
<option value="15">15</option>
<option value="16">16</option>
<option value="17">17</option>
<option value="18">18</option>
<option value="19">19</option>
<option value="20">20</option>
</select>
<br>
</div>
<br>
2 votes
Vous ne pouvez pas faire cela sans javascript.
3 votes
Vous pouvez casi faire cela avec css en utilisant
:before
/:after
,content
yattr()
comme este . Cependant, les pseudo-éléments :before/:after occupent une partie de la plage du curseur (mais cela peut être corrigé) et, surtout, les valeurs ne sont pas mises à jour si le curseur est manipulé. Néanmoins, j'ai pensé qu'il serait intéressant de laisser ceci ici. Cela pourrait devenir possible à l'avenir.3 votes
En corrigeant la solution de @waldir, on obtient les résultats suivants jsfiddle.net/RjWJ8 bien qu'il utilise toujours le javascript pour mettre à jour l'attribut valeur de la propriété.