2013-03-07 5 views
3

Я пытаюсь найти чистый Угловой способ определения, является ли элемент с щелчком дочерним по отношению к другому. В jQuery я бы сделал has(), но не уверен, какой способ сделать это в Angular, кроме того, чтобы бежать через всех детей и делать сравнение.Угловой - это элементный ребенок другого

JQuery:

if($(someelement).has(another)) { }; 
+0

В чем ваш прецедент? –

+0

Я перекодирую плагин Bootstrap clickover (fancy popover). Мне нужно определить, было ли нажато тело, но убедитесь, что его не выбрал сам popover. Попытка сделать щелчок в любом месте и закрыть функцию. В приведенном выше коде «someelement» находится элемент popover div - «другой» - это возврат от функции щелчка тела - https://github.com/lecar-red/bootstrapx-clickover/blob/master/js/bootstrapx -clickover.js # L76 - У меня нет проблем с обнаружением щелчков по телу, но строка has() меня озадачивает. – cyberwombat

+0

Почему бы вам просто не добавить обработчик кликов в '$ document'? Вот как работает выпадающий переключатель - [проверьте код] (https://github.com/angular-ui/bootstrap/blob/master/src/dropdownToggle/dropdownToggle.js) - и он должен быть супер простым (например, две или три строки кода), чтобы добавить это в плагин popover. –

ответ

0

Вы могли бы пойти другим путем вокруг.

Вместо того чтобы спросить ли B является потомком A, вы можете спросить, является ли предок B:

function isAncestor(ancestor, element) { 
    var parent = element.parentNode; 
    while (parent && parent!=ancestor) { 
     parent = parent.parentNode; 
    } 
    return parent==ancestor; 
} 
0

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

Моим первым решением было использовать Element.getBoundingClientRect().

Если вы имеете дело с прямоугольной целью вы можете проверить й и у события щелчка против ограничивающего прямоугольника из element (который является angular.element)

$document.bind('click', function(evt) { 
    var x = evt.x, 
     y = evt.y, 
     rect = element[0].getBoundingClientRect(); 

    if(x > rect.left && x < rect.right && y > rect.top && y < rect.bottom) { 
     //you've clicked somewhere in the element 
    } 
}); 

IE8 + работает отлично, но есть небольшая ошибка в 5-7

http://www.quirksmode.org/dom/w3c_cssom.html

Досадно, если ваш элемент содержит другие элементы, которые не влияют на его ширина/высота, которая не будет работать. Но вы можете использовать это (слегка взломанное) решение

link: function(scope, element, attrs) { 

     var clicked = false; 

     element.on('click', eClickHandler); 
     $document.on('click', clickHandler); 

     function eClickHandler(event) { 
      clicked = true; 
      $timeout(function() { 
       clicked = false; 
      }); 
     } 

     function clickHandler(event) { 
      if(!clicked) { 
       // click occurred outside 
      } 
     } 
    } 
Смежные вопросы