2011-12-19 32 views
1

我正在研究一个应用程序,您可以单击用户名将其添加到回复列表中。 如果用户名已被添加,则不会再次添加用户名。 我遇到的问题是,如果添加了用户@assassin,并且我尝试添加用户@ass,它会发现@ ass-assin,并认为@ass已被添加。 这里是我的代码:jQuery检查字符串是否包含文字

$('#mentions a.mention_user').live('click', function(e){if($('textarea#message').val().toLowerCase().search('@'+$(this).text().toLowerCase()) < 0){ 
     $('textarea#message').val('@'+$(this).text()+' '+$('textarea#message').val()); 
    } 
    e.preventDefault(); 
}); 

在此先感谢!

编辑:它会针对被匹配的用户名文本将类似于此:@user @joe @adam这是一个消息@someone

+0

你需要做一个“全字”或“全名”搜索,所以你不符合任何部分匹配。由于我们不知道您搜索的数据是什么样子,因此推荐最佳方式很难。 – jfriend00 2011-12-19 02:29:27

+0

@ jfriend00完成。 – skimberk1 2011-12-19 02:43:37

+0

你不需要将答案复制到你的问题中:一旦你接受了答案,它总是立即出现在问题后面。 – nnnnnn 2011-12-19 03:03:51

回答

1

假设空格字符是用户名是非法的。 将textarea消息字符串拆分成由空格分隔的数组,并根据提出的用户名检查每个数组元素。

$('#mentions a.mention_user').live('click', function(e) { 
    if ($.inArray('@'+$(this).text(),$('textarea#message').val().split(' '))) { 
     $('textarea#message').val('@'+$(this).text()+' '+$('textarea#message').val()); 
    } 
    e.preventDefault(); 
}); 
+0

太棒了,效果很好。尽管你做了2个小错误。正确的版本添加到问题。 – skimberk1 2011-12-19 02:53:16

+0

酷 - 我编辑我的答案以显示正确的版本。 – 2011-12-19 02:55:49

0

比较被添加到长度的项目长度该项目匹配。如果长度相同,则添加的项目已经存在。

+0

长度总是相同的,因为我只会测量匹配项目的长度。 希望是有道理的。 – skimberk1 2011-12-19 02:26:44

0

位硬不完整的代码来测试,但通过正则表达式搜索,并确保它有一个字符不包括AZ,az,0-9(以及任何其他有效的用户名字符)后,可能会做的招。

喜欢的东西:

$('#mentions a.mention_user').live('click', function(e){if(($('textarea#message').val().toLowerCase() + ' ').search(
    new RegExp("'@'+$(this).text().toLowerCase() + '[^A-Za-z0-9\-_]') 
) < 0){ 
     $('textarea#message').val('@'+$(this).text()+' '+$('textarea#message').val()); 
    } 
    e.preventDefault(); 
}); 
+0

感谢您的回答,我会对其进行测试。 – skimberk1 2011-12-19 02:29:33

+1

另一种更容易的方式是使用分隔符进行搜索 - 例如搜索“@assassin”或“@assassin”或“@assassin;”。显然,只有当你有一个一致的分​​隔符时才有效,并且在搜索之前将一个附加到源字符串。 – SpoonNZ 2011-12-19 02:29:38

+0

我想过,但如果它是最后一个用户名,并且之后没有任何内容,则不起作用。 – skimberk1 2011-12-19 02:38:26

0

假设分离始终是一个空格字符,你可以这样做:

$('#mentions a.mention_user').live('click', function(e){ 
    var taMsg = $('#message'), 
     userName = '@'+$(this).text()+' '; 
    if((taMsg.val().toLowerCase() + ' ').indexOf(userName) != -1) { 
     taMsg.val(userName + taMsg.val()); 
    } 
    e.preventDefault(); 
}); 

的想法是,如果你添加一个空格,以用户名的列表的末尾,那么你可以搜索它对于特定用户名后面有一个空格。

我还更新了代码缓存jQuery对象的消息文本区域,而不是重复了三遍。请注意,如果您选择的是像'#message'这样的ID,那么(因为该ID是唯一的),您不需要'textarea'前缀。

此外,因为你实际上没有使用正则表达式我已经切换到.indexOf()而不是.search()

相关问题