我已经尝试过无数种使用 rangy 的方法,下面是我最接近的方法。在 chrome 和 IE8 中完美运行(就像我尝试过的许多其他版本一样),但 firefox 坚决拒绝玩球。
test() 函数应用于在选择页面上的一些粗体文本后单击的按钮。我想看到的是:
<b>blah</b> or <strong>blah</strong>
被替换为
<span style='font-weight:bold'>blah</span>
在 chrome 和 FF 中它可以工作,并且 console.log 行:
[WrappedRange("blah":0, "blah":4)] [object Text]
[WrappedRange("blah":0, "blah":4)] [object Text]
但是在FF中:
[WrappedRange("blah":0, "blah":4)] [object Text]
[WrappedRange(<SPAN>[1]:0, <SPAN>[1]:1)] [object HTMLSpanElement]
.
function test()
{
var sr=rangy.getSelection().getRangeAt(0);
var oldParent=sameTextParent(sr);
console.log(sr.inspect()+" "+sr.commonAncestorContainer);
if(oldParent)
{
var newParent=document.createElement("span");
newParent.style.fontWeight="bold";
newParent.appendChild(sr.cloneContents());
oldParent.parentNode.replaceChild(newParent,oldParent);
rangy.getSelection().selectAllChildren(newParent);
sr=rangy.getSelection().getRangeAt(0);
console.log(sr.inspect()+" "+sr.commonAncestorContainer);
}
}
function sameTextParent(r)
{
var s=r.startContainer,e=r.endContainer;
if(s.nodeType!=3||e.nodeType!=3){console.log("not TEXT node!");return null}
return (s.parentNode==e.parentNode)?s.parentNode:null;
}
如果有人可以向我展示我的方式的错误,以便它可以在 FF 中像在 IE8 和 chrome 中那样工作,我将永远感激不尽。