2009-10-02 2 views
1

У меня есть всплывающее окно и вы хотите скрыть его, когда пользователи щелкают за пределами div. Внутри div, у меня есть флажок ...Событие div onblur, вызванное при нажатии флажка внутри div

Проблема в том, что событие onblur div активируется при попытке щелкнуть по флажку. Я помещаю код cancelEventBubble в onclick этого флажка, но onblur запускает перед флажком onclick event ...

любые идеи или предложения? Это кажется так просто сделать, но это не так просто ...

С уважением, Альберт

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
    <title>Untitled Page</title> 
<style type="text/css"> 
.popup 
{ 
    display: none; 
    position: relative;  
    border: solid 1px black; 
    width: 100px; 
    left: 100px; 
    top: 100px; 
} 

.lookupButton 
{ 
    width: 15px; 
    height: 20px; 
    background-color: blue; 
} 

.lookup 
{ 
    border: solid 1px green; 
} 
</style> 
<script language="javascript" type="text/javascript"> 
var popupVisible = false; 

function cancelEventBubble(e) { 
    if (!e) var e = window.event; 
    e.cancelBubble = true; 
    if (e.stopPropagation) e.stopPropagation(); 
} 

function showPopup(obj) 
{ 
    if (!popupVisible) 
    { 
     popupVisible = true; 
     document.getElementById("popup").style.display = "block"; 
     document.getElementById("popup").focus(); 
    } 
    else 
    { 
     popupVisible = false; 
     document.getElementById("popup").style.display = ""; 
    } 
} 

function hidePopup() 
{ 
    popupVisible = false; 
    document.getElementById("popup").style.display = ""; 
} 

function setTextValue(obj) 
{ 
    var combo = document.getElementById("cbo1"); 
    if (combo.value.indexOf(obj.value) == -1) 
    { 
     combo.value += obj.value + "; "; 
    } 
    else 
    { 
     combo.value = combo.value.replace(obj.value + "; ", ""); 
    } 
} 

</script> 
</head> 
<body> 
<table><tr><td> 
    <input readonly="readonly" type="text" name="cbo1" id="cbo1" /> 
</td><td> 
    <div class="lookupButton" onclick="showPopup(this);"></div> 
</td></tr></table> 

<div id="popup" class="popup" onblur="hidePopup()"> 
    <input id="chk0" type="checkbox" onclick="cancelEventBubble(event); setTextValue(this);" value="John" />John<br /> 
    <input id="chk1" type="checkbox" onclick="cancelEventBubble(event); setTextValue(this);" value="Jack" />Jack<br /> 
    <input id="chk2" type="checkbox" onclick="cancelEventBubble(event); setTextValue(this);" value="James" />James<br /> 
    <input id="chk3" type="checkbox" onclick="cancelEventBubble(event); setTextValue(this);" value="Richard" />Richard<br /> 
    <input id="chk4" type="checkbox" onclick="cancelEventBubble(event); setTextValue(this);" value="Tim" />Tim<br /> 
</div> 
</body> 
</html> 
+0

Это не так просто. Есть один способ сделать это, используя структуру JQuery, если вам все равно. – yoda

ответ

3

В современных браузерах onblur событие не срабатывает с div элементов, необходимо броузерах подход, который может также иметь дело с проблемами IE может быть использование event delegation, привязка обработчика событий нажмите на документ, и скрыть окно при нажатая элемент не чекбокс или lookupButton, например:

document.onclick = function (e) { 
    e = e || window.event; 
    var element = e.target || e.srcElement; 

    if (element.tagName != "INPUT" && element.type != "checkbox" && 
     element.className != "lookupButton") { 
    hidePopup(); 
    } 
}; 

Проверьте приведенный выше пример с остальной частью кода here.

+0

Спасибо, это хороший подход, я немного поиграю с ним. -Albert – Albert

0

Попробуйте идти об этом по-другому. Используйте трехслойный подход, где нижний уровень является обычной страницей, верхний слой - это ваш всплывающий div, а средний слой - прозрачный полноэкранный catch-all div, в котором есть событие onfocus, которое закрывает ваше всплывающее окно (а не используя onblur).

Если вы предоставите некоторый код, вам будет проще помочь с вашим подходом.

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