Подтвердить что ты не робот

Обработчик событий слайдера диапазона Javascript

Я пытаюсь заставить слайдер диапазона работать, но я не могу. Как добавить обработчик событий, когда пользователь выбирает значение, которое мой код считывает это значение. Сейчас его значение всегда 1.

Я хотел бы сделать это, используя чистый Javascript.

HTML:

<div id="slider">
    <input class="bar" type="range" id="rangeinput" min="1" max="25" value="1" onchange="rangevalue.value=value"/>
    <span class="highlight"></span>
    <output id="rangevalue">1</output>
</div>

JAVASCRIPT:

var rangeInput = document.getElementById("rangeinput").value;
var buttonInput = document.getElementById("btn");

if (buttonInput.addEventListener) {
    buttonInput.addEventListener("click", testtest, false);
}
else if (buttonInput.attachEvent) {
    buttonInput.attachEvent('onclick', testtest);
}

function testtest(e) {
    if (rangeInput > 0 && rangeInput < 5) {
        alert("First");
    } else {
        alert("Second");
    }
}

JSFIDDLE

4b9b3361

Ответ 1

Single Read

Проблема в том, что вы только читаете значение один раз (при запуске), а не читаете его каждый раз, когда происходит событие:

// this stores the value at startup (which is why you're always getting 1)
var rangeInput = document.getElementById("rangeinput").value;

Вместо этого вы должны прочитать значение в обработчике:

function testtest(e) {
    // read the value from the slider:
    var value = document.getElementById("rangeinput").value;
    // now compare:
    if (value > 0 && value < 5) {
        alert("First");
    } else {
        alert("Second");
    }
}

Или переписать код:

var rangeInput = document.getElementById("rangeinput");
var buttonInput = document.getElementById("btn");

if (buttonInput.addEventListener) {
    buttonInput.addEventListener("click", testtest, false);
}
else if (buttonInput.attachEvent) {
    buttonInput.attachEvent('onclick', testtest);
}

function testtest(e) {
    var value = rangeInput.value;
    if (value > 0 && value < 5) {
        alert("First");
    } else {
        alert("Second");
    }
}

Обновление диапазона значений

Также похоже, что вы хотите обновить выходной элемент со значением диапазона. То, что вы сейчас делаете, относится к элементу по id:

onchange="rangevalue.value=value"

Однако, насколько я знаю, это не стандартное поведение; вы не можете ссылаться на элементы только по их идентификатору; вам необходимо извлечь элемент, а затем установить значение через DOM.

Могу ли я предложить добавить слушателя изменений через javascript:

rangeInput.addEventListener("change", function() {
    document.getElementById("rangevalue").textContent = rangeInput.value;
}, false);

Конечно, вам нужно будет обновить код для использования addEventListener или attachEvent в зависимости от браузеров, которые вы хотите поддерживать; здесь JQuery действительно становится полезным.

Ответ 2

Используйте для этого событие mouseup.

var rangeInput = document.getElementById("rangeinput");

rangeInput.addEventListener('mouseup', function() {
    if (this.value > 0 && this.value < 5) {
        alert("First");
    } else{
        alert("Second");
    }
});

DEMO: http://jsfiddle.net/ZnYjY/1

Ответ 3

Вы также можете использовать метод FORMs oninput:

<form oninput="result.value=parseInt(a.value)+parseInt(b.value)">
  <input type="range" name="b" value="50" />100 +
  <input type="number" name="a" value="10" /> =
  <output name="result"></output>
</form>

У этого есть преимущество перед onclick/onmouseup, потому что он обрабатывает случай, когда ползунок перемещается с помощью клавиатуры (вкладка на вход и использование клавиш со стрелками)

Ответ 4

<script type="text/javascript">
    function range()
    {
//the simplest way i found
    var p = document.getElementById('weight');
    var res = document.getElementById('rangeval');
    res.innerHTML=p.value+ " Lbs";
    }
</script>

  <label for="weight">Your weight in lbs:</label>
  <input name="weight" type="range" id="weight" max="500" min="0" value="75" onChange="range()" onKeyUp="range()">
  <span id="rangeval"></span>