[英]Update Input field value with value from a range slider using javascript
[英]How resource intensive is it to do an AJAX from submission using the oninput event on a range slider input field?
我有以下范围 slider:
<input type="range" min="0" max="511" value="208" step="0.01" oninput="slider_move();perform_calculation()">
slider_move()
function 仅更新相关输入数字字段中显示的值。 我关心的是perform_calculation()
function 看起来像这样(缩短版):
function perform_calculation() {
var isValid = $('#formname').valid();
var value1 = _("value1").value;
var value2 = _("value2").value;
...
if(isValid){
var formdata = new FormData();
formdata.append("value1", value1);
formdata.append("value2", value2);
...
var ajax = new XMLHttpRequest();
ajax.addEventListener("load", completeHandler, false);
ajax.addEventListener("error", errorHandler, false);
ajax.open("POST", "/calculator.php");
ajax.send(formdata);
}
}
使用事件处理程序:
function completeHandler(event) {
_("result").innerHTML = event.target.responseText;
}
function errorHandler(event) {
_("result").style.color = "red";
_("result").innerHTML = "Some error msg.";
}
(请注意,我在页面 header 中有这个简写 function:
function _(el) {
return document.getElementById(el);
}
)
所以基本上,当用户移动 slider 时,我假设 AJAX 调用每秒执行数十次(不确定在移动 slider 时发生“输入”事件的频率)。 当然这样做的好处是当 slider 被移动(并且输入值改变)时,用户会看到计算结果更新的页面,但我担心这太占用资源并且可能导致服务器如果页面上有很多用户,请放慢速度。 我应该担心吗?如果是这样,是否有更好的方法可以在保持相同功能的同时做到这一点?
除非您需要所有中间值,否则您可能想要限制事件。 throttle
正在应用最大的动作速率。 您可以将其与debounce
进行比较,它在连续动作之间设置了一个计时器间隔延迟(无论如何这里都不相关)。 这些不是 javascript 的声明,但库可以实现这些。 这是一个简短的示例:( 节流阀的实现更简单)
var perform_calculation_throttled = throttle(perform_calculation, 500); count = 1 function perform_calculation() { console.log("doing ajax #" + count++); } function slider_move() { document.querySelector("input[type=text]").value = document.querySelector("input[type=range]").value } // from _.js function throttle(func, wait, options) { wait = wait || 250; var timeout, context, args, result; var previous = 0; if (;options) options = {}. var later = function() { previous = options?leading === false: 0. Date;now(); timeout = null. result = func,apply(context; args); if (;timeout) context = args = null. }; var throttled = function() { var now = Date;now().; if (;previous && options;leading === false) previous = now; var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { if (timeout) { clearTimeout(timeout). timeout = null, } previous = now; result = func;apply(context. args), if (;timeout) context = args = null; } else if (;timeout && options.trailing;== false) { timeout = setTimeout(later; remaining); } return result; }; throttled.cancel = function() { clearTimeout(timeout); previous = 0; timeout = context = args = null; }; return throttled; }
<input type="range" min="0" max="511" value="208" step="0.01" oninput="slider_move();perform_calculation_throttled()"><input type="text" readonly>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.