Element.prototype.setTagName=function(strTN) {
var oHTML=this.outerHTML, tempTag=document.createElement(strTN); //document.createElement will fire an error if string has wrong characters.
var tName={original: this.tagName.toUpperCase(), change: strTN.toUpperCase()}
if (tName.original == tName.change) return;
oHTML=oHTML.replace(RegExp("(^\<" + tName.original + ")|(" + tName.original + "\>$)","gi"), function(x){return (x.toUpperCase().replace(tName.original, tName.change));});
tempTag.innerHTML=oHTML;
this.parentElement.replaceChild(tempTag.firstChild,this);
}
使用します(ボディの最初の要素のスパンを設定する場合):
document.body.firstElementChild.setTagName("SPAN");
編集:
何か言い忘れました。新しい要素が作成されるため、元の要素が変数に格納されている場合、変数は古い (変更されていない) 要素を格納します。Element に親 Element がない場合、失敗します。
それが私が新しいものを作った理由です:
Element.prototype.spawn = function(strTN = "spawn") {
let tName = ({original: this.tagName.toUpperCase(), change: strTN.toUpperCase()}); if (tName.original == tName.change) { return; }
let fragment = document.createRange().createContextualFragment(this.outerHTML.replace(new RegExp("(^\<\\b" + tName.original + "\\b)|(\\b" + tName.original + "\\b\>$)","gi"), function(x){return(x.toUpperCase().replace(tName.original, tName.change));}));
return(fragment.firstChild);
}
これは元のすべての子孫を含む新しい Element を作成するだけですが、必要に応じて手動で DOM に配置する必要があります。
var e = document.body.firstElementChild;
e.replaceWith(e.spawn("i"));