2012-02-24 2 views
3

Я хотел бы открыть email-signup, когда я нажимаю на email-signup-link. Тогда я хотел бы закрыть его, щелкнув в любом месте страницы, кроме самого окна, конечно.jQuery Закрыть DIV, щелкнув в любом месте на странице

Я осмотрел этот сайт и есть различные решения для этой проблемы, но каждый, который я пробовал, показывает, а затем скрывает мой div мгновенно. Я должен делать что-то неправильно.

Это HTML:

<a href="#" id="email-signup-link">Sign Up</a> 
<div id="email-signup"> 
    <div id="inner"> 
     <h2>E-mail Notifications</h2> 
     <input class="" type="text" name="description" placeholder="Enter your e-mail address" id="description" /> 
     <a href="#">Sign Up</a> 
    </div> 
</div> 

Это мой Javascript:

$('#email-signup').click(function(){ 
    e.stopPropagation(); 
}); 
$("#email-signup-link").click(function() { 
    e.preventDefault(); 
    $('#email-signup').show(); 
}); 
$(document).click(function() { 
    $('#email-signup').hide(); 
}); 

ответ

10

Две вещи. У вас фактически нет e, поэтому вы не можете его использовать. И вам нужно stopPropagation в вашем другом обработчике щелчка, а также:

$('#email-signup').click(function(e){ 
    e.stopPropagation(); 
}); 
$("#email-signup-link").click(function(e) { 
    e.preventDefault(); 
    e.stopPropagation(); 
    $('#email-signup').show(); 
}); 
$(document).click(function() { 
    $('#email-signup').hide(); 
});​ 

http://jsfiddle.net/Nczpb/

+0

Просто возглавляет '' 'e.stopPropagation();' '' иногда может вызывать нежелательные события. поэтому скажите, если вы нажмете '' '# email-signup''' с намерением нажать submit' '' e.stopPropagation(); '' 'будет препятствовать отправке вашей формы. –

+0

@codenamejames Если вы нажмете на '# email-signup', то вообще нет' stopPropagation', так что с вами все будет в порядке. 'stopPropagation' останавливает событие только от пузыря DOM. Если ваша кнопка отправки каким-то образом является родителем '# email-signup', ваш пример никогда не будет проблемой. –

+0

Монтаж Вы правы. спасибо за отзыв :-) –

0
$(":not(#email-signup)").click(function() { 
    $("#email-signup").hide(); 
}); 

Хотя вы бы лучше иметь какие-то накладки позади всплывающего окна и привязки выше события click до этого только.

+0

Пожалуйста, сделайте так, чтобы $ (': not (# email-signup)'), если вы собираетесь это делать. –

+0

Почему? Метод .not() в конечном итоге предоставит вам более читаемые варианты, чем нажатие сложных селекторов или переменных в фильтр селектора: not(). В большинстве случаев это лучший выбор. –

+0

Кроме того, -1 для потенциального добавления тысяч прослушивателей событий, если на странице много тегов. –

0
var mouse_is_inside = false; 

$(document).ready(function() 
{ 
    $('.form_content').hover(function(){ 
     mouse_is_inside=true; 
    }, function(){ 
     mouse_is_inside=false; 
    }); 

    $("body").mouseup(function(){ 
     if(! mouse_is_inside) $('.form_wrapper').hide(); 
    }); 
}); 

как указано в другом StackOverflow пост ...

6
$(document).click (function (e) { 
    if (e.target != $('#email-signup')[0]) { 
     $('#email-signup').hide(); 
    } 
}); 
+0

+1 Очень хорошее и простое решение –

+0

Может кто-нибудь объяснить, какую роль играет '[0]' в этом решении? @ Александр?Спасибо – Robbo

+0

Селектор jQuery ('$()') всегда возвращает массив. [0] просто выбирает первый элемент этого массива. Если идентификаторы используются правильно, это должен быть единственным результатом. –

0

Я так часто видел это сделано, накладывая страницу за формой с DIV (неактивно как правило). При этом вы можете использовать:

$("#greydiv")..click(function() { 
    $("#email-signup").hide(); 
    $("#greydiv").hide(); 
}); 

... или что-то другое.

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