Добавить click к body [дубликат]

255
14 сентября 2017, 18:45

На данный вопрос уже ответили:

  • Как в javascript “закрывать” div при клике вне этого дива? 3 ответа

По неопытности не получается реализовать задачу. Что нужно дописать к данному коду, чтобы возврат к исходному состоянию (Меню) можно было реализовать, как через клик по .openclosebtn, так и через клик по body?

$('.openclosebtn').click(function() { 
  if (!$(this).data('status')) { 
    $(this).html('Close'); 
    $(this).data('status', true); 
  } else { 
    $(this).html('Меню'); 
    $(this).data('status', false); 
  } 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="main"> 
  <span class="openclosebtn">Меню</span> 
</div>

Answer 1

// Бинд кнопки 
$('.togglebtn').click(() => { 
  if (checkIsOpened()) { 
    closeMenu() 
  } else { 
    openMenu() 
  } 
}) 
 
// Бинд документа 
$(document).click(event => { 
  // Здесь мы проверяем, что мы кликнули не по кнопке открытия меню  
  // или её внутренностям 
  if (!$(event.target).is('.togglebtn, .togglebtn *')) { 
    closeMenu() 
  } 
}) 
 
// Возврващает состояние меню 
function checkIsOpened() { 
  return !!$('.togglebtn').data('opened') 
} 
 
// Закрывает меню 
function closeMenu() { 
  $('.togglebtn').data('opened', false) 
  $('#menustate').text('Закрыто') 
} 
 
// Открывает меню 
function openMenu() { 
  $('.togglebtn').data('opened', true) 
  $('#menustate').text('Открыто') 
}
.togglebtn { 
  display: inline-block; 
  padding: 3px 7px; 
  background: #555; 
  cursor: pointer; 
  color: #fff; 
  user-select: none; 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> 
<span class="togglebtn"> 
  Меню: <span id="menustate">Закрыто</span> 
</span>

Answer 2

Есть нечто подобное на чистом JS

window.onclick = function(event){
    if(!event.target.matches('.search-category__btn')){
        categoryDropdown.style.display = "none";
    }
}

.search-category__btn можно заменить на .openclosebtn ну и дальше...

Answer 3

var btn = $('.openclosebtn'); 
 
btn.click(function() { 
  if (!btn.data('status')) { 
    btn.html('Close'); 
    btn.data('status', true); 
  } else { 
    btn.html('Меню'); 
    btn.data('status', false); 
  } 
}); 
 
$(document).mouseup(function(e) { 
  if (!btn.is(e.target) && // если кнопка - не цель клика 
    btn.has(e.target).length === 0 && // и кнопка не содержит в себе цель клика 
    btn.data('status')) { // и status = true 
    btn.html('Меню'); 
    btn.data('status', false); 
  } 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="main"> 
  <span class="openclosebtn">Меню</span> 
</div>

Answer 4

$(() => { 
  let menuIsOpen = false; 
  const $body = $('body'), 
    $menu = $('.menu'), 
    $menuButton = $menu.find('.openclosebtn'); 
     
    $menuButton.on('click', toggleMenu); 
     
    function toggleMenu() { 
      if(!menuIsOpen) menuShow(); 
      else menuHide(); 
    } 
     
    function menuShow() { 
      $menuButton.html('Close'); 
      $menu.addClass('show'); 
      $body.on('click', menuHideOnBodyClick); // Когда меню открыто, вешаем обработчик клика по body 
      menuIsOpen = true; 
    } 
     
    function menuHide() { 
      $menuButton.html('Меню'); 
      $menu.removeClass('show'); 
      $body.off('click', menuHideOnBodyClick); // Когда меню закрыто, отключаем обработчик клика по body 
      menuIsOpen = false; 
    } 
     
    function menuHideOnBodyClick( e ) { 
      const $elem = $(e.target); 
      /* 
      * Проверяем является ли то на что мы кликнули нашим меню 
      * или чем-то дочерним для него, 
      * если нет, то закрываем меню 
      */ 
      if(!$elem.closest('.menu').length) menuHide(); 
    } 
});
body { height: 500px; } 
.menu { width: 140px; } 
.menu_content { display: none; } 
.menu.show .menu_content { display: block; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
<div id="main"> 
  <div class="menu"> 
    <span class="openclosebtn">Меню</span> 
    <div class="menu_content"> 
      <ul> 
      <li>Menu Item</li> 
      <li>Menu Item</li> 
      <li>Menu Item</li> 
      <li>Menu Item</li> 
      <li>Menu Item</li> 
      </ul> 
    </div> 
  </div> 
</div>

READ ALSO
How can I repeat recorded mouse path

How can I repeat recorded mouse path

I have recorded mouse path stored as array

140
Создание массива на основе двух других массивов

Создание массива на основе двух других массивов

Нужно создать массив, в котором элементы будут взяты из двух других массивовПервый элемент должен быть взят из первого массива, второй элемент...

304
Как сделать так, чтобы переходить между страницами без перезагрузки, но так чтобы url страницы менялся?

Как сделать так, чтобы переходить между страницами без перезагрузки, но так чтобы url страницы менялся?

Как сделать так, чтобы переходить между страницами без перезагрузки, но так чтобы url страницы менялся?

148
Сохранение и предпросмотр картинок с LocalStorage

Сохранение и предпросмотр картинок с LocalStorage

Использую вот этот пример: http://jsfiddlenet/8V9w6/ После загрузки файла, появляется предпросмотр, все работает нормально, но как только страничка перегружается,...

155