2013-03-07 304 views
3

我試圖找到一種純粹的角度方式來確定單擊的元素是否是另一個元素的子元素。在jQuery中,我會做(),但不知道在Angular中執行它的方式,除了遍歷所有的孩子並進行比較。Angular - 是其他元素的子元素

的jQuery:

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

你的用例是什麼? – 2013-03-07 23:48:21

+0

我正在記錄Bootstrap點擊(花哨的popover)插件。我需要確定是否點擊了正文,但請檢查它是否被單擊的彈出窗口本身。試圖在任何地方點擊並關閉功能。在上面的代碼'someelement'是元素彈出div - '另一個'是從身體點擊函數返回 - https://github.com/lecar-red/bootstrapx-clickover/blob/master/js/bootstrapx -clickover.js#L76 - 我沒有發現檢測到點擊的問題,但has()行讓我難堪。 – cyberwombat 2013-03-08 00:21:05

+0

爲什麼你不需要在'$ document'中添加點擊處理程序?這是如何下拉切換工程 - [檢查代碼](https://github.com/angular-ui/bootstrap/blob/master/src/dropdownToggle/dropdownToggle.js) - 它應該是超級簡單的(像兩行或三行代碼)將其添加到彈出式插件。 – 2013-03-08 00:31:13

回答

0

你可以去周圍的其他方式。

不要問B是否是A的孩子,你可以問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的邊界矩形的單擊事件的X和Y(這是一個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

一個小錯誤煩人的是,如果你的元素包含不影響它的寬/高這是行不通的其他元素。但你可以使用這個(稍微hacky)的解決方案

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 
      } 
     } 
    }