0

在这里我有一个隐藏的输入字段

<input type="hidden" value="php,php mysql" id="tags"/>

我还有一个普通的输入框,用户可以添加他们的新标签,现在我想检查用户想要添加的新标签是否已经为他添加,如果已经添加,警报('已经存在') ;

这是我的代码:

var already_added = $('#tags_final').val().toLowerCase();
new_tag = new_tag.toLowerCase();
if (already_added.indexOf(new_tag) < 0){
// add it, everything is OK
}else{
alert('already there');
}

以上对于正常值来说工作得很好,例如现在如果我尝试添加“php”,这将发出警报(“已经存在”),问题是,如果我添加“mysql”,这也会发送警报,因为它在“php mysql”中找到,但“mysql”是另一个标签,需要添加。对此有什么解决方案?

感谢您的帮助

4

4 回答 4

5

我认为您希望将其分解为单独的部分,并对实际标签本身进行全文比较。

var tags = $('#tags_final').val().toLowerCase().split(',');
new_tag = new_tag.toLowerCase();

if ($.inArray(new_tag, tags) < 0) {
    // add it
} else {
    alert('already there');
}

var tags = $('#tags_final').val().toLowerCase().split(',');
new_tag = new_tag.toLowerCase();

if (tags.indexOf(new_tag) < 0) {
    // add it
} else {
    alert('already there');
}

编辑:感谢@nybbler,使用他评论中链接的jquery inArray 方法会更准确。

于 2012-11-14T19:43:33.570 回答
1

我认为indexOf直接在字符串上使用比使用正则表达式或拆分为数组更快(依赖于时更是如此$.inArray)。

只需用逗号包裹你already_added的标签字符串,然后在搜索它时对标签执行相同的操作indexOf

var already_added = ',' + $('#tags_final').val().toLowerCase() + ',';
new_tag = new_tag.toLowerCase();

if (already_added.indexOf(',' + new_tag + ',') < 0) {
    // add it
} else {
    alert('already there');
}

我从jQuery 使用的类似技巧中得到了这个想法。

于 2012-11-14T19:41:34.023 回答
0

您可以使用这样的函数在逗号分隔的键字符串中查找键:

function contains(keys, key) {
  var i = 0, k = key.length;
  for (var i = 0;(i = keys.indexOf(key, i)) != -1; i += k) {
    if ((i == 0 || keys.charAt(i - 1) == ',') && (i + k == keys.length || keys.charAt(i + k) == ',')) {
      return true;
    }
  }
  return false;
}

演示:http: //jsfiddle.net/Guffa/UHH9V/

于 2012-11-14T19:57:41.583 回答
0

保存大括号[php][php mysql]之间的标签并搜索

var already_added = $('#tags_final').val().toLowerCase();
new_tag = new_tag.toLowerCase();
if (already_added.indexOf("["+new_tag+"]") < 0){
// add it, everything is OK
}else{
alert('already there');
}
于 2012-11-14T19:41:46.940 回答