私がこれを行う方法は、選択範囲内のノードを反復処理し、インライン ノードを削除することです (おそらく<br>
要素をそのままにしておきます)。便宜上、 Rangyライブラリを使用した例を次に示します。すべての主要なブラウザー (IE 6 を含む) で動作しますが、完全ではありません。たとえば、部分的に選択された書式要素は分割されません。つまり、部分的に選択された書式要素は、選択された部分だけではなく完全に削除されます。これを修正するのはもっと難しいでしょう。
デモ: http://jsfiddle.net/fQCZT/4/
コード:
var getComputedDisplay = (typeof window.getComputedStyle != "undefined") ?
function(el) {
return window.getComputedStyle(el, null).display;
} :
function(el) {
return el.currentStyle.display;
};
function replaceWithOwnChildren(el) {
var parent = el.parentNode;
while (el.hasChildNodes()) {
parent.insertBefore(el.firstChild, el);
}
parent.removeChild(el);
}
function removeSelectionFormatting() {
var sel = rangy.getSelection();
if (!sel.isCollapsed) {
for (var i = 0, range; i < sel.rangeCount; ++i) {
range = sel.getRangeAt(i);
// Split partially selected nodes
range.splitBoundaries();
// Get formatting elements. For this example, we'll count any
// element with display: inline, except <br>s.
var formattingEls = range.getNodes([1], function(el) {
return el.tagName != "BR" && getComputedDisplay(el) == "inline";
});
// Remove the formatting elements
for (var i = 0, el; el = formattingEls[i++]; ) {
replaceWithOwnChildren(el);
}
}
}
}