2012-06-26 7 views
-2

Я использовал javascript для отображения div по onclick, но когда я нажимаю на 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> 

Это мой полный код, вы можете протестировать его на своем компьютере.

Вопрос заключается в следующем: функция требует двух щелчков мыши, я хочу показать DIV на мыши (один клик) Не (двойной щелчок)

+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

Могу ли я использовать toggle ('tools'); вместо переключения (событие, «инструменты»); ? –

+0

@AlaaGamal: Нет. Вам нужно передать объект 'event', чтобы вы могли« e.stopPropagation ». –

1

Проблема заключается в том, что el.style.display читает только встроенные стили элемента, а не его CSS ,

Таким образом, при первом нажатии el.style.display есть '' (пустая строка), поэтому он установлен на «none». Затем второй раз el.style.display - 'none', поэтому он работает.

Вам нужно попробовать прочитать CSS-код элемента, если его встроенные стили пустые. Я собираюсь использовать метод getStyle из quirksmode для этого:

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: 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

Ваш код немного запутан. Это может быть написано гораздо проще:

<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

я извиняюсь. я не это имею в виду, я только начинаю в javascript, и я, хотя я не могу смешивать свой код с моим, –

0

Если у вас есть JQuery, вы могли бы сделать что-то подобное для мыши снаружи.

Во-первых, установите класс в div «tools», когда мышь находится внутри него. Удалите класс, когда мышь не находится внутри него.

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

Затем отслеживание кликов по HTML. Скрыть, если класс «внутри» не находится в div «tools».

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

Он не использует jQuery –

+0

Вместо добавления класса, почему бы просто не обнаружить, был ли элемент с щелчком '# tools' или нет? '$ ('html'). click (e) {if (! $ (e.target) .is ('# tools')) {' –

+0

Это было бы лучше. Думаю, я тоже кое-что узнал. – dangowans

Смежные вопросы