2012-01-09 43 views
0

我想通過範圍輸入字段(jQuery)和socket.io的幫助來創建音量控制。帶有socket.io的音量滑塊控制 - 太多的數據

我正在使用此代碼來設置所有偵聽設備上的音量。

socket.on("setVolume", function (data) { 
    $("#range").val(data); 
}); 

$("#range").change(function() { 
    socket.emit("setVolume", $("#range").val()); 
}); 

當我現在拖動範圍輸入字段一段時間後,我注意到要做的事情隊列似乎堆積起來。實現響應式界面並實現最高可能更新率的最佳策略是什麼?

我試着這樣做:

var timer; 
$("#range").change(function() { 
    window.clearTimeout(timer); 
    timer = window.setTimeout(function() { 
    socket.emit("setVolume", $("#range").val()); 
    },10); 
}); 

但是,這使得它感覺非常緩慢。

處理大量這樣的數據的最佳方式是什麼?

回答

1

您的第二次嘗試並不壞,但它會重置以前每次都設置的超時時間 - 這意味着如果更改速度非常快,您將不會得到更新,直到最後。那麼像這樣的東西呢?

$(function() { 
    var timer; 
    var disabled = false; 
    $("#slider").slider({ 
     slide: function() { 
      if(disabled) { return; } 
      timer = setTimeout(function() { 
       disabled = false; 
       $("#volume").html($("#volume").html() + "!"); 
      }, 100); 
      disabled = true; 
     } 
    }); 
}); 

我有一個example up on JSFiddle

1

我建議在更改完成時發出setVolume事件(如youtube)。例如,當您擁有音量滑塊時,您可以點擊它,按住它並更改音量。每當你移動鼠標change事件被激發在jQuery堆積價值,如你所說。所以你應該在mouseUp或類似的東西上做(jQuery UI在slider中爲此提供了一些事件)。我想你應該已經明白了。

離開這個樣子顯然會殺了你的應用程序。

但最重要的是,我認爲你應該嘗試在客戶端做到這一點,並忘記排放任何東西。除非有一個原因,你實際上不能。