0

问题是当我在输入框中写下评论后按回车键时,消息被发送到数据库中,然后通过 Ajax 调用检索。

一切都很顺利,当我不聚焦输入字段然后再次聚焦并开始输入新消息并按 Enter 时,消息会发送两次,如果我再次这样做,则消息会发送 3 次,依此类推。代码有什么问题?我该如何解决这个问题?

$(".type_comment").click(function(){
        container = $(this);

        if ($(this).val() == "Type a comment.")
        {
                    $(this).val("");
                    $(this).css({ 'font-size':'13px','opacity':'1' });          
        }
        nr_crt = container.attr("nr_crt");
        container.keyup(function(e)
            {
                code = (e.keyCode ? e.keyCode : e.which);
                if (code == 13)
                    {
                            var chatmsg = container.val();
                            var comment_id = $("#main-photo"+nr_crt).attr("commentid");
                            var name = <?php echo json_encode($_SESSION['username']); ?>;
                            $.post('../utility/postcomment.php', { comment: chatmsg, name: name, comment_id: comment_id } , 
                                function(output) {
                                });
                            code = null;
                            chatmsg = "";
                            container.val("");
                            var time = setTimeout(function(){
                            $.post('../utility/fetchcomments.php', { comment_id : comment_id , name : name} , 
                                function(results) {
                                    $(".comment_append"+nr_crt).append(results);
                                });
                            clearTimeout(time);
                            },500);
                    }
            });


    });
4

2 回答 2

1
$(".type_comment").click(function(){
    ...
    container.keyup(function(e){

每次单击它时,都会将一个新的 keyUp 处理程序附加到同一个容器。也许您希望每个新的处理程序都触发一次,然后在重新连接之前不再触发?虽然它可能不是最干净的解决方案,但jQuery 完全支持

$(".type_comment").click(function(){
    ...
    container.one('keyup', function(e){

但是,根据您的描述,这很可能是您想要的:

$(".type_comment").each(function(){
    var container = $(this);
    var nr_crt = container.attr("nr_crt");
    ...
    container.click(...);
    container.keyup(...);
}
于 2013-02-02T20:16:22.340 回答
0

尝试将超时设置为 0 而不是 500。这会将其移动到列表的底部,但不会给时间缓存更多输入键。

于 2013-02-02T19:57:11.650 回答