Javascript 如何防止重复

Javascript 如何防止重复,javascript,jquery,html,Javascript,Jquery,Html,我试图弄清楚如何让它循环通过UL中的数据(每个li),并防止它复制任何先前存在的选择 <script type="text/javascript" language="javascript"> // Long version function HandlerCharacters() { var characterid = $('#charactersdrop option:selected').val(); var characterName = $('#charactersdr

我试图弄清楚如何让它循环通过UL中的数据(每个
li
),并防止它复制任何先前存在的选择

<script type="text/javascript" language="javascript">
// Long version
function HandlerCharacters() {
 var characterid = $('#charactersdrop option:selected').val();
 var characterName = $('#charactersdrop option:selected').text();

 if( characterid > 0 ) {
  // Create the anchor element
  var anchor = $( '<a href="#">Remove</a>' );  

  // Create a click handler for the anchor element
  anchor.click( function() {
   $( this ).parent().remove();
   return false;  // makes the href in the anchor tag ignored
  } );

  // Create the <li> element with its text, and then append the anchor inside it.
  var li = $( '<li>' + characterName + '&nbsp;</li>' ).append( anchor );
  li.data( 'characterid', characterid );

  // Append the new <li> element to the <ul> element
  $( '#characterlist' ).append( li );
 }
}
</script>

//长版本
函数HandlerCharacters(){
var characterid=$('#charactersdrop选项:选定').val();
变量characterName=$('#charactersdrop选项:选定')。text();
如果(字符ID>0){
//创建锚元素
var-anchor=$('');
//为锚元素创建单击处理程序
锚定。单击(函数(){
$(this.parent().remove();
return false;//使锚标记中的href被忽略
} );
//创建带有文本的
  • 元素,然后在其中附加锚点。 var li=$('
  • '+characterName+'
  • ')。追加(锚定); li.数据('characterid',characterid); //将新的
  • 元素附加到
      元素 $(“#字符列表”).append(li); } }
  • 据我所知,只有当新的
    字符
    不在列表中另一个
    li
    的数据中时,您才尝试插入新的
    li
    。如果是这样,那么您可以编写如下函数:

    function isDupe(which) {
      var result = false;
      $('ul#the_list li').each( function(i,e) { // look at all list elements
        if ( $(e).data('characterid') == which ) { // compare to argument
          result = true; // matched!
          return false; // break out of .each()
        }
      });
      return result;
    }
    
    if( !isDupe(characterid) ){
      // do your checks
      // make your li
      // append to your list
    }
    
    然后您可以像这样包装
    li
    创建代码:

    function isDupe(which) {
      var result = false;
      $('ul#the_list li').each( function(i,e) { // look at all list elements
        if ( $(e).data('characterid') == which ) { // compare to argument
          result = true; // matched!
          return false; // break out of .each()
        }
      });
      return result;
    }
    
    if( !isDupe(characterid) ){
      // do your checks
      // make your li
      // append to your list
    }
    

    这里有一个简化的例子:

    这很好。有问题吗?为什么要创建同一个jQuery对象两次?我没有其他方法可以添加到现有函数中,让它循环执行检查?正如我在回答的底部所提到的,只需定义上面的函数(如果愿意,可以在函数中定义它),然后在条件语句中包装您的LI创建片段的内脏。例如,您可以简单地将
    if(characterid>0)
    更改为'if(characterid>0&&!isDupe(characterid))`。我不知道你的页面和代码的其余部分是什么样子的,但我的意思是(可能是不工作的,只是修改你的代码):这样我就可以学习和理解其中的一部分。“e”和“i”值代表什么?函数有两个参数:索引
    和元素
    。我只是简单地用“I,e”。对于通过
    each()
    的每次迭代,
    e
    是当前元素(因此,在本例中,
  • s中的一个),而
    i
    是循环中当前行程的索引(从零开始)。这是有意义的。谢谢你花点时间给我解释一下。我一直在研究如何将li.data的最终结果作为参数传递给数据字符串进行表单处理,但我找不到任何有助于我的方法。然而,另一件让我困扰的事情是,当我这样做时,我需要指出li数据中的第一个值,因为我将在我的流程数据库文件中对该值进行特殊处理,因此我不确定是否在某一点上指出该值,或者我是否可以将其保留到流程页面。