2010-01-24 7 views
30

HTML 입력 및 버튼 요소가 있습니다. 폼을 제출하고 보조 창을 열 때 버튼을 사용합니다. 문제는 클릭 한 번으로 두 번 (또는 때로는 더 많은) 양식 제출로 바뀌거나 두 개의 추가 브라우저 창을 여는 것입니다. 여러 웹 브라우저에서 문제가 재현되었습니다. 나는 jQuery 버전을 바꾸려고 시도했지만 아무 것도 바뀌지 않았다. 이런 일이 일어날 수있는 원인은 무엇일까요?jQuery : 단일 버튼 클릭, 두 번 이상 클릭 이벤트 발생

+1

아마 잘못했을 수 있습니다. http://www.jsbin.com에 몇 가지 코드 또는 버전을 게시하여 도움을 받으십시오. – Kobi

+1

예, 코드를 게시해야합니다. 그렇지 않으면 도움을받을 수 없습니다. –

+0

같은 문제가 생겼어. 내 경우에는 확인 ("..") 함수로 팝업 창을 호출 했으므로 Enter 키를 누르면 "OK"와 백그라운드에서 선택한 항목. 어떤 도움이 필요합니까? –

답변

80

이벤트를 여러 번. 처리기를 할당 한 행이 부주의로 여러 번 호출되지 않는지 확인하는 것이 좋습니다. 또 다른 해결책은 전화가 같은 첫 바인딩을 해제 할 수 :

$("#myButton").unbind("click").click(myHandler); 

하지만 난 그냥 추측하고있어 일부 코드를 보지 않고

.

+0

약 6 년, 여전히 훌륭하게 작동합니다. 감사! – Haring10

+0

위대한 간단한 대답! – Kelvin

+0

바인딩 해제를 사용하는 이유는 무엇입니까? 그것은 단지 .off()를 호출합니다 :''(function (a, b) {return this.off (a, null, b)}))'' – NoBugs

12

, 나는 추천 할 수있는 최선의 하나의()에서 찾고 당신은 많은 정보를 제공하지 않은 점을 감안

http://api.jquery.com/one/

당신이 클릭에 동일한 핸들러를 할당하기 때문에 귀하의 문제가 발생 될 수 있습니다
8

jQuery Sparkle은 "once"함수를 호출하여 처리기를 이벤트에 단 한 번만 바인딩 할 수있는 깨끗하고 우아한 솔루션을 제공합니다.

이 사용하는 것과 다르 코 Z의 제안을 통해 중요한 개선은 다음과 같습니다

$("#myButton").unbind("click").click(myHandler); 

는 "클릭"이벤트가 호출 될 때마다 관련된 다른 "클릭"핸들러 바인딩을 해제겠습니까. 따라서 실수로 한 번 바인드되는 것을 확실하게 보장 할 수 있습니다. 너!

jarrett의 제안은 호출 후 바로 "클릭"처리기의 바인딩을 해제하므로 다시 호출 된 핸들러 (초기 화재 이후)를 처리하려면 핸들러를 리 바인드해야합니다.

jQuery Sparkle을 사용하면 처리기가 필요한만큼 여러 번 실행될 수 있지만 여러 번이 아니라 한 번만 바인딩됩니다. 당신은 다음과 같이 사용할 수 있습니다 : 당신은 그냥 jQuery의 "바인딩"내장처럼 콜백의 데이터를 지원하려는 경우

$('#myButton').once('click', function(){ 
    // my handler 
}); 

을 또는, 당신은 사용할 수 있습니다

$('#myButton').once('click', data, function(){ 
    // my handler 
}); 

당신은 찾을 수 once 함수를 정의하기위한 소스 코드 here.

오픈 소스이므로 AGPL 라이센스를 통해 자유롭게 걱정없이 자유롭게 사용할 수 있습니다! :-) 또한 하루 하루를 적극적으로 개발하므로 지원이 부족하지 않을 것입니다.

하지만 가장 중요한 것은 DRY 플러그인/효과 프레임 워크로 플러그인과 확장 프로그램을 훨씬 더 쉽게 개발할 수 있다는 것입니다. 목표를 달성하는 데 도움이되기를 바랍니다.

+1

나는 이것이 오래된 것을 알지만,이 해결책은 올바른 해결책을 찾는다. 오늘의 jQuery 버전에서 .one 바인딩 함수를 사용하고 내 문제가 해결되었다. –

6

은 나를 위해 그것은

$(function() { 
    $('.some-element').click(function() { 
     //event that fires twice 
    }); 

    //some exception-throwing code here 
}); 

jQuery를 두 번 (?!) 때문에 예외의 클릭 기능을 두 번 구속 될 수 있도록 익명 준비 함수를 호출 한에 의해 발생했다.

4

당신은 요소에 대한 이벤트 핸들러를 연결 $("div").one("click", function() { ... });

를 사용할 수 있습니다. 핸들러는 요소 당 최대 한 번만 실행됩니다.

jquery.com

1

그것이 내가 사용 원래했기 때문에 나를 위해 일하기 전에이 같은 호출 $ ('#의 myButton에').에 ('클릭'... 내 청취자를 할당 할 수는.

$('#myButton').off(); 

Documentation for "off();"

3

이 잘 작동합니다. 그것은 나를 위해 작동합니다.

$(".class-name").unbind().click(function() { 
    //Do the Stuff 
}); 
1

모달 대화 상자 창에 문제가있었습니다. 세션에서 대화 상자를 열 때마다 이벤트가 한 번 발생했습니다. 첫 번째 창에서 아무런 문제가 없습니다. 두 번째 창에서 두 번 실행되고 세 번째 창에서 세 번 실행됩니다.

새 대화 상자 창을 열 때마다 대화 상자의 초기화 기능이 호출되는 것으로 나타났습니다. 같은 세션. 전역 변수 notInit = -1을 추가하고 init을 실행할 때 값을 1로 지정했습니다. init 함수를 실행하기 전에 notInit의 값을 확인하고 값이 -1 인 경우에만 init을 계속 진행했습니다.

+0

이것은 내가 좋아할만한 것으로 들린다. 구현하고 싶지만 단계 구문을 잘 모르겠습니다. 너무 많이 쓰지 않는다면 답안에 코드 스 니펫을 제공 하시겠습니까? – Chris22