2013-03-27 4 views
7

그런 일이 생깁니다. jQuery 클릭 이벤트없이 클릭 이벤트 발생

$('.js-custom-dropdown').find('.custom-dropdown-unfolded').toggle(); 
$('.custom-dropdown-btn, .custom-dropdown-btn-unfolded').keydown(function(event){ 
    if (event.keyCode === 13) { 
     openDropdown($(this)); 
    } 
}).click(function(){ 
    openDropdown($(this)); 
}); 

function openDropdown (element){ 
    element.parents('.js-custom-dropdown').find('.custom-dropdown-unfolded').toggle(); 
    console.log($(this)) 
} 

내가 드롭 다운 버튼을 클릭

openDropdown 기능은 한 번만 실행되지만, 버튼을 언론에 난 탭 내 방식이 입력 할 때 함수가 두 번 호출됩니다. 추측에는 연쇄와 관련이있는 것으로 추측됩니다. 그러나 저는이 점을 처음 접했고 jQuery 디자인 패턴을 완전히 이해하지 못한다는 것을 인정합니다. 나는 keydown 핸들러에서 함수를 두 번 호출하여 문제를 해결할 수 있지만, 알 수 있습니다. :)

코드의 문제점과 그 원인을 설명해 주시겠습니까?

+1

당신 때문에되지 않습니다 : 여기에

$('.custom-dropdown-btn, .custom-dropdown-btn-unfolded').keydown(function (e) { if (e.keyCode === 13) { $(this).trigger('click'); e.preventDefault(); } }).click(function() { openDropdown($(this)); }); 

을 개념 증명 바이올린의 2 개의 이벤트 리스너가 있습니다. 하나는 keydown (Enter 키를 누를 때 발생합니다)이고 다른 하나는 버튼을 클릭했을 때입니다 (Enter 키를 누를 때 수행중인 작업입니다) – Pete

답변

4

이것은 html 5 사용자 상호 작용 사양에 미치지 않습니다. HTML spec for elements with a tabIndex을 살펴보면 탭 인덱스가있는 요소의 경우 Enter 키가 click 이벤트를 발생시키는 것을 알 수 있습니다.

나는 그것이이 문제의 원인이라고 생각합니다. 이런 경우가 아닌지를 테스트하기 위해 이전 버전의 (HTML 5가 아닌) 브라우저에서 시도해 볼 수 있습니다.

편집 (포스터 요청) : answer given by @Terry은 보유한 문제를 해결할 수있는 방법을 제공합니다. 이벤트에 jquery의 "preventDefault"를 사용하면 enter 키를 두 번 눌렀을 때 이벤트가 중지됩니다.

+0

감사합니다. 대답. IE7에서이 페이지를 테스트했으며 Enter 키를 눌러 드롭 다운을 열 수있었습니다. JS 콘솔에 접근 할 수 없었습니다. 그래도 모든 브라우저에서 작동하도록 할 수있는 방법을 제안 해 주시겠습니까? –

+0

내가 게시 한 질문에 답할 것이기 때문에 답변을 수락 할 것이지만 코드로 다른 질문을 인용 할 수 있습니까? –

1

사용를 keyDown에 클릭 이벤트를 트리거 할 수 있습니다 $(this).trigger('click');를하고를 keyDown시 기본 동작 방지 : http://jsfiddle.net/yTuR3/

+0

e.preventDefault()로 충분합니다. 도와 줘서 고마워. –