【问题标题】:Show Socket.io Result in Select Box在选择框中显示 Socket.io 结果
【发布时间】:2017-12-21 02:48:31
【问题描述】:

我使用以下代码发出查询结果;

io.on('connection', function(socket) {
          socket.on('socketfabrika', function(fabrika) {
            console.log();
            console.log("**********************************");
            console.log("Selected Fabrika: " + fabrika);
            console.log("**********************************");
            console.log();

            connection.query("SELECT kumes FROM report WHERE fabrika = ? GROUP BY kumes DESC ", fabrika, function(err, rows) {
              if (err) console.log(err);
              else {
                for (var i = 0; i < rows.length; i++) {
                  var row = rows[i];
                  console.log("**********************************");
                  console.log("Possible kumes: " + row.kumes);
                  console.log("**********************************");

                  io.emit("sel_kumes", row.kumes);
                }
              }
            });
          });
        });

然后,在客户端,我尝试在选择框中显示查询结果,

<form id="form_kumes">
    <select  multiple>
      <option id="sel_kumes"></option>
    </select>
</form>

但是当我向选择框发出数据时,它总是在选择框中并排添加新值,

<script type="text/javascript">  
 socket.on('sel_kumes', function(rows) {
      console.log(rows);
 $('#sel_kumes').append($('<option></option>').text(rows));
});
</script>

因为这条线;

$('#sel_kumes').append($('<option></option>').text(rows));

如果我将脚本更改为;

<script type="text/javascript">  
 socket.on('sel_kumes', function(rows) {
      console.log(rows);
 $('#sel_kumes').text(rows);
});
</script>

然后,选择框只显示一个结果。

如何显示从服务器获得的所有结果(问题的第一部分),然后刷新选择框如果发出新值?(问题的第二部分)

【问题讨论】:

  • 你能显示console.log("Possible kumes: " + row.kumes);的输出吗
  • 输出是; Possible kumes: 2Possible kumes: 1。可能我只用这条线发出一次; io.emit("sel_kumes", row.kumes);
  • io.emit() 发出相同次数的循环运行。您希望输出如何显示在选择框上?
  • 我想在选择框上同时看到“1”和“2”,但现在只显示“1”。如果我使用append() 并且新数据出现,则添加到选择框的值并排为“1”和“2”,但是当另一个数据出现时,“1”和“2”仍然存在,并且新值添加到它们的一侧。我只想查看最后调用的数据,但不仅仅是其中一个,而是全部。

标签: javascript jquery html node.js socket.io


【解决方案1】:

io.emit 被调用的次数与循环运行的次数相同,因此发送和接收没有问题。

您做错的事情是每次都将文本附加到同一个选项。因此并排显示所有文本。

要在客户端显示多个选项,也应该有多个选项。你所做的恰恰相反。

把html改成:

<form id="form_kumes">
   <select  multiple id="sel_kumes">
   </select>
</form>

现在创建与收到响应的次数相同的选项数。

socket.on('sel_kumes', function(rows) {
      console.log(rows);
      var sel = document.getElementById('sel_kumes');
      var opt = document.createElement('option');
      opt.id = //give whatever id you have to give to options but make sure 
               //every options should have unique id
      opt.innerHTML = rows;

      //now append to sel div
      sel.appendChild(opt);

});

您可以根据需要使用 jquery 语法代替 javascript。

编辑:回答您的第二个问题

有很多方法可以做到这一点,其中一种是不要删除旧的选择 DOM,而是创建一个新的选择 DOM 并从头开始创建选项。同样为了防止重复发送值,您可以使用数组发出一次。

在服务器端:

var array = [];
for (var i = 0; i < rows.length; i++) {
    var row = rows[i];
    console.log("**********************************");
    console.log("Possible kumes: " + row.kumes);
    console.log("**********************************");

    array.push(row.kumes);          
 }
 io.emit("sel_kumes", array);

在客户端:

socket.on('sel_kumes', function(array) {
      console.log(rows);
      var formm = document.getElementById('form_kumes');

      $("#sel_kumes").remove(); //removing element select

      var sel = document.createElement('select');
      sel.id = "sel_kumes";

      for(var i=0;i<array.length;i++){
          var opt = document.createElement('option');
          opt.innerHTML = array[i];

          //now append to sel div
          sel.appendChild(opt);
      }

      //finally append to parent form
      formm.appendChild(sel);
});

【讨论】:

  • 非常感谢您抽出宝贵时间。此行有错字; var opt = document.createElement('options'); 我将 ('options') 更改为 ('option') 并且它起作用了。但是还是有问题。现在,每次我发出时,选择框都会显示“1”和“2”,但在发出新数据时仍然是旧数据。如何覆盖数据以选择框?
  • @erayaras 如果您提出新问题或提出其他问题,您应该始终编辑您的问题。但仍然检查编辑,它会工作。
  • 再次感谢您,它有效。顺便说一句,multiple 标签存在于&lt;select multiple id="sel_kumes"&gt;&lt;/select&gt; 行,但选择框转到下拉菜单。我通过在sel.id = "sel_kumes"; 之后添加sel.multiple="multiple"; sel.size="3"; 解决了这个问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2017-12-27
相关资源
最近更新 更多