javascript - 使用 jQuery slider 通过串行发送数据

标签 javascript jquery html css user-interface

这是我关于堆栈溢出的第一个问题,所以我想向大家问好。我今天的问题如下...

我正在尝试使用 jQuery UI slider 通过 TCP/IP 将值发送到 Arduino 的串行端口。

我已经完成了通信部分(TCP 和串行)。问题在于,每当用户移动 slider 时,沿途的每个值都会非常快速地一个接一个地发送。我想延迟 slider ,以便它在每个步骤之间延迟 100 毫秒发送这些值。

我尝试使用“setInterval”和“clearInterval”但没有成功。这是代码:

$(document).ready(function() {

    $( "#mySlider" ).slider({
        range: "min",
        min: 0,
        max: 180,
        value: 90,
        slide: function( event, ui ) {

        delayPan(ui.value);


        }   
});

$( "#total" ).val( $( "#mySlider" ).slider( "value" ) );

});



var timeOut;

function delayPan(vals) {

    $( "#total" ).val("$" +  vals );

    //the part below sends values to another PHP file in order to then send it using TCP/IP

    timeOut = setInterval(function()
    {

        $.get("insert_commands.php", {command: 39, parameter: 0, value: vals, number: 0}, 
        function(command,parameter,value,number){}, "json");

    }, 100);

    clearInterval(timeOut); 

}

为了更清楚起见,这里是我的 index.php 网站上 slider 的 HTML:

<label for="total">ANGLE:</label>
<input type="text" id="total" style="border:0; color:#fa4b2a; font-weight:bold;">
</p>
<div id="mySlider"></div>

我不知道如何解决这个问题 - 我对 javascript/jQuery 还很陌生。我可以延迟 Arduino 或 TCP 套接字上的接收,但主网站上还有其他按钮设置了不同的延迟,因此如果可能的话,我需要在 jQuery 中执行此操作。

如果有任何建议,我将不胜感激。

谢谢 罗布

最佳答案

恭喜你提出了一个写得好的问题。

我想你正在看的是 Debounced or Throttled函数(取决于您想要发送新值的次数)。在您的情况下,您想要“限制”该函数 - 这意味着限制调用它的频率。

因此我们可以每 100 毫秒限制一次位置发送功能。这样,即使 slider 位置在 100 毫秒内改变 25 次,AJAX 请求也只会在这 100 毫秒内发送一次。

Lodash 和 Underscore 都为您提供了对函数进行去抖动和限制的可能性。本阿尔曼也offers a tiny library (不再维护)用于去抖/节流。我只能代表本·阿尔曼的图书馆,因为那是我唯一使用过的图书馆。

I've created a Codepen to demonstrate. Click to see it in action. 相关代码如下:

$(document).ready(function() {

  function delayPan(vals) {

    $( "#total" ).val("$" +  vals );

    //the part below sends values to another PHP file in order to then send it using TCP/IP
    $.get("insert_commands.php", {command: 39, parameter: 0, value: vals, number: 0}, function(command,parameter,value,number){}, "json");
 }

    const throttledDelayPan = $.throttle(1000, delayPan);

    $( "#mySlider" ).slider({
        range: "min",
        min: 0,
        max: 180,
        value: 90,
        slide: function( event, ui ) {
            throttledDelayPan(ui.value);
         }   
    });

  $( "#total" ).val( $( "#mySlider" ).slider( "value" ) );

});

基本上,您声明一个发送 AJAX 请求的函数。在您的示例中,delayPan。

然后将其传递到 Throttle 库的节流函数 ($.throttle) 中,以及节流时间(在本例中为 1000 毫秒,用于演示延迟)。

throttle 函数返回另一个函数,我们将其存储在throttledDelayPan 中。

最后我们在 jQuery UI Slider 的“slide”回调中调用throttledDelayPan。

顺便说一句,我有一些建议:

  1. 如果您特别想将数据发送到 REST API,我会劝阻您不要使用 GET 请求 - 使用 POST 请求会更惯用。
  2. 您可能希望将其分为两个函数 - 发送 AJAX 请求的节流函数和更新“#total”显示的函数。这样,您就可以不断更新显示,同时仍然减少发送的 AJAX 请求数量。

关于javascript - 使用 jQuery slider 通过串行发送数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60308116/

相关文章:

javascript - Meteorjs Template.foo() 不起作用

javascript - 如何在 ReactJs 中追加到表中

jquery - 在 jQuery 中使用 OO 概念,使用 function() 并创建结构数组

html - 表格单元格使用的宽度比它需要的要多得多

javascript - 让两个模型显示在页面上

javascript - 每次更新 Prop 时都专注于最后一项

javascript - Bootstrap-select 插件 : how to avoid flickering

jquery - 如何将 "options"对齐到 kendo 下拉列表的 "select"?

html - Bootstrap 导航栏宽度大于视口(viewport)

javascript - 如何使用 Bootstrap 和 jQuery 显示包含 Facebook 图像等文本的 onclick 图像弹出窗口?