HTMLタグを削除しますが、innerHtmlは保持します


148

簡単なフォーマットを取り除く必要のある簡単なHTMLがあります。

A nice house was found in <b>Toronto</b>.

太字を削除する必要がありますが、文はそのままにしておきます。

これはjQueryでどのように可能ですか?

回答:


301
$('b').contents().unwrap();

これは、すべて選択し<b>、その後、要素を使用して.contents()のテキストコンテンツをターゲットに<b>そして.unwrap()その親削除する<b>要素を。


最高のパフォーマンスを得るには、常にネイティブにしてください。

var b = document.getElementsByTagName('b');

while(b.length) {
    var parent = b[ 0 ].parentNode;
    while( b[ 0 ].firstChild ) {
        parent.insertBefore(  b[ 0 ].firstChild, b[ 0 ] );
    }
     parent.removeChild( b[ 0 ] );
}

これは、ここで提供されているどのjQueryソリューションよりもはるかに高速です。


1
+1私はそこに座って、ほぼ同じ答えを書いてunwrap()いて、テキスト部分を取得する方法を思い出せませんでし.contents()た。
2010年

2
これは機能し.replacewith()ますが、余分なDOMトラバーサルがあるため、それに比べるとかなり遅くなり<b>ます。HTMLのみのタグの場合は、さらに速くなります。
Nick Craver

また、特定のスパンまたはフォントタグのラップを解除したい場合は、次のようにします。$( "。className font")。contents()。unwrap();
スティーブコクラン

HTMLが<div> abc </ div> abcの改行ではない場合 ブレークラインに<div>を使用する場合、どのように保持できますか?@ user113716
Hoa.Tran

1
ありがとう、これはとても役に立ちました。隣接するテキストノードをマージするためにparent.normalize()後に追加しましたparent.removeChild(...。これは、ページを継続的に変更する場合に役立ちました。
ジャスティンハリス

52

次の.replaceWith()ようにを使用することもできます。

$("b").replaceWith(function() { return $(this).contents(); });

または、それが単なる文字列であることがわかっている場合:

$("b").replaceWith(function() { return this.innerHTML; });

上記のいずれの方法ものコストよりはるかに高速であるため、多くの要素をアンラップする場合、これは大きな違いを生む可能があります.unwrap()


ニック、私もあなたの答えが本当に好きです。iPadアプリ(ローカルデータ)でこれを使用するタグ/テキストの量が少なく、パフォーマンスがそれほど重要ではないため、もう1つを選択しました。パーティックの答えは、私が維持するのが少し簡単です。2つの素晴らしい解決策で髪の毛を分けるが、私は1つだけのチェックを与えることができました。
Ian Vink 2010年

1
@ BahaiResearch.com-パフォーマンスが問題でない場合は、絶対にシンプルにしてください...後で気になる可能性のある人を見つけるために、これを提供します:)
Nick Craver

この例をテキストボックスで使用しようとしましたが、内部のコンテンツが評価したいhtmlタグであり、テキストとして表示されるだけではなかったので、それは私を殺していました。私は次のように使用することになりました:$( 'textarea')。replaceWith(function(){return $(this).val();});
サンプソンウィルサンプソン

13

内部のHTML要素を削除してテキストのみを返す最も簡単な方法は、 JQuery .text()関数です。

例:

var text = $('<p>A nice house was found in <b>Toronto</b></p>');

alert( text.html() );
//Outputs A nice house was found in <b>Toronto</b>

alert( text.text() );
////Outputs A nice house was found in Toronto

jsFiddleデモ


5

これはどう?

$("b").insertAdjacentHTML("afterend",$("b").innerHTML);
$("b").parentNode.removeChild($("b"));

1行目はbタグのHTMLコンテンツをタグの直後の場所にコピーしb、2行目はタグを削除しますbはDOMからタグを、コピーされたコンテンツのみを残します。

私は通常これを関数にラップして使いやすくしています:

function removeElementTags(element) {
   element.insertAdjacentHTML("afterend",element.innerHTML);
   element.parentNode.removeChild(element);
}

すべてのコードは実際には純粋なJavascriptであり、使用されている唯一のJQueryは、ターゲットにする要素を選択するものです( b最初の例のタグ)です。関数は単なるJS:Dです。

また見てください:


3
// For MSIE:
el.removeNode(false);

// Old js, w/o loops, using DocumentFragment:
function replaceWithContents (el) {
  if (el.parentElement) {
    if (el.childNodes.length) {
      var range = document.createRange();
      range.selectNodeContents(el);
      el.parentNode.replaceChild(range.extractContents(), el);
    } else {
      el.parentNode.removeChild(el);
    }
  }
}

// Modern es:
const replaceWithContents = (el) => {
  el.replaceWith(...el.childNodes);
};

// or just:
el.replaceWith(...el.childNodes);

// Today (2018) destructuring assignment works a little slower
// Modern es, using DocumentFragment.
// It may be faster than using ...rest
const replaceWithContents = (el) => {
  if (el.parentElement) {
    if (el.childNodes.length) {
      const range = document.createRange();
      range.selectNodeContents(el);
      el.replaceWith(range.extractContents());
    } else {
      el.remove();
    }
  }
};

1

別のネイティブソリューション(コーヒー):

el = document.getElementsByTagName 'b'

docFrag = document.createDocumentFragment()
docFrag.appendChild el.firstChild while el.childNodes.length

el.parentNode.replaceChild docFrag, el

user113716のソリューションよりも高速かどうかはわかりませんが、一部のユーザーにとっては理解しやすいかもしれません。


1

最も簡単な答えは心を吹き飛ばすことです:

outerHTMLInternet Explorer 4までサポートされています!

ここでは、jQueryがなくてもjavascriptでそれを行うことです

function unwrap(selector) {
    var nodelist = document.querySelectorAll(selector);
    Array.prototype.forEach.call(nodelist, function(item,i){
        item.outerHTML = item.innerHTML; // or item.innerText if you want to remove all inner html tags 
    })
}

unwrap('b')

これは古いIEを含むすべての主要なブラウザで動作するはずです。最近のブラウザでは、ノードリストでforEachを呼び出すこともできます。

function unwrap(selector) {
    document.querySelectorAll('b').forEach( (item,i) => {
        item.outerHTML = item.innerText;
    } )
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.