【问题标题】:Stop duplicate values when appending from array to table in real time实时从数组追加到表时停止重复值
【发布时间】:2016-01-28 04:54:15
【问题描述】:

我目前正在通过一个循环来提取数组中的值,并且大部分都有效,但是当我添加第二个值时,它会将新值和以前的值复制到表中。

所以当我添加一个值为 488 的行时,它工作正常:

<tr class="exe">
   <td class="sipname">1446033619.75</td>
   <td class="siptd">SIP/488-00000027</td>
   <td><button class="btn btn-default unmute" id="mute" type="submit">Unmute</button></td>
   <td><button class="btn btn-default kick" id="kick" type="submit">Kick</button></td>
</tr>

当我添加另一个值然后说 487 然后按顺序复制同一行 488、488、487:

<tbody id="sip">
   <tr class="exe">
      <td class="sipname">1446033619.75</td>
      <td class="siptd">SIP/488-00000027</td>
      <td><button class="btn btn-default unmute" id="mute" type="submit">Unmute</button></td>
      <td><button class="btn btn-default kick" id="kick" type="submit">Kick</button></td>
   </tr>
   <tr class="exe">
      <td class="sipname">1446033619.75</td>
      <td class="siptd">SIP/488-00000027</td>
      <td><button class="btn btn-default mute" id="mute" type="submit">Mute</button></td>
      <td><button class="btn btn-default kick" id="kick" type="submit">Kick</button></td>
   </tr>
   <tr class="exe">
      <td class="sipname">1446033747.78</td>
      <td class="siptd">SIP/487-00000028</td>
      <td><button class="btn btn-default mute" id="mute" type="submit">Mute</button></td>
      <td><button class="btn btn-default kick" id="kick" type="submit">Kick</button></td>
   </tr>
</tbody>

我只需要 488,487 行没有重复的表格行,当我刷新页面时它工作正常。我正在使用 socket.io (Express)、node.js 和 Jquery。

我确实找到了一个使用 jquery remove 的小解决方法,但它会影响功能我的意思是一个小错误,所以我需要不使用 jquery remove。

socket.on('sipname', function (data, datad) {
    var sipname = '';
    var sipid = '';
    $('.exe').remove();
    for (var i = 0; i < data.length; i++) {
        sipname = data[i];
        sipid = datad[i];
        if (sipname) {
            $sip.append('<tr class="exe">\
                                         <td class="sipname">' + sipid + '</td>\
                                         <td class="siptd">' + sipname + '</td>\
                                         <td><button class="btn btn-default mute" id="mute" type="submit">Mute</button></td>\
                                         <td><button class="btn btn-default kick" id="kick" type="submit">Kick</button></td>\
                                         </tr>');
        }
    }
});

任何想法或指导将不胜感激,这会阻止我完成我的第一个版本的应用程序。

【问题讨论】:

  • 只是一个简单的提示:页面上的 id 必须是唯一的! id="exe"
  • 哦,天哪,我的糟糕是一直在摆弄生病改变它。
  • 可以添加插入行的部分吗?

标签: javascript jquery node.js express


【解决方案1】:

第一个:一遍又一遍的ID必须是唯一的

第二个:你可以试试这段代码。我把 Ids 改成了 Class 所以一定要在你的 css 样式表中改变它。并在 siptd 类中使用 data-sipname

socket.on('sipname', function (data, datad) {
    var sipname = '';
    var sipid = '';
    $('.exe').remove();
    for (var i = 0; i < data.length; i++) {
        sipname = data[i];
        sipid = datad[i];
        if (sipname) {
            if($('#sip > tr > .siptd[data-sipname = "'+sipname+'"]').length < 1){
            $sip.append('<tr class="exe">\
                   <td class="sipname">' + sipid + '</td>\
                   <td class="siptd" data-sipname="'+ sipname  +'">' + sipname + '</td>\
                    <td><button class="btn btn-default mute" type="submit">Mute</button></td>\
                    <td><button class="btn btn-default kick" type="submit">Kick</button></td>\
                                         </tr>');
         }   
      }
    }
});

希望对你有帮助

【讨论】:

  • 嘿,谢谢,我试过了,它根本停止向表格附加任何东西.....不知道为什么,我可以确切地看到这是要做什么。
  • @Studento919 你在控制台遇到了什么错误?
  • @MohamedYousef 根本没有报错,没有数据被追加到表中
  • @Studento919 对不起我的错.. 将 +sipneame+ 更改为 +sipname+
  • 现在工作正常,但它设法打破了实时工作的踢球功能,哈哈,当你回答原始问题时,我标记了你的答案
【解决方案2】:

看起来$sipsocket.on 函数之外的“全局”值。它在第一次.on() 调用中填充值,然后在第二次.on() 调用中再次添加任何值。

修复的方法可能是以下之一:

  1. 仅将数据发送到任何.on() 函数。这样,当您追加时,您就没有任何重复项。

  2. 如果每次进入.on()函数的数据都是完整的,你可以每次调用都清空$sip数组。 $sip = [] 然后每次都添加新鲜的东西。

  3. 更复杂的选项是检查数组的每个元素以查看它是否存在。如果没有,添加它,否则跳过它。使用散列也可以使这更容易,将 ID 存储为键,将 HTML 字符串存储为值。然后检查是否存在很快,!!$sip[ sipname ](对象$sip 中的属性sipname 评估为真)。

【讨论】:

  • 我对 socket.io 很陌生,所以我不知道从哪里开始选项 1,如果你能给我一个例子来说明如何实现它会有所帮助。至于选项 2 $sip 不是一个数组,它只包含一个 id 名称,选项 3 是相当复杂的 id,目前更喜欢让它尽可能简单:P
  • 哦,对不起,我以为代码在 server/nodejs 端。这些选项仍然适用于客户端。对于#1,您将让服务器只发送新数据。这样,当您追加时,您永远不会有重复的行。对于#2,如果服务器每次都发送所有数据,只需重置$sip 元素。使它成为一个新的空表,然后将所有内容都附加到新的,这样就不会重复了。选项 #3 仍然存在,无论如何使用 jQuery 查询这些 html 标签更容易,但仍然有点昂贵和复杂。先看看 #1 或 #2 是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 2016-01-09
  • 2016-10-18
  • 2018-05-12
  • 2017-11-06
  • 2015-05-26
相关资源
最近更新 更多