Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Аналог closest в jQuery (https://javascript.ru/forum/dom-window/52118-analog-closest-v-jquery.html)

Phonixe 04.12.2014 20:27

Аналог closest в jQuery
 
Ребята есть строка

if ( $( event.target ).closest( '.popul' ).length ) return;

Вообщем она позволяет отменять закрытие блока при клике на нем, т.е при клике по предкам блока с классом popul.

Как будет выглядить аналог на чистом JS?

devote 04.12.2014 20:52

function closest(target, selector) {
  while (target) {
    if (target.matches && target.matches(selector)) return target;
    target = target.parentNode;
  }
  return null;
}

if (closest(event.target, '.popul')) return;

Phonixe 04.12.2014 21:19

что-то не так - не работает. что такое matches?

devote 04.12.2014 21:22

Цитата:

Сообщение от Phonixe
что такое matches?

https://developer.mozilla.org/en-US/...lement.matches

Phonixe 04.12.2014 21:32

понятно, но почему-то при клике на обьект с классом .popul, все равно окошко закрывается, у вас работает нормально?

рони 04.12.2014 22:14

Phonixe,
:write: вариант закрытия по клику вне элемента без jQuery
<!DOCTYPE HTML>

<html>

<head>
  <title>Untitled</title>
  <meta charset="utf-8">
  <style type="text/css">
  .popul{
    background-color: #008000;
    width: 150px;
    height: 150px;
  }

  </style>
</head>

<body><div class="nopopul"><h1>This is the element!</h1></div>
<div class="popul"><h1>This is the test!</h1></div>
  <script type="text/javascript">
   var doc = document;
  doc.onclick = function(event) {
      event = event || window.event;
      var target = event.target || event.srcElement;
      while (target != doc) {
          if (/(^|\s)popul(\s|$)/.test(target.className)) {
              return;
          }
          target = target.parentNode;
      }
      document.querySelector('.popul').style.backgroundColor = 'red' //close
  }  </script>
</body>

</html>

Яростный Меч 05.12.2014 00:11

лучше вот такой регекс:
/(^|\s)popul(\s|$)/


а то, например, "popul-popul" тоже матчится

devote 05.12.2014 00:19

чет я не понимаю, чем не устраивает вариант с .matches? Кроссбраузерность? Дык выше по ссылке что я дал, описано как это решить.

рони 05.12.2014 00:33

Цитата:

Сообщение от devote
Дык выше по ссылке что я дал, описано как это решить.

я непонял как воспользоваться вашим кодом и второе если его надо дополнять полифилом то код стать ещё длиннее и запутанее ... я предложил свой вариант, на сколько хватило моего умения.

рони 05.12.2014 00:33

Яростный Меч,
ок


Часовой пояс GMT +3, время: 17:35.