2011-01-06 5 views
0

사용자 지정 드롭 다운 목록을 만들었습니다. HTML에서 select 태그처럼 작동하도록하고 싶습니다. 드롭 다운 목록의 바깥 쪽을 클릭하면 제거됩니다. 그러나 나는 그것에 문제가있다. 아래 코드는 작동하며 드롭 다운 목록 (optionContainer)을 앞으로 가져 오는 버튼을 클릭 할 때마다 컴파일됩니다.클릭하면 바깥 쪽에서 사용자 지정 드롭 다운 목록을 제거

var optionContainer = document.createElement('div'); 
optionContainer.className = 'optionContainer'; 
button.appendChild(optionContainer); 

var clickOutsideEvent = function(){ 
    $(optionContainer).remove(); 
}; 

$(optionContainer).mouseout(function(){ 
    $(document).delegate('body','click', clickOutsideEvent); 
}); 

$(optionContainer).mouseover(function(){ 
    $(document).undelegate('body', 'click', clickOutsideEvent);   
}); 

그러나 완료하려면 코드를 한 줄 더 추가해야합니다. 아래 코드 줄은 unidented의 마지막 줄 다음에 추가됩니다.

$(document).delegate('body','click', clickOutsideEvent); 

이상한 점은이 코드 줄이 mouseout 이벤트에서 사용 된 것과 정확히 똑같은 것입니다. 그러나이 선은 작동하지 않습니다.

+0

"작동하지 않는다"는 것을 말하면 - 당신은 무엇을 의미합니까? 그것은 이벤트 핸들러를 추가하지 않습니까? – Guss

+0

당신은 $ (document) .ready 호출의 마지막 줄을 감쌌습니까? 그래서 jQuery가로드 될 때 실행됩니까? –

+0

@Guss : javascript error. 예를 들어 optionContainer를 작성한 후 행을 추가하면 그 아래의 행은 컴파일되지 않습니다. – einstein

답변

0

$ (document) .ready 호출에서 마지막 줄을 감싸서 jQuery를로드 할 때 실행합니까?

$(document).ready(function() { 
    $(document).delegate('body','click', clickOutsideEvent); 
}); 
+0

미안하다. 내 테스트 중에 실제로 mouseout 이벤트가 트리거되었습니다. 그래서 문제는 남아있다 – einstein

+0

정말 이상한! 나는 document.ready 이벤트에만 사용할 수 없지만 다른 것은 괜찮습니다. ' – einstein

+0

이제는 무슨 일이 일어 났는지 알았습니다. 실제로 브라우저는 드롭 다운 목록을 렌더링하지 않았습니다. 버튼을 클릭하여 드롭 다운 목록을 가져 왔을 때 body 요소에 할당 된 click 이벤트도 트리거했기 때문에 생각했습니다. 즉, optionContainer 삭제됩니다. 브라우저가 효과적이기 위해 만들어 졌으므로 (더 나은 설명을 찾을 수 없음) 드롭 다운 목록이 렌더링되지 않습니다. 해결책은 타임 아웃 기능을 설정하는 것입니다. – einstein

관련 문제