回答:
$('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ソリューションよりもはるかに高速です。
.replacewith()
ますが、余分なDOMトラバーサルがあるため、それに比べるとかなり遅くなり<b>
ます。HTMLのみのタグの場合は、さらに速くなります。
parent.normalize()
後に追加しましたparent.removeChild(...
。これは、ページを継続的に変更する場合に役立ちました。
次の.replaceWith()
ようにを使用することもできます。
$("b").replaceWith(function() { return $(this).contents(); });
または、それが単なる文字列であることがわかっている場合:
$("b").replaceWith(function() { return this.innerHTML; });
上記のいずれの方法ものコストよりもはるかに高速であるため、多くの要素をアンラップする場合、これは大きな違いを生む可能性があります.unwrap()
。
内部の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
これはどう?
$("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です。
また見てください:
// 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();
}
}
};
最も簡単な答えは心を吹き飛ばすことです:
ここでは、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;
} )
}
unwrap()
いて、テキスト部分を取得する方法を思い出せませんでし.contents()
た。