Значення діапазону введення типу HTML5 показує значення діапазону


114

Я роблю веб-сайт, на якому хочу використовувати слайдер діапазону (я знаю, що він підтримує лише веб-браузери).

Я повністю її інтегрував і працює чудово. Але я хотів би використовувати a, textboxщоб показати поточне значення слайда.

Я маю на увазі, якщо спочатку слайдер має значення 5, тож у текстовому полі він повинен відображатись як 5, коли я ковзаю значення у текстовому полі, слід змінювати.

Чи можу це зробити, використовуючи лише CSSабо html. Я хочу уникати JQuery. Це можливо?


1
Ви не можете зробити це без JavaScript.
mrtsherman

3
Ви майже можете це зробити за допомогою css, використовуючи :before/ :after, contentі attr(), як це . Однак: перед /: після того, як псевдоелементи фактично з’їдають частину діапазону слайдера (хоча, можливо, це можна виправити), і найголовніше, що значення маніпулятором повзунком не оновлюються. Тим не менш, я думав, що було б цікаво залишити це тут. Це може стати можливим у майбутньому.
waldyrious

3
Виправлення рішення @waldir призводить до jsfiddle.net/RjWJ8, хоча він все ще використовує JavaScript для оновлення атрибуту значення з властивості.
користувач1277170

Відповіді:


110

Для цього використовується JavaScript, а не jquery безпосередньо. Це може допомогти розпочати роботу.

function updateTextInput(val) {
          document.getElementById('textInput').value=val; 
        }
<input type="range" name="rangeInput" min="0" max="100" onchange="updateTextInput(this.value);">
<input type="text" id="textInput" value="">


5
але чи можна це зробити без javascript або jquery?
Niraj Chauhan

15
Це з mobile-web-app.blogspot.com/2012/03/… , все ще JavaScript. code<label for = "rangeinput"> Діапазон </label> <input id = "rangeinput" type = "range" min = "0" max = "10" value = "5" onchange = "rangevalue.value = value"> </input> <output id = "rangevalue"> 5 </output>
ejlepoud

