由於內容是動態的,並且您提到您不能在創建父級時向其添加類,所以我認爲可以這樣做的唯一方法是觀察添加的任何新元素,然後綁定你的活動。
此功能將定期查找.infotip
類的任何元素,該類沒有我們的自定義events_bound
屬性。如果找到一個,它將添加該屬性,然後將鼠標事件綁定到父項。我已經包含了一個演示動態內容的小提琴。
//check for changes in the dom
setInterval(function() {
$('.infotip:not([events_bound])').each(function() {
//add attribute so that we don't re-bind to this element
$(this).attr('events_bound', true);
//now bind the events to the parent
$(this).parent().mouseenter(function() {
$(this).find(".infotip").addClass("active");
})
$(this).parent().mouseleave(function() {
$(this).find(".infotip").removeClass("active");
})
});
}, 500);
https://jsfiddle.net/ybrwv0c8/1/
當然,如果有什麼識別對父母,那最好的辦法是使用一個選擇你的on
。舉例來說,如果有一個動態生成的ID與像parent_13835723
標準的結構,你可以做一個部分屬性選擇像$('[id^=parent_]')
您可能還可以使用使用jQuery的:has
pseudoselector像這樣。但是,這會搜索所有後代中的元素,這可能無法正確工作,具體取決於DOM的結構。
$(document).on("mouseenter", ":has('.infotip')", function() {
$(this).children('.infotip').addClass("active");
});
$(document).on("mouseleave", ":has('.infotip')", function() {
$(this).children('.infotip').removeClass("active");
});
然而,根據jQuery的文檔這裏http://api.jquery.com/has-selector/:
表達$("div:has(p)")
匹配<div>
如果<p>
存在其後代中的任何地方 ,不只是作爲一個直接的孩子。
因爲:具有()是一個jQuery擴展且不部分CSS 說明書,使用查詢:具有()不能利用由本機DOM querySelectorAll() 方法提供的 性能提升。爲了在現代瀏覽器中獲得更好的性能,請改爲使用$( "your-pure-css-selector").has(selector/DOMElement)
。
我不確定:has
或setInterval
方法是否會有更好的性能。
試着給父母上課 –
@JoãoPedro這不是一個選項。正如我在答覆中所說的那樣,它是動態的,可能無法控制父母。 – DCdaz
你能否用你的html代碼添加一個例子來完全理解你想要實現的功能。 – andybeli