2013-02-02 4 views
0

입력 상자에 설명을 쓰고 Enter 키를 누르면 메시지가 DB로 전송 된 다음 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); 
        } 
      }); 


    }); 
+1

가 나쁜 그러나

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

, 당신의 설명에 따라, 가장 가능성이 당신이 원하는 무엇인가 아이디어, 그리고 당신은 정확하게 그것을하고 있습니다. –

+0

'.type_comment'를 누를 때마다 새로운 keyup 핸들러가 추가됩니다. 클릭 연결을 해제하거나 클릭 핸들러 외부에서 키 업 기능을 한 번만 설정해야합니다. – czarchaic

+0

글쎄 '.click'함수 외부에 'keyup'함수를 넣으려고했지만 컨테이너 변수가 인식되지 않습니다. – southpaw93

답변

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

클릭 할 때마다 동일한 containter에 새 keyUp 처리기가 연결됩니다. 아마도 각 새 처리기를 한 번 실행 한 다음 다시 연결하기 전까지는 다시 실행하지 않기를 원할 것입니다. 이 깨끗한 솔루션, jQuery supports exactly that 간주되지 않을 수 있지만 : 이벤트 처리기 내에서 이벤트 핸들러를 연결

$(".type_comment").each(function(){ 
    var container = $(this); 
    var nr_crt = container.attr("nr_crt"); 
    ... 
    container.click(...); 
    container.keyup(...); 
} 
+0

한 번만 표시하고 싶습니다 ... – southpaw93

0

시간 초과를 500 대신 0으로 설정하십시오. 그러면 목록 하단으로 이동하지만 더 많은 입력 키를 캐시 할 시간이 없습니다.

+0

바인드 해제를 사용할 수 있습니다. 작동하지 않습니다. 입력을 unfocused 한 횟수를 추적하는 것과 같습니다. – southpaw93

관련 문제