46
Хтось ще думає, що забезпечення сліпого слайдера бракує. Правда, що надання фантазійних віджетів не є роллю базового стандарту, але показ вибраного значення є основним для цього віджета, тому я думаю, що (необов'язково) показ числа в базовій формі, наприклад, підказка на вершині ручки повзунка, зробити для кращого дизайну.
Базель Шишані

1
@BaselShishani Не міг погодитись більше, не дуже впевнений, що за цим процесом мислив.
Ноз

2
@BaselShishani: За даними MDN : "діапазон: контроль для введення числа, точне значення якого не важливо." Зважаючи на це припущення, показувати точну цінність має сенс. Але на практиці він, ймовірно, також буде використовуватися для вибору точних значень.
bodo

166

Для тих, хто все ще шукає рішення без окремого коду javascript. Немає простого рішення без написання функції javascript або jquery:

<form name="registrationForm">
   <input type="range" name="ageInputName" id="ageInputId" value="24" min="1" max="100" oninput="ageOutputId.value = ageInputId.value">
   <output name="ageOutputName" id="ageOutputId">24</output>
</form>

Демонстрація JsFiddle

Якщо ви хочете показати значення у текстовому полі, просто змініть вихідний на вхідний.


Оновлення:

Це все ще Javascript, написаний у вашому html, ви можете замінити прив’язки на код нижче JS:

 document.registrationForm.ageInputId.oninput = function(){
    document.registrationForm.ageOutputId.value = document.registrationForm.ageInputId.value;
 }

Або використовувати Id або ім'я елемента, обидва підтримуються в браузерах morden.


1
+1 знаю, я знаю про <вихід>. Єдина проблема полягає в тому, що EI не підтримує цього. (W3School) w3schools.com/tags/tryit.asp?filename=tryhtml5_output
radbyx

4
Це все ще JavaScript, і гірше пов’язувати вхід на елемент форми, ніж на сам елемент введення.
cuixiping

2
@cuixiping, ми можемо прив’язати oninput до елемента замість форми, я просто зробив це, щоб показати приклад.
Рахул Р.

Пробачте це питання запізнення та нобі, але як обробник посилається на rangeInput та суму за їхніми іменами HTML?
rep_movsd

@rep_movsd, це те саме, що this.formName.rangeInput або this.formName.amount. Форма доступу до елементів, використовуючи їх ім'я. Однак я не впевнений на 100%,
Рахул Р.

39

версія з редагованим введенням:

<form>
    <input type="range" name="amountRange" min="0" max="20" value="0" oninput="this.form.amountInput.value=this.value" />
    <input type="number" name="amountInput" min="0" max="20" value="0" oninput="this.form.amountRange.value=this.value" />
</form>

http://jsfiddle.net/Xjxe6/


6
Замініть змінні форми на this.nextElementSiblingабо this.previousElementSiblingзамініть oninput на onchange, щоб отримати версію, яка працює поза формою. jsfiddle.net/Xjxe6/94
Доміно

32

ще кращим способом було б зафіксувати подію введення на самому вході, а не на всій формі (ефективність):

<input type="range" id="rangeInput" name="rangeInput" min="0" max="20" value="0"
       oninput="amount.value=rangeInput.value">                                                       

<output id="amount" name="amount" for="rangeInput">0</output>

Ось загадка (із idдодаванням відповідно до коментаря Райана).


3
У Firefox 27 це не спрацювало для мене, поки я теж не додав id="amount"вихід.
Райан

це повинно працювати без id:oninput="this.form.amount.value=this.value"
d1Mm

1
це працює, але як я можу отримати поточне значення та показати його, коли сторінка оновлюється? : - /
user2513846

14

Якщо ви хочете, щоб ваше поточне значення відображалося під повзунком і рухалося разом із ним, спробуйте:

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8">
  <title>MySliderValue</title>

</head>
<body>
  <h1>MySliderValue</h1>

  <div style="position:relative; margin:auto; width:90%">
    <span style="position:absolute; color:red; border:1px solid blue; min-width:100px;">
    <span id="myValue"></span>
    </span>
    <input type="range" id="myRange" max="1000" min="0" style="width:80%"> 
  </div>

  <script type="text/javascript" charset="utf-8">
var myRange = document.querySelector('#myRange');
var myValue = document.querySelector('#myValue');
var myUnits = 'myUnits';
var off = myRange.offsetWidth / (parseInt(myRange.max) - parseInt(myRange.min));
var px =  ((myRange.valueAsNumber - parseInt(myRange.min)) * off) - (myValue.offsetParent.offsetWidth / 2);

  myValue.parentElement.style.left = px + 'px';
  myValue.parentElement.style.top = myRange.offsetHeight + 'px';
  myValue.innerHTML = myRange.value + ' ' + myUnits;

  myRange.oninput =function(){
    let px = ((myRange.valueAsNumber - parseInt(myRange.min)) * off) - (myValue.offsetWidth / 2);
    myValue.innerHTML = myRange.value + ' ' + myUnits;
    myValue.parentElement.style.left = px + 'px';
  };
  </script>

</body>
</html>

Зверніть увагу, що цей тип елемента введення HTML має одну приховану функцію, наприклад, ви можете переміщувати повзунок клавішами зі стрілками вліво / вправо / вниз / вгору, коли елемент фокусується на ньому. Те саме з клавішами Home / End / PageDown / PageUp.


6

Якщо ви використовуєте кілька слайдів , і ви можете використовувати jQuery, ви можете виконати наступне, щоб легко обробляти кілька слайдів :

function updateRangeInput(elem) {
  $(elem).next().val($(elem).val());
}
input { padding: 8px; border: 1px solid #ddd; color: #555; display: block; }
input[type=text] { width: 100px; }
input[type=range] { width: 400px; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="range" min="0" max="100" oninput="updateRangeInput(this)" value="0">
<input type="text" value="0">

<input type="range" min="0" max="100" oninput="updateRangeInput(this)" value="50">
<input type="text" value="50">

Також, використовуючи oninputдані, <input type='range'>ви отримуватимете події під час перетягування діапазону.



2

Для людей, які не цікавляться використанням jquery, ось короткий шлях без використання ідентифікатора

<label> userAvatar :
  <input type="range" name="userAvatar" min="1" max="100" value="1"
         onchange="$('~ output', this).val(value)" 
         oninput="$('~ output', this).val(value)">
  <output>1</output>
</label>

1

У мене є рішення, яке передбачає (Vanilla) JavaScript, але лише як бібліотека. Ви можете включити його один раз, і тоді все, що вам потрібно зробити, це встановити відповідний sourceатрибут кількості входів.

sourceАтрибут повинен бути querySelectorAllселектором вхідного діапазону ви хочете слухати.

Він навіть працює з селекторами. І це працює з кількома слухачами. І це працює в іншому напрямку: змінити введення числа і ввести діапазон буде скориговано. І він буде працювати над елементами, доданими пізніше на сторінку (перевірте https://codepen.io/HerrSerker/pen/JzaVQg для цього)

Тестували в Chrome, Firefox, Edge та 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>


0

<form name="registrationForm">
    <input type="range" name="ageInputName" id="ageInputId" value="24" min="1" max="10" onchange="getvalor(this.value);" oninput="ageOutputId.value = ageInputId.value">
    <input type="text" name="ageOutputName" id="ageOutputId"></input>
</form>


1
Помилка: {"message": "Uncaught ReferenceError: getvalor не визначено", " name file ": " stacksnippets.net/js ", "lineno": 12, "colno": 169}
Darush

0

Спробуйте це :

 <input min="0" max="100" id="when_change_range" type="range">
 <input type="text" id="text_for_show_range">

і в розділі jQuery :

 $('#when_change_range').change(function(){
 document.getElementById('text_for_show_range').value=$(this).val();
  });

-3

якщо ви все ще шукаєте відповідь, ви можете використовувати type type = "number" замість type = "range" min max max, якщо вона встановлена ​​в такому порядку:
1-ім'я
2-maxlength
3-розмір
4-хв.
5-max
просто скопіюйте його

<input  name="X" maxlength="3" size="2" min="1" max="100" type="number" />

1
Це просто неправильно, це не робить того, про що вимагав тематичний старт.
bolvo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.