2012-06-26 8 views
-2

나는 div를 onclick으로 보여주기 위해 javascript를 사용했다. 그러나 div 밖으로 나가면 div를 숨기고 싶다.div를 열기 위해 더블 클릭

:

더 검색 후, 나는이 기능을 발견하고 완벽하게

를 작동하지만 문제가있는 코드는 다이빙

내 코드를 보여, 처음으로 더블 클릭을 필요로

<script> 
// click on the div 
function toggle(e, id) { 
    var el = document.getElementById(id); 
    el.style.display = (el.style.display == 'none') ? 'block' : 'none'; 

    // save it for hiding 
    toggle.el = el; 

    // stop the event right here 
    if (e.stopPropagation) 
    e.stopPropagation(); 
    e.cancelBubble = true; 
    return false; 
} 

// click outside the div 
document.onclick = function() { 
    if (toggle.el) { 
    toggle.el.style.display = 'none'; 
    } 
} 

</script> 
<style>#tools{display:none;}</style> 

<div id="tools">Hidden div</div> 
<a href="#" onclick="toggle(event, 'tools');">show/hide</a> 

이것은 내 전체 코드이므로 컴퓨터에서 테스트 할 수 있습니다.

이다 질문 :

+1

무엇이 질문입니까? – gdoron

+0

질문입니다 :이 함수는 두 번의 클릭이 필요합니다. div (한 번의 클릭) 표시 안 함 (두 번 클릭) –

+0

다음은 함께 테스트 할 예제입니다. http://jsfiddle.net/JjChY/ –

답변

2

이 시도 - http://jsfiddle.net/JjChY/1/

변경을

el.style.display = (el.style.display == 'none') ? 'block' : 'none'; 

el.style.display = (el.style.display == 'none' || el.style.display == '') ? 'block' : 'none'; 
+0

고맙습니다. 완벽하게 작동합니다. –

+0

토글 ('tools')을 사용할 수 있습니까? 토글 대신 (이벤트, '도구'); ? –

+0

@AlaaGamal : 아니요. 'event' 객체를 전달해야하므로'e.stopPropagation '을 할 수 있습니다. –

1

문제는 el.style.display는 요소의 인라인 스타일에서 읽는 기능은 두 번의 클릭이 필요, 난 클릭 (한 번의 클릭)하지 (더블 클릭)에 사업부를 표시 할 것입니다,하지의 CSS .

따라서 첫 번째 클릭에서 el.style.display'' (빈 문자열)이므로 '없음'으로 설정됩니다. 두 번째로 el.style.display'none'이므로 작동합니다.

인라인 스타일이 비어 있으면 요소의 CSS에서 읽어야합니다.

function getStyle(x, styleProp) { 
    if (x.currentStyle) { 
     var y = x.currentStyle[styleProp]; 
    } 
    else if (window.getComputedStyle) { 
     var y = document.defaultView.getComputedStyle(x, null).getPropertyValue(styleProp); 
    } 
    return y; 
} 

// click on the div 

function toggle(e, id) { 
    var el = document.getElementById(id); 
    var display = el.style.display || getStyle(el, 'display'); 
    el.style.display = (display == 'none') ? 'block' : 'none'; 

    // save it for hiding 
    toggle.el = el; 

    // stop the event right here 
    if (e.stopPropagation) e.stopPropagation(); 
    e.cancelBubble = true; 
    return false; 
} 

// click outside the div 
document.onclick = function() { 
    if (toggle.el) { 
     toggle.el.style.display = 'none'; 
    } 
}​ 

DEMO : 나는이에 대한 quirksmode에서 getStyle 방법을 사용하는거야 http://jsfiddle.net/JjChY/2/

+0

맞습니다. 감사합니다. –

+0

코드를 다시 사용해 주셔서 감사합니다. 짧은 코드가 필요합니다. –

+0

@AlaaGamal : 왜 "짧은 코드"가 필요한가요? 나는 그들에게 "짧은 길"을하기 전에 일을 "올바른 길"로 제안 할 것입니다. –

3

사용이 :

el.style.display = window.getComputedStyle(document.getElementById("tools")).getPropertyValue("display") == "none" ? 'block' : 'none'; 

이 작동합니다.

+0

답변 주셔서 감사합니다, 그것도 작동합니다 –

0

코드가 약간 복잡합니다. 그것은 훨씬 더 간단 쓸 수있다 : 당신이 jQuery를하는 경우, 당신은 외부 클릭이 같은 뭔가를 할 수

<script> 
var toggle = function(id) { 
    var element = document.getElementById(id); 
    element.className = element.className === 'hidden' ? '' : 'hidden'; 

    return false; 
}; 
</script> 

<style> 
.hidden { 
    display: none; 
} 
</style> 

<div id="tools" class="hidden">Hidden div</div> 
<a href="#" onclick="toggle('tools');">show/hide</a> 
+0

내 코드를 단축 해 주셔서 감사합니다.하지만 div 밖으로 숨길 때 div를 숨기고 싶습니다. 내 필요에 맞게 코드를 편집 할 수 있습니까? –

+1

@AlaaGamal 당신은 이전 코드와 내가 게시 한 코드를 사용하여 그것을 알아낼 수 있어야합니다. 우리는 당신을 위해 당신의 일을하기 위해 여기에 있지 않습니다. – jbabey

+0

죄송합니다. 나는 자바 스크립트에서 초보자를 의미하지는 않는다. 내 코드와 코드를 섞어 쓸 수는 없지만, –

0

.

먼저 "tools"div에 마우스가있을 때 클래스를 설정하십시오. 마우스가 안에 있지 않으면 클래스를 제거하십시오.

$('#tools').hover(function() { 
    $('#tools').addClass("inside"); 
}, 
function() { 
    $('#tools').removeClass("inside"); 
}); 

그런 다음 HTML에서 트랙을 클릭합니다. "inside"클래스가 "tools"div에 없으면 숨 깁니다.

$("html").click(function() { 
    $("#tools").not(".inside").each(function() { 
     $("#tools").hide(); 
    }); 
}); 
+3

그는 jQuery를 사용하지 않는다. –

+0

클래스를 추가하는 대신, 클릭 된 요소가'# tools'인지 아닌지 안다면 왜 안 될까? '$ ('html '). (e) {if (! $ (e.target) .is ('# tools ')) {' –

+0

그 것이 더 좋을 것이다. 나는 뭔가를 배웠을 것 같다. – dangowans