2013-03-07 149 views
6

內部HTML我有此DIV:jquery的刪除HTML元素(jquery對象)

<div class="teaser"> 
    <img src="thumb1.jpg"><img src="thumb2.jpg"><br> // usually one thumb image; can be up to three 
    some text goes here, sometimes not<br> 
    <a href="example.html">always a link here</a><br> 
    and sometimes another line here 
</div> 

我需要捕獲DIV減去在一個變量中的第一行(拇指)的含量,以傳作爲標題(標題)添加到燈箱腳本。然而,在一天,我學會了一些JavaScript的&的jQuery(都是我的弱點),但沒有我在網上搜索,其中包括幾個線程這裏計算器,做了它,要麼拋出錯誤或仍包括拇指發現或清除文字也一樣,甚至從DOM移除了大拇指:

// takes the whole 
var teaser = $(".teaser"); 

// TypeError: $(...).html(...).find is not a function 
var teaser = $(".teaser").find("img").remove(); 

// IMGs removed from DOM 
var teaser = $(".teaser").find("img").remove(); 

// IMGs still included; I think I understand why 
var teaser = $(".teaser").not("img"); 

// ditto 
var teaser = $(".teaser").clone().not("img"); 

// ditto: 
var teaser = $(".teaser"); 
$(teaser).find("img").remove(); 

// no teaser at all (everything removed, not just the IMGs) 
var teaser = $(".teaser"); 
teaser = $(teaser).find("img").remove(); 

// ditto 
var teaser = $(".teaser").clone().find("img").remove(); 

改變chainings序列時沒有工作,要麼(雖然我可能已經錯過了一個或其他)。

這種解決方法似乎是確定:

var teaser = $(".teaser").html().replace(/(<img.*?)+<br[^>]*?/i,""); 

然而,依賴於瀏覽器中的正則表達式實現它可能是不穩定的,所以我寧願有一些更穩健,特別是沒有得到第一線的。

TIA的任何建議 - 希望我能說清楚了。

編輯:

使用clone()連同children()contents()讓我進了一步。然而,這些也將刪除第一個文本節點,留下兩個空BR背後:

$("div.teaser").each(function() { 
    var teaser = $(this).clone().children().not("img"); 
    var teaser = $(this).clone().contents().not("img"); 
}); 

OTOH filter("img")find("img")not("img")其次remove()去除一切,但IMGS,這超出了我的頭,除了not()

var teaser = $(this).clone().find("img").remove(); 

編輯2:

爲了總結的東西了:

這是@karaxuna建議的解決方案。重新分配變量很重要。

var teaser = $(this).clone(); 
teaser.find("img,br:first").remove(); 
teaser = $.trim(teaser.html()); 

雖然做了一些進一步的閱讀,以便更好地理解失敗背後的邏輯和最終解決方案,我得到了一個線索做稍微更jquerish

var teaser = $(this).clone(); 
teaser = $.trim($("img,br:first",teaser).remove().end().html()); 

的線索範圍,或上下文,添加到$()選擇器。使用這裏爲大家熟悉,但它從來沒有想過我使用var。此外,end()將繼續remove()從一路還是要到DOM ...

$.trim技術上沒有必要,當然,HTML忽略空行呢。

因此包括與正則表達式以上的解決方法至少有三種方式去 - 有點讓我想起的Perl;)

由於雙方@karaxuna和@Ravi分享他們的經驗和想法!

回答

14

無需html()

var teaser = $(".teaser").find("img").remove(); 

編輯:

試試這個:

var teaser = $(".teaser").clone(); 
teaser.find("img").remove() 
// use teaser 
+0

你說得對的HTML()和我刪除它。這只是在replace()的解決方法中需要的。 – JayAitch 2013-03-07 15:38:03

+2

這完全消除了IMG。 'var teaser = $(「teaser」)。clone()。find(「img」)。remove();'保留IMG,但刪除文本(sic!)而var teaser = $(「teaser」) .clone()。not(「img」);'保留整個DIV(高於我的頭),使用'filter(「img」)'代替結果沒有標題(有意義)。 – JayAitch 2013-03-07 15:45:14

+0

@JayAitch查看問題編輯 – karaxuna 2013-03-07 16:41:14

0

如果你想刪除整個HTML。那麼你可以使用空()方法

$(".teaser").empty(); 

如果你只是刪除圖像。然後

$(".teaser").find("img").remove(); 
+0

@karaxuna @Ravi:謝謝,但是這些完全從DOM中移除IMG。我需要從'var teaser'中移除它們(或者首先不要在var中接收它們)。 – JayAitch 2013-03-07 12:16:56

0

現在已經晚了,但試試這個$('img',$('.teaser')).remove().end().clone()