如何避免重复标记?

时间:2016-09-04 01:10:07

标签: javascript jquery html css

我有一个系统简单的标签框,问题是如果我添加相同的单词,

示例:

php和php,

标签与同一个词重复。

代码完成。

$(function(){ // DOM ready

  // ::: TAGS BOX

  $("#tags input").on({
    focusout : function() {
      var txt = this.value.replace(/[^a-z0-9\+\-\.\#]/ig,''); // allowed characters
      if(txt) $("<span/>", {text:txt.toLowerCase(), insertBefore:this});
      this.value = "";
    },
    keyup : function(ev) {
      // if: comma|enter (delimit more keyCodes with | pipe)
      if(/(188|13)/.test(ev.which)) $(this).focusout(); 
    }
  });
  $('#tags').on('click', 'span', function() {
    $(this).remove(); 
  });

});
#tags{
  float:left;
  border:1px solid #ccc;
  padding:5px;
  font-family:Arial;
}
#tags > span{
  cursor:pointer;
  display:block;
  float:left;
  color:#fff;
  background:#789;
  padding:5px;
  padding-right:25px;
  margin:4px;
}
#tags > span:hover{
  opacity:0.7;
}
#tags > span:after{
 position:absolute;
 content:"×";
 border:1px solid;
 padding:2px 5px;
 margin-left:3px;
 font-size:11px;
}
#tags > input{
  background:#eee;
  border:0;
  margin:4px;
  padding:7px;
  width:auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="tags">
  <input type="text" value="" placeholder="Add a tag" />
</div>

唯一的问题是标签的重复(标签),添加一个相同的单词。

3 个答案:

答案 0 :(得分:1)

请试一试。只是在添加之前检查是否存在相同的标记。如果你想在else子句中,也可以添加错误消息。

$(function(){ // DOM ready

  // ::: TAGS BOX

  $("#tags input").on({
    focusout : function() {
      var txt = this.value.replace(/[^a-z0-9\+\-\.\#]/ig,''); // allowed characters
      if(txt && !$("#tags span:contains("+ txt.toLowerCase() +")").length) {
        
        $("<span/>", {text:txt.toLowerCase(), insertBefore:this});
        this.value = "";
      }
    },
    keyup : function(ev) {
      // if: comma|enter (delimit more keyCodes with | pipe)
      if(/(188|13)/.test(ev.which)) $(this).focusout(); 
    }
  });
  $('#tags').on('click', 'span', function() {
    $(this).remove(); 
  });

});
#tags{
  float:left;
  border:1px solid #ccc;
  padding:5px;
  font-family:Arial;
}
#tags > span{
  cursor:pointer;
  display:block;
  float:left;
  color:#fff;
  background:#789;
  padding:5px;
  padding-right:25px;
  margin:4px;
}
#tags > span:hover{
  opacity:0.7;
}
#tags > span:after{
 position:absolute;
 content:"×";
 border:1px solid;
 padding:2px 5px;
 margin-left:3px;
 font-size:11px;
}
#tags > input{
  background:#eee;
  border:0;
  margin:4px;
  padding:7px;
  width:auto;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<div id="tags">
  <input type="text" value="" placeholder="Add a tag" />
</div>

答案 1 :(得分:0)

您可以在创建新标记元素之前维护一个标记值数组。如果用户尝试输入重复标记,则会显示一条消息,如果用户删除标记或成功添加新标记,则会删除该消息:

dataLst.sort(key=lambda l: (datetime.strptime(l[2], '%m/%d/%Y'), -l[1]))
$(function() { // DOM ready

  // ::: TAGS BOX

  var tags = [];

  $("#tags input").on({
    focusout: function() {
      var txt = this.value.replace(/[^a-z0-9\+\-\.\#]/ig, ''); // allowed characters
      if (txt) {
        // Check if array contains value before creating span
        if ((tags.indexOf(txt) === -1)) {
          $('#message').hide();
          $("<span/>", {
            text: txt.toLowerCase(),
            insertBefore: this
          });
        } else {
          $('#message').show();
        }
      }
      tags.push(txt);
      this.value = "";
    },
    keyup: function(ev) {
      // if: comma|enter (delimit more keyCodes with | pipe)
      if (/(188|13)/.test(ev.which)) $(this).focusout();
    }
  });
  $('#tags').on('click', 'span', function() {
    var text = $(this).text();
    // Filter tag array on tag removal
    tags = tags.filter(function(e) {
      return e !== text;
    });
    $('#message').hide();
    $(this).remove();
  });
});
#tags {
  float: left;
  border: 1px solid #ccc;
  padding: 5px;
  font-family: Arial;
}
#tags > span {
  cursor: pointer;
  display: block;
  float: left;
  color: #fff;
  background: #789;
  padding: 5px;
  padding-right: 25px;
  margin: 4px;
}
#tags > span:hover {
  opacity: 0.7;
}
#tags > span:after {
  position: absolute;
  content: "×";
  border: 1px solid;
  padding: 2px 5px;
  margin-left: 3px;
  font-size: 11px;
}
#tags > input {
  background: #eee;
  border: 0;
  margin: 4px;
  padding: 7px;
  width: auto;
}

答案 2 :(得分:0)

问题

$("#tags input").on({
    focusout: function () {
        //append text(sugsession :Not use append process.Use html() like replace existing content method.)
    },
    keyup: function (ev) {
            ....$(this).focusout();
    }
});

似乎焦点是火两次.keyup也称为焦点输出事件。它是附加方法。

Suggesion

追加vs html

使用html方法。你必须定义一个额外的div来保存动态内容。它不会连续。它不会依赖于方法调用的方法编号。

$("#newDiv").html(txt.toLowerCase());

使用上面而不是下面的声音     if(txt)$(&#34;&#34;,{         text:txt.toLowerCase(),         insertBefore:this     });

reference 1
reference 2