2015-01-22 2 views
-1

내가 버튼을 누르면이 JQuery와 표현을 가지고, 서버에서 일부 HTML을 가져온 다음 내 문서의 DOM 노드에 추가 :.done 처리기가 여러 번 호출되지 않도록하려면 어떻게해야합니까?

<script type="text/javascript"> 
     $(document).ready(function() { 
      $(".addbutton").click(function() { 
       var addbuttonNode = $(this); 
       $.post("/InteractiveApplications/GetQuizAnswer", { id: '@guid' }) 
        .done(function (data) { 
         $(addbuttonNode).next().next().append(data); //find better way of doing this 
        }); 
      }); 
     }); 
    </script> 

내 웹 사이트에 여러 개의 ".addButton"버튼이 . 내가 겪고있는 문제는 버튼을 여러 번 클릭하면 my .done 핸들러가 여러 번 호출된다는 것입니다.

내 생각 엔 실행중인 이벤트 핸들러 목록이 있는데, 어디서/왜 이런 일이 일어나는 지 이해할 수 없다.

+0

는 "VAR addbuttonNode = $ (이);", 당신은 할 때 'jQuery를 함께 포장 nedd하지 않습니다 .done() 다음에 변수를 사용하여 요소에 액세스하십시오. –

+0

정확한 대답을 제공하기에 충분한 데이터가 없습니다. MCVE를 만들 수 있습니까? – blgt

+0

단추에 이벤트 처리기를 연결하면 단추를 클릭 할 때마다 이벤트 처리기가 여러 번 호출됩니다. 단추를 여러 번 클릭했음을 언급 했으므로 이벤트 처리기가 여러 번 호출되어 여러 개의 Ajax 요청을 만들고 그에 따라 여러 번의 호출을 할 수 있습니다. – sachinjain024

답변

0
: 한 번만 클릭 할 수 대신 각 버튼을하고자하는 경우

$(document).ready(function() { 
    $(".addbutton").click(function() { 
     // if any request pending, return {undefined} 
     if ($.active) return; 
     var addbuttonNode = $(this); 
     $.post("/InteractiveApplications/GetQuizAnswer", { 
      id: '@guid' 
     }).done(function (data) { 
      // instead of .next().next() 
      $(addbuttonNode).nextAll('selector').first().append(data); //find better way of doing this 
      // or .parent().find('selector') 
     }); 
    }); 
}); 

, 다음 jQuery를 .one() 방법을 사용

문제는 당신이 요청을 한 번 이상 오히려 수행 한 다음에 완료된 후에 완료됩니다. 데이터 개체에 상태를 유지할 수 있습니다 ::

$(document).ready(function() { 
    var posting = false; 
    $(".addbutton").data("done", false).click(function() { 
     var addbuttonNode = $(this); 
     if (!addbuttonNode.data("done")) { 
      addbuttonNode.data("done", true); 
      $.post("/InteractiveApplications/GetQuizAnswer", { id: '@guid' }) 
       .done(function (data) { 
        $(addbuttonNode).next().next().append(data); 
       }); 
     } 
    }); 
}); 
-2

이벤트 처리를 위해 바인드 및 바인드 해제 함수를 사용해보십시오. 그런 다음 한 번 실행 된 후에 클릭 기능의 바인딩을 해제 할 수 있습니다.

<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".addbutton").bind('click',function() { 
      var addbuttonNode = $(this); 
      $.post("/InteractiveApplications/GetQuizAnswer", { id: '@guid' }).done(function (data) { 
       addbuttonNode.next().next().append(data); 
      }); 
      addbuttonNode.unbind('click'); 
     }); 
    }); 
</script> 

, 나는이 더 있어야한다 거의 같은 일을하는 또 다른 방법을 생각 :

<script type="text/javascript"> 
    $(document).ready(function() { 
     $(".addbutton").each(function(){ 
      $(this).bind('click',function() { 
       $.post("/InteractiveApplications/GetQuizAnswer", { id: '@guid' }).done(function (data) { 
        addbuttonNode.next().next().append(data); 
       }); 
       $(this).unbind('click'); 
      }); 
     }); 
    }); 
</script> 

나는 아직 그것을 시도하지 않은,하지만 작동합니다, 그것을 시도! :)

클래스 또는 데이터 속성을 설정하여 버튼이 이미 클릭되었는지 확인할 수도 있습니다. 그런 다음 if ($ (this) .hasClass ('clicked')) {return; } 또는 뭔가 ...

+0

왜 이것이 downvoted인지 명확히 알 수 없으며 이론이 명확하게 표시됩니다. 어쩌면 가장 깨끗한 해결책은 아닐지도 모르겠다. 그러나 변칙적으로 나쁜 것은 아니다. –

0

당신은 보류하고있는 요청을 확인할 수 있습니다 :

$(document).ready(function() { 
    $(".addbutton").one('click', function() { 
     var addbuttonNode = $(this); 
     $.post("/InteractiveApplications/GetQuizAnswer", { 
      id: '@guid' 
     }).done(function (data) { 
      // instead of .next().next() 
      $(addbuttonNode).nextAll('selector').first().append(data); //find better way of doing this 
      // or .parent().find('selector') 
     }); 
    }); 
}); 
+0

하지만 그는 여러 개의 버튼을 가지고 있는데, 하나의 활성화 된 요청으로 모든 버튼이 비활성화 될 것이다. – HaSuKrOnOs

+0

@HaSuKrOnOs 그래하지만이 질문을 이해하는 방법입니다. 나는 틀릴 수도 있고, 예상되는 행동이 무엇인지 분명하지 않을 수도 있습니다.하나의 버튼 만 비활성화해야하는 경우 로직은 특정 버튼 데이터/클래스/무엇이든 확인하고 이에 따라 로직을 설정하는 것입니다. –

0

나는 할 것이다 다음은 같은 VAR에 JQuery와 객체를 저장하는 경우

$(".addbutton").click(function() { 
      var addbuttonNode = $(this); 
      addbuttonNode.attr('disabled',true); 
      $.post("/InteractiveApplications/GetQuizAnswer", { id: '@guid' }) 
       .done(function (data) { 
        $(addbuttonNode).next().next().append(data); //find better way of doing this 
        addbuttonNode.attr('disabled',false); 
       }); 
     }); 
+0

이것은 시각적 인 해결책으로 문제를 예방하는 데 도움이됩니다. –

+1

비활성화 된 요소는 알고있는 한 클릭 이벤트를 발생시키지 않으므로 문제가 발생하지 않습니다. – HaSuKrOnOs

+0

맞아요.하지만 콘솔에 입력하세요 : $ (". addbutton"). click(); 그리고 그것은 여전히 ​​불이 붙을 것이다. –

관련 문제