2013-10-29 25 views
-1

給出一個doucment像這樣:jQuery的。對適用於所有中間節點

<body><div class="a"><div class="b"><div class="c"></div></div></div></body> 

(在本例中一切都是一個div - 但他們可以是任何東西)

我想運行一個單擊事件處理程序,它被點擊和所有父母的

也就是說,如果你點擊.c我期望的事件觸發的.c然後.b然後.a 如果你點擊0 DIV然後該事件應該引發.b然後.a

N.B.在這種情況下,我使用$('body').on('click', function(event){...}) 使用$('div').click(function(event){...})在我的例子中不是一個實際的選項,因爲與問題無關的原因。

我試着從事件處理程序中運行dom樹,但事件對象包含錯誤的偏移量。

所以我的問題真的是 - 是否有一個內置的方式來使用上述模式調用事件處理程序。

或者失敗 - 是否有內置的方式來處理給定「from」和「to」元素的事件對象的偏移量。 即類似AdjustOffsets(event, $target, $target.parent())

或者失敗 - 我需要什麼邏輯才能手動執行此操作。

在最後的情況下,我有這個代碼,但它不起作用。

if ($target.css('position') != 'static' && $target.css('position') != '') 
    { 
     event.clientX += $target.css('left'); 
     event.clientY += $target.css('top'); 
    } 
    event.clientX += $target.css('borderLeftWidth'); 
    event.clientY += $target.css('borderTopWidth'); 
    event.clientX += $target.css('marginLeft'); 
    event.clientY += $target.css('marginTop'); 
    $target = $target.parent(); 
    event.clientX += $target.css('paddingLeft'); 
    event.clientY += $target.css('paddingTop'); 

由於css屬性包含單位,因此失敗。 單位很容易被剝離,但我相信有些瀏覽器會返回原始單位(例如empt),而clientX屬性必須是像素 - 因此轉換是必要的。

此外,這也是我的最佳猜測,可能會遺漏一千個模糊的css3案例 - 因此我對某種內置方法有着雄心勃勃的渴望。

回答

0

我不太清楚你的問題是什麼。當您點擊div.c時,您是否希望點擊事件觸發例如div.a?如果是這樣。這應該已經發生,因爲默認點擊事件會通過DOM進行泡泡。

看看這個fiddle,你會發現如果你點擊div.c,點擊事件div.bdiv.a也會被觸發。

編輯:fiddle,只有1 on()

+0

我想要一個電話來.on來處理所有這些事件 – DJL

+0

嗨DJL,我剛剛編輯我的答案。 – LuudJacobs

+0

好吧,所以現在這隻適用於div,但我實際上需要它適用於任何類型的元素。將此更改爲*會導致大文件大幅減速? (有問題的文件可能很大)。 因此,爲什麼我將它應用於身體(我的原始問題中的錯誤會被瞬間糾正) – DJL

0

你可以嘗試遞歸觸發事件處理程序中,像這樣:

$(document).on('click', '.someClass', function(e){ 

    // .. do stuff 

    $(this).parent('.someClass').trigger('click'); 
}); 
+0

將使用此事件對象上正確的偏移? – DJL

+0

以上將級聯執行給定結構的事件處理程序。按照偏移量,我認爲你的意思是指針位置?爲什麼這是相關的?你沒有在你的問題中指定這個。 –

+0

我在我的問題中提到了廣泛的偏移量! clientX/Y screenX/Y offsetX/Y pageX/Y – DJL

相關問題