2014-09-09 5 views
1

Я пытаюсь создать простой лайтбокс при нажатии на изображения. Тогда щелчок в любом месте уничтожит этот лайтбокс.Один щелчок показывает лайтбокс, но только второй щелчок скрывает его (не тот же первый щелчок)

Проблема: все выполняется сразу, даже разрушающая часть. Вот мой код:

$('img').on('click', function(){ 
    $('body').append('<div id="gray"><div id="gray_content"></div></div>'); 
    var image = $(this).clone(); 
    $('#gray_content').html(image); 
    $(document).click(function() { 
     $('#gray').remove(); 
    }); 
}); 

Как выполнить удалить() часть на второй щелчок от пользователя (не тот же первый клик)?

ответ

2

Вы можете использовать простой флаг для этого:

Fiddle.

var isFirst = true; 

$('img').on('click', function() 
{ 
    if (isFirst) 
    { 
     $('body').append('<div id="gray"><div id="gray_content"></div></div>'); 
     var image = $(this).clone(); 
     $('#gray_content').html(image); 
    } 
    else 
    { 
     $('#gray').remove(); 
    } 
    isFirst = !isFirst; 
}); 

Update. Чтобы удалить, нажав в любом месте, вы можете использовать:

Updated fiddle.

var isFirst = true; 

$('img').on('click', function() 
{ 
    if (isFirst) 
    { 
     $('body').append('<div id="gray"><div id="gray_content"></div></div>'); 
     var image = $(this).clone(); 
     $('#gray_content').html(image); 
     isFirst = false; 
     return false; 
    } 
}); 

$(document).on('click', function() 
{ 
    if (!isFirst) 
    { 
     $('#gray').remove(); 
     isFirst = true; 
    } 
}); 
+2

В этом случае второй щелчок фиксируется только для изображения, но я думаю, @drake хочет его удалить, если пользователи щелкнули в любом месте документа. вам может потребоваться переместить isFirst в глобальную область и установить/отключить его на основе события с пузырьковым щелчком на объекте документа .... $ (document) .click (function() {isFirst =! First;}); – vreddy

+0

@ viper, ну да, я не внимательно прочитал вопрос ... – Regent

0

Вы почти никогда не хотите связывать один обработчик событий внутри другого обработчика. В вашем коде каждый раз, когда вы нажимаете на изображение, вы добавляете в документ ДРУГОЙ обработчик кликов. Вы должны просто привязать этот обработчик один раз на верхнем уровне. Вам не нужно ждать, пока после запуска первого обработчика - если в DOM не добавлен gray DIV, просто не удастся удалить что-либо.

$(":not(img)").click(function() { 
    $("#gray").remove(); 
}); 
$("img").click(function() { 
    if ($("#gray").length == 0) { // If it's not already showing 
     $('body').append('<div id="gray"><div id="gray_content"></div></div>'); 
    } 
}); 

Причина щелчок по изображению разрушает gray DIV из-за восходящую цепочку события - после того, как обработчик щелчка на прогонах изображения, событие пузыри к документу и что обработчик события также работает. Вы можете предотвратить пузыри, положив event.stopPropagation() в обработчик изображения.

Кстати, добавление и удаление таких элементов, как правило, считается плохим подходом. Обычно предпочтительнее использовать .hide() и .show().

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