HTML5范围的onChange事件

Wil*_*yor 67 html forms html5 onchange range

目前,我的范围输入上的onChange事件在每一步都触发.

有没有办法阻止此事件触发,直到用户放开滑块?

我正在使用该范围来创建搜索查询.我希望每次更改表单时都能运行搜索,但是在滑块移动的每一步发出搜索请求太多了.


这是代码:

HTML:

<div id="page">
    <p>Currently viewing page <span>1</span>.</p>
    <input class="slider" type="range" min="1" max="100" step="1" value="1" name="page" />
</div>
Run Code Online (Sandbox Code Playgroud)

JavaScript的:

$(".slider").change(function() {
    $("#query").text($("form").serialize());
});
Run Code Online (Sandbox Code Playgroud)

这有帮助吗?

kra*_*s88 65

用于最终选定值:

 $(".slider").on("change", function(){console.log(this.value)});
Run Code Online (Sandbox Code Playgroud)

用于获取滑动的增量值:

$(".slider").on("input", function(){console.log(this.value)});
Run Code Online (Sandbox Code Playgroud)

  • 这适用于Firefox和Chrome,但不适用于Safari.当您滑动时,Safari会触发更改事件.至少在他们开始实施基于修订标准的修复之前. (2认同)

Arw*_*wyn 14

有点迟了,但前几天我遇到了同样的问题.这是我使用jQuery绑定/触发器的解决方案:

(function(el, timeout) {
    var timer, trig=function() { el.trigger("changed"); };
    el.bind("change", function() {
        if(timer) {
            clearTimeout(timer);
        }
        timer = setTimeout(trig, timeout);
    });
})($(".slider"), 500);
Run Code Online (Sandbox Code Playgroud)

现在只需将您的函数绑定到"已更改"事件即可.

  • 这是一个很好的解决方法,但缺点是每次响应选择器".slider"的所有元素触发'更改',每次只有一个实际更改.我修改你的例子:`(function($ el,timeout){var timer; $ el.bind("change",function(){var $ me = $(this); if(timer){clearTimeout(timer); } timer = setTimeout(function(){$ me.trigger("changed");},timeout);});})($(.slider),500);` (2认同)

小智 9

呸!

使用onmouseup事件而不是onChange

  • 我考虑过这个问题但决定反对它有两个原因:处理未更改的滑块值(次要)是笨重的,我不能假设人们将使用鼠标来编辑表单(主要).我仍然没有对这个问题给出正确的答案,但我对于没有将任何答案标记为正确感到不好; 他们是正确的(因为,他们工作),但他们并没有真正回答这个问题. (4认同)
  • 您还需要添加事件:`onkeyup`(如果使用键盘)和`ontouchend`(如果使用触摸屏). (2认同)

RoT*_*oRa 6

一个问题是AFAIK HTML5没有定义onchange事件应该触发的时间,所以它很可能与浏览器不同.而且你还必须考虑,浏览器实际上不必渲染input type=range一个滑块.

您唯一的选择是必须建立一种机制来确保搜索不会过于频繁地触发,例如,检查搜索当前是否正在运行并且如果是,则中止搜索,或者确保搜索是在最多每x秒.

后者的快速示例(只是快速入侵,未经测试).

var doSearch = false;

function runSearch() {
   // execute your search here 
}

setInterval(function() {
  if (doSearch) {
     doSearch = false;
     runSearch();
  }
}, 2000); // 2000ms between each search.

yourRangeInputElement.onchange = function() { doSearch = true; }
Run Code Online (Sandbox Code Playgroud)


小智 5

纯JS在这里:

myInput.oninput = function(){
    console.log(this.value);
}
Run Code Online (Sandbox Code Playgroud)

要么

myInput.onchange = function(){
    console.log(this.value);
}
Run Code Online (Sandbox Code Playgroud)