HTML5范围的onChange事件

时间:2011-03-02 09:30:25

标签: html html5 forms range onchange

目前,我的范围输入上的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>

JavaScript的:

$(".slider").change(function() {
    $("#query").text($("form").serialize());
});

这有帮助吗?

12 个答案:

答案 0 :(得分:64)

用于最终选定值:

 $(".slider").on("change", function(){console.log(this.value)});

用于将增量值作为滑动:

$(".slider").on("input", function(){console.log(this.value)});

答案 1 :(得分:14)

有点迟了,但前几天我遇到了同样的问题。这是我使用jQuery bind / trigger的解决方案:

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

现在只需将您的函数绑定到'已更改'事件。

答案 2 :(得分:9)

呸!

使用onmouseup事件而不是onChange

答案 3 :(得分: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; }

答案 4 :(得分:5)

纯JS在这里:

myInput.oninput = function(){
    console.log(this.value);
}

myInput.onchange = function(){
    console.log(this.value);
}

答案 5 :(得分:2)

gravediggin但是如果你需要它,请检查js 节流 debounce 功能

用法:

//resize events gets processed 500ms after the last Event
addEventListener("resize", _debounce(function(){ foo;}, 500));

//resize events get processed every 500ms
addEventListener("resize", _throttle(function(){ foo;}, 500));

代码:

/*waits 'delay' time after the last event to fire */
_debounce = function(fn, delay) {
    var timer = null;
    return function() {
        var context = this,
            args = arguments;
        clearTimeout(timer);
        timer = setTimeout(function() {
            fn.apply(context, args);
        }, delay);
    };
};


/* triggers every 'treshhold' ms, */
_throttle = function(fn, threshhold, scope) {
    threshhold = threshhold || 250;
    var last,
        deferTimer;
    return function() {
        var context = scope || this;

        var now = +new Date(),
            args = arguments;
        if (last && now < last + threshhold) {
            // hold on to it
            clearTimeout(deferTimer);
            deferTimer = setTimeout(function() {
                last = now;
                fn.apply(context, args);
            }, threshhold);
        } else {
            last = now;
            fn.apply(context, args);
        }
    };
};

答案 6 :(得分:1)

以下是我用于捕获html5范围滑块的“更改事件”的内容:

<强> HTML:

<form oninput="output1.value=slider1.value">
    <input type="range" name="slider1" value="50"/>
    <output name="output1" for="slider1">50</output>
</form>

<强> JavaScript的:

var $slider = $('input[name="slider1"]');

$slider.bind('change', function(e) {
    e.preventDefault();
    console.log($(this).val());
});

如果要在单击(甚至拖动)时返回其值,也可以将“click”事件绑定到范围滑块。把它想象成'mouseup'事件。 (我确实试过了,但是在点击滑块后滑块没有停止。)

<强> JavaScript的:

$slider.bind('click', function(e) {
    e.preventDefault();
    console.log($this).val());
}

在旁注中,这会返回一个字符串,因此请确保在适当时使用'parseInt($(this).value())'。

希望这有帮助。

答案 7 :(得分:1)

我使用以下设置在同一页面中使用多个HTML5默认滑块:

  • 使用oninput事件
  • 移动滑块时,页面中的输出标记会更改值
  • 在发布时触发一次change事件

使用最新的Chrome进行测试,并在带有Node和Socket.io的Raspberry上进行良好编译。

<output id="APIDConKpVal"></output>&nbsp; <input type="range"
             class="PIDControlSlider"
             min="0"
             max="1500"
             step="1"
             id="APIDConKp"
             oninput="APIDConKpVal.value=value"/>

<output id="APIDConKiVal"></output>&nbsp; <input type="range"
             class="PIDControlSlider"
             min="0"
             max="2000"
             step="1"
             id="APIDConKi"
             oninput="APIDConKiVal.value=value"/>

一个简单的Javascript代码创建了侦听器。您可能需要尝试不同的活动,而不是“改变”#39;在最后一行,看看哪些适合你。

window.onload=function()
{
 var classname = document.getElementsByClassName("PIDControlSlider");

    var myFunction = function() {
        var attribute = this.getAttribute("id");
//Your code goes here
        socket.emit('SCMD', this.getAttribute("id")+' '+ this.value);
    };

    for(var i=0;i<classname.length;i++){
        classname[i].addEventListener('change', myFunction, false);
    }
}

答案 8 :(得分:0)

另一个建议:

$(".slider").change(function(){    
  if (this.sliderTimeour) clearTimeout(this.sliderTimeour);
  this.sliderTimeour = setTimeout(function(){
    //your code here
  },delayTimeHere);
});

答案 9 :(得分:0)

您可以尝试使用blur事件。当然它也有它的局限性但它只是另一个建议:)

您还可以尝试合并bluronkeyuponmouseup事件,以尝试捕捉不同情况:blur当用户使用键盘箭头进行选择时当用户使用键盘进行选择并且专注于滑块时,点击<Tab>onkeyup,当他使用鼠标时,点击onmouseup。甚至可能只合并onkeyuponmouseup

如果值已经改变,您仍然需要进行简单的检查,并且只有在发生更改后才运行必要的代码。

答案 10 :(得分:0)

onchange运行得很好,但我需要在滑动时更新值。

var interval;
$("#rangeinput").mousedown(function(event){
    interval = setInterval(function(){
        $("#output").html($("#rangeinput").val());
        console.log("running");
    },150);
});

$("#rangeinput").mouseup(function(event){
    clearInterval(interval);
});

http://jsbin.com/vibuc/1/

答案 11 :(得分:0)

让我们为集合添加一个简单的ES6替代方法:

let timer;

const debounceChange = (value, callback) => {
    clearTimeout(timer);
    timer = setTimeout(() => callback(value), 500);
};

在JSX中使用时,它看起来像这样:

<input type="range" onChange={e => debounceChange(e.target.value, props.onChange)}/>