2010-08-01 5 views
2

나는 대략 다음과 함께 일하고 :JQuery와 및 이벤트 다시 ... 버블 링은

var i; 
var k = 5; 
$('document').ready(function() { 
    $('#someElement').click(function (e) { 
     e.stopImmediatePropagation(); 
     i++; 
     if (i >= k) { 
      my_function(); 
     }); 
    } 
}); 
my_function() { 
    alert(i); 
    $('#myDisplay').text("You have clicked on '#someElement' " + i + "times"); 
} 

'my_function()'예상대로 나는 '#someElement'를 클릭하지만 alertbox가 5 튀어 화재 타임스!!!.

신속하고 분명한 해결책은 my_function()의 내용을 배치하고 '#someElement'에 첨부 된 if 제어문에 배치하는 것이지만, 내가 요약 한 구조를 유지하는 데 매우 열중하고 있습니다. 그렇게 할 수있는 간단한 방법이 있습니다.

아이디어가 있으십니까?

UPDATE는

나는 원래 문제가 내 '클릭'이벤트 내에서 함수 호출이라고 가정한다. 경우 문은 '만약'문에서 렌더링, 나는 상수 'K'를 생략 한

var i = 0; 

$('document').ready(function() { 

    $('<div id="someElement">Click me</div>').appendTo('body'); 
    $('<div id="myDisplay"></div>').appendTo('body'); 
    $('#someElement').click(function (e) { 
     i++; 
     $.get("test.html", function(html) 
     {  
      $(html).ajaxComplete(function() 
      { 
       my_function(i); 
      }); 
     }); 

    }); 

}); 

function my_function(n) 
{ 

    switch (n) 
    { 

    case 1: 
     alert(n); 
     $('#myDisplay').text("this is case " + n); 
     break 
    case 2: 
     alert(n); 
     $('#myDisplay').text("this is case " + n); 
     break 
    case 3: 
     alert(n); 
     $('#myDisplay').text("this is case " + n); 
     break 

    default: 
     alert('A great detective always breaks the case. :)'); 
     break 

    } 

} 

: 그것은, 내가 문제가 중첩 된 'ajaxComplete'호출 할 수있는 뭔가가 있다고 생각되지 않았다 이전 예는 쓸모가 없다. 위의 코드는 내가 만난 문제를보다 잘 보여줍니다.

도움이 될 것입니다. : 업데이트 된 질문에 따라

+0

먼저 코드를 올바르게 들여 씁니다. – Anders

답변

3

편집 :

문제는 콜백에서 $.ajaxComplete()를 호출하고 있다는 점이다. 그걸 없애야 해. 익명의 콜백 함수 만 있으면됩니다.

$.ajaxComplete()의 목적은 아약스 요청이 완료 될 때 실행되는 기본 기능을 설정하는 것입니다. 이것이 원하는 경우 현재 콜백에서 꺼내어 .ready() 호출에 배치하면 호출이 한 번만 실행됩니다.

지금 당장은 클릭 한 번 (성공한 응답)마다 동일한 처리기를 추가하고 있습니다. 따라서 5 번 클릭하면 동일한 클릭 핸들러가 5 번 표시됩니다. 워드 프로세서

: http://api.jquery.com/ajaxComplete/

Ajax 요청이 완료 될 때마다는, jQuery를이 ajaxComplete 이벤트를 트리거합니다. .ajaxComplete() 메소드로 등록 된 모든 핸들러는이 시점에서 실행됩니다.


원래 대답

당신이 그것을 가지고 모든 방법에서 실행되지 않습니다 때문에, 당신의 실제 코드가 아니어야합니다.

함수에 대해 function 선언이 없습니다. 을 0과 같은 값으로 초기화해야하고 click 처리기의 닫는 괄호가 잘못 배치되어야합니다.

즉, 코드를 수정하면 코드가 올바르게 작동합니다.

그것을 밖으로 시도 : 경고가 당신을 위해 최대 5 번 나올http://jsfiddle.net/sGWjL/1/

경우에, 당신은 코드가 사용되는 이상 (또는 실제)을 붙여 넣어야합니다.

var i = 0; 
var k = 5; 

$('document').ready(function() { 
    $('#someElement').click(function (e) { 
     e.stopImmediatePropagation(); 
     i++; 
     if (i >= k) { 
      my_function(); 
     } 
    }); 
}); 

function my_function() { 
    alert(i); 
    $('#myDisplay').text("You have clicked on '#someElement' " + i + "times"); 
}​ 
+0

신속한 답장을 보내 주셔서 감사합니다! 그런데 jsfiddle.net 앱이 정말 마음에 든다. ;) 게시하기 전에 코드를 들여 쓰려고 노력할 것입니다. 선언되지 않은 변수로 만든 기본 실수 이외에도 코드가 실제로 올바르게 작동했습니다. 필자가 직면 한 문제를보다 잘 반영한 코드 예제를 제공하기 위해 원래 게시물을 편집했습니다. 모두에게 환호하십시오. :) – Leonard

+0

@ 레오나드 - 나는 내 대답을 업데이트했다 (위 참조). 기본적으로 당신은'.ajaxComplete()'를 없애고 콜백에서'my_function()'을 호출하거나,'.ajaxComplete()'를 원한다면 * once * 만 호출하면된다. 지금은 * ajax 응답마다 한번씩 호출하고 있습니다. – user113716