2011-03-24 45 views
4

鑑於簡化文件這樣鼓泡的元素:確定哪些事件已經穿過

<div id="outerDiv"> 
    <div id="innerDiv"> 
     <input id="theInput" /> 
    </div> 
</div> 

如果我點擊#theInput,點擊事件將冒泡至#innerDiv然後#outerDiv。我想要做的就是在#outerDiv上放置一個處理程序來監聽這些點擊,然後檢查「泡沫鏈」以查看哪些元素先前已收到相同的點擊事件。

因此,例如,點擊#theInput#outerDiv的處理程序會給我[#outerDiv, #innerDiv, #theInput]。如果我的#theInput之外點擊,但還在裏面#innerDiv那麼結果將是[#outerDiv, #innerDiv]

只是爲了澄清,實際的文件不是如此簡單,而且有可能在各自爲任何數量的子女或兄弟姐妹水平。另外,當我參考#theInput時,我指的是元素本身,也就是說,我沒有在尋找一個ID數組。最後,考慮到可能有任何數量的元素,我想避免爲中間元素添加額外的處理程序。

jQuery歡迎在我的房子裏。

+1

難道你不能只從事件目標獲得「.parents()」列表嗎? – Pointy 2011-03-24 14:09:13

回答

7

好像:

function myHandler(ev) { 
    var $bubbleParents = $(ev.target).parents(); 

    // ... 
} 

是你所需要的,ESP。如果您使用的是jQuery,並且事件處理程序將this綁定到與處理程序代碼相關的元素。來自目標的父母名單將告訴您該事件可能會冒泡的所有元素,並且您的參考將成爲該列表中的元素之一。 (我想認爲父母的列表是「內部到外部」的順序,但我必須檢查小提琴。)因此,您可以分辨哪些元素已被「訪問」,哪些沒有。

+0

+1 JSfiddle證明它http://jsfiddle.net/loktar/GPSQ3/ – Loktar 2011-03-24 14:19:19

+0

你有時知道,當你有這些「duhhhhh」時刻之一?是的,那就是我。 – nickf 2011-03-24 14:22:12

+0

如果事件目標在觸發事件後但事件完成冒泡之前已從DOM中刪除,則這不起作用。 任何想法如何實現? – spinningarrow 2015-09-10 05:32:56

1

使用事件對象,使用目標來找出click元素。從那裏你可以使用jQuery中的parents()函數來查找鏈中的所有父母。

var parents; 
handler = function(e){ 
// specifying the limit node in parents 
parents = $(e.target).parents("#outerDiv"); 
}; 
0
$('outerDiv').bind('click', function(e) { 
    var current = e.target; 
    var arrayClicked = new Array(); 
    arrayClicked[] = current; 
    function test() { 
     if(current.parent() == $('.outerDiv')) { 
      return arrayClicked; 
     } else { 
      arrayClicked[] = current; 
      current = current.parent(); 
      test(); 
     } 
    } 
    var yourdivs = test(); 
}); 
+0

$(e.target).parents()。和Self() – Mansiemans 2013-09-11 08:33:30

相關問題