19

I'm trying to get a range slider to work but I can't. How do I add an event handler so when the user chooses a value my code reads that value. Right now its value is always 1.

I would like to do this using pure 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

4

5 回答 5

16

Single Read

The problem is that you're only reading the value once (at startup), instead of reading it every time the event occurs:

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

You should be reading the value in the handler instead:

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");
    }
}

Or to rewrite your code:

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");
    }
}

Updating rangevalue

It also looks like you want to update the output element with the value of the range. What you're currently doing is referring to the element by id:

onchange="rangevalue.value=value"

However, as far as I know, this isn't standard behavior; you can't refer to elements by their id alone; you have to retrieve the element and then set the value via the DOM.

Might I suggest that you add a change listener via javascript:

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

Of course, you'll have to update the code to use addEventListener or attachEvent depending on the browsers that you want to support; this is where JQuery really becomes helpful.

于 2013-10-28T00:59:19.583 回答
6

使用该mouseup事件。

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

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

演示:http: //jsfiddle.net/ZnYjY/1

于 2013-10-28T00:18:59.927 回答
2

您还可以使用 FORMsoninput方法:

<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因为它可以处理使用键盘移动滑块的情况(标签到输入并使用箭头键)

于 2013-10-28T00:38:19.780 回答
2

使用oninput事件。

HTML 代码:

<div id="slider">
    <input class="bar" type="range" id="range-input" min="1" max="25" value="1"/>
    <span class="highlight"></span>
    <output id="range-value">1</output>
</div>
<button id="btn" type="submit">Submit</button>

Javascript 脚本

(function() {
 var rangeInput = document.getElementById("range-input")
 var rangeValue = document.getElementById("range-value")
 var button = document.getElementById("btn")
 
 // Show alert message when button clicked
 button.onclick = testTest
 
 function testTest() {
   let value = rangeInput.value
   if(value > 0 && value < 5) {
      alert("first")
      return true
   }
     alert("second")
     return false
 }
 
 // Print the range value to the output
 rangeInput.oninput = rangeOutput
 
 function rangeOutput() {
   rangeValue.innerText = rangeInput.value
 }

})()

演示

2021 年更新

另一种选择是使用输入事件处理程序,即 eventTarget.addEventListener("input", alert("Hello World"),虽然这个事件处理程序与 oninput 相同,但不同之处在于我们可以使用 addEventListener

于 2020-11-03T14:43:45.617 回答
0
<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>
于 2014-03-24T17:09:43.560 回答