2011-07-29 80 views
1

我有一個形象的畫廊,在畫廊每個項目都有我用它綁在我的後端,這樣我可以運行DB行動等我一個唯一的ID摘要問題'm使用數據屬性來保存每個圖像的父div上的'imageid',例如:data-imageid =「168」約DOM對象,如JavaScript值對象

圖像庫項目有很多嵌套div如此翻轉/單擊我發現我自己做很多以下爲了運行動作:

$(this).parent().parent().attr('data-imageid'); 

它不覺得像一個乾淨的解決方案或最好的性能明智。其他人如何處理?什麼是最好的解決方案?無論解決方案如何,這一定是每天解決的問題。

編輯:我知道我的主題行是模糊的,但它進一步說明了在哪裏我在這個問題的頭。

+0

這將是作爲'this.parentNode.parentNode.getAttribute(「數據圖像標識」)大大效率更高;'。 – RobG

+0

是否有一個原因,您不只是將數據元素放在圖像本身,而是您實際需要的數據元素 - 無論是作爲唯一的放置位置還是除父()。parent()之外。 – jfriend00

+0

@ friend00當我設計這個應用程序時,我不得不將它移動兩次,直接將它保存在我正在與之交互的元素上。現在它需要在兩個地方。希望有更好的方法。我更願意將DOM元素想象成一​​個類,其中所有的子元素都可以訪問類的'id'。我可能會使這個複雜化......或者可能使用一些Model實現? – captainill

回答

0

您可以指定一個標準去「達人」,所以如果你想要去到最近的股利或利或什麼的,要麼使用jQuery的.closest()或簡單高達()功能:

function upTo(el, tagName) { 
    tagName = tagName.toLowerCase(); 
    var el; 
    do { 
    el = el.parentNode; 
    if (el && el.tagName && el.tagName.toLowerCase() == tagName) { 
     return el; 
    } 
    } while (el) 
} 
+0

這正是父母([選擇器])對於 – ricick

+0

很酷。我不知道哪個是最快的。 – captainill

+0

看起來最接近可能是最好的選擇。 http://jsperf.com/closest-vs-parents-first/2 – captainill

0

這聽起來很像你的divitis的情況下。無論如何,你可以使用.parents([selector])和一個過濾器來使你的代碼不那麼冗長。例如

$(this).parents(".classOfDivContainingData").attr('data-imageid'); 

,或者您可以通過在初始加載父div的循環,以及數據屬性複製到「本」在你的例子。你有沒有原因爲什麼你不能在這裏設置屬性?

0

你可以試試這個

$(this).parents("[data-imageid]:first"); 
0

我會建議你使用附加屬性的元素:

<div data-imageid="367"> 
    <div> 
     <div data-parent-imageid="367"> 
     </div> 
    </div> 
</div> 

這樣就可以使動作只知道它觸發事件的元素。使用此解決方案,您不必關心元素的結構,將它們自由移動到DOM樹中,性能也會得到改善。