0

問題は、入力ボックスにコメントを書き込んだ後にEnterキーを押すと、メッセージがDBに送信され、Ajax呼び出しによって取得されることです。

入力フィールドのフォーカスを外してからもう一度フォーカスを合わせ、新しいメッセージの入力を開始してEnterキーを押すと、メッセージが2回送信され、もう一度行うと、メッセージが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ハンドラーが同じコンテナーにアタッチされます。おそらく、新しいハンドラーを1回ずつ起動してから、再接続するまで二度と起動しないようにしたいですか?最もクリーンなソリューションとは見なされないかもしれませんが、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

タイムアウトを 500 ではなく 0 に設定してみてください。これにより、リストの一番下に移動しますが、より多くの入力キーをキャッシュする時間がありません。

于 2013-02-02T19:57:11.650 に答える