показывать меню и скрывать его при нажатии в другом месте?

#jquery #html

#jquery #HTML

Вопрос:

У меня есть этот сценарий, в котором у меня есть body тег, который визуально не переносит все содержимое

И у меня есть 3, TR's которые содержат 2 TD's — одно для информационного слова и одно для желтого div.

Нажатие на каждое из них Info TD — открывает div (свою собственную абсолютную позицию).

  • когда я нажимаю Info , переключаются желтые окна.

введите описание изображения здесь

Проблема, которая у меня есть: закрытие желтого div.

Я хочу, чтобы оно закрывалось только при нажатии либо в соответствующем Info TD , либо за пределами желтого div

введите описание изображения здесь

Как вы можете видеть, нажатие на Info TD уже закрывает div.

Но у меня проблема с внешней областью желтого div.

это то, что я сделал :

 $("body").on('click', ".tdInfo", function (e) //when clicking on tdInfo
{
    var $cached = $(this).closest('tr').find('.myDiv'); //cache the suppose to be open div
    var wasOpen = $cached.is(":visible");
    $(".myDiv:visible").hide(); //hide all previous visible
    if (wasOpen) $cached.slideUp();
    else
   $cached.slideDown(function ()  //when the yellow div open - register once to close only when :not(.myDiv) are clicked
    {
        $("body").one('click', ':not(.myDiv)', function (e2)
        {
            e2.stopImmediatePropagation(); // Parent - ignore me.
            $cached.slideUp();
            return false;
        });
    });
});
  

Вопрос

Приведенный выше код работает не так, как ожидалось. когда я нажимаю на желтый div — он закрывается. Я не хочу, чтобы оно было закрыто.

Единственные ситуации, когда желтый div должен быть закрыт, это когда: щелчок по TD Info или за пределами желтого div.

Полностью работающий Jsbin

примечание: пожалуйста, не пытайтесь изменять высоту или вставлять другие элементы. это точное упрощение моей текущей страницы. Также — я могу найти решение с большим количеством JQ, но я думаю, что это должно быть намного проще.

Комментарии:

1. 1 только для GIF-файлов!

2. @Alek Спасибо, я пытаюсь сделать это настолько понятным, насколько могу.

3. а как насчет этого?.. jsbin.com/pepatofa/6/edit Правильно ли я понял вашу точку зрения ..?

4. @RajaprabhuAravindasamy нажатие на желтый div закрывает его….

5. @RoyiNamir Я думаю, что я это исправил, jsbin.com/pepatofa/7/edit

Ответ №1:

Я бы сделал это так

 $(document).on('click', function(e) {
    if ( $(e.target).closest('.td').length > 0 ) return;

    var $cached = $(e.target).closest('tr').find('.myDiv');
    var wasOpen = $cached.is(":visible");

    $(".myDiv:visible").hide();

    if ($cached.length amp;amp; (!wasOpen)) {
        $cached.slideDown();
    }
});
  

body Элемент — это элемент с заданными высотой и шириной, как показано в примере OP, и при щелчке за пределами желтых элементов и за body пределами document вы ничего не нажимаете, но все щелчки будут распространяться до document уровня, поэтому вам нужно прослушивать body , а не на, ,.

СКРИПКА

Комментарии:

1. $(e.target).closest('.td').length возвращает 1, когда мы щелкаем чуть выше желтого div. Это потому, что таблица практически присутствует там… Я не DV .. кстати..

2. @RajaprabhuAravindasamy проницательный взгляд

3. Да, есть небольшая проблема с позиционированием элемента TD, которую, вероятно, можно было бы исправить с помощью небольшого CSS.

Ответ №2:

Обнаруживать событие щелчка в элементе yellow box и предотвращать использование по умолчанию:

  $('.YELLOW_DIV').click(function (e) {

    //event handled
    e.preventDefault();

   });
  

Комментарии:

1. ? как насчет той части, которую оно должно закрывать при нажатии за пределами желтого div?

2. Обнаружьте событие щелчка на родительском элементе или теле и закройте его.