Rangy replace parent
Rangy replace parent
我已经尝试了无数种方法来使用range,下面是我最接近的方法。在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]
BUT in 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,我将永远感激。
这是浏览器不一致。在我看来,这并不坏,因为在任何一种情况下,选择都是合理的,但它仍然是不一致的。最简单的解决方法是创建一个显式选择文本节点的范围,在所有主流浏览器中将其添加到选择项中后,它将保持不变。而不是
rangy.getSelection().selectAllChildren(newParent);
…我建议
var newRange = rangy.createRange();
newRange.setStart(newParent.firstChild, 0);
var lastChild = newParent.lastChild;
newRange.setEnd(lastChild,
lastChild.nodeType == 3 ? lastChild.length : lastChild.childNodes.length);
rangy.getSelection().setSingleRange(newRange);
问题是WebKit在将范围添加到选项中时会对其进行修改。您创建的范围在所有浏览器中都是相同的,但在添加到选择项时,在某些浏览器中会发生改变,但Firefox不会。
相关文章:
- 替换变量时,JavaScript字符串replace()不起作用
- Javascript 如何强制 string.replace 不将我的字符串解释为正则表达式
- 如何在做PHP时在base64中动态编码;preg_ replace”;
- jQuery parent() in table
- 我使用了replace(“[^-A-Za-z0-9()%.],但它为'我可以解决这个错误吗
- Regex Replace仅适用于Last Match
- toFixed and replace dons'这似乎奏效了
- Replace()产生“;未捕获的类型错误:未定义的不是函数“;当与零一起使用时
- 调用replace()中的ajax函数
- iFrame parent node
- 在AJAX中使用window.location.replace'成功'回调
- 如何在javascript中使用string.replace.将匹配字符串开头的两个不同表达式替换为null
- Javascript TypeError:$(..)parent不是函数
- parent和iframe中的Bootstrap.js文件
- 为什么我会得到错误“;未捕获的类型错误:st.replace不是函数;
- How can I get and replace this in javascript ( jquery?
- Replace a "href" element with javascript
- 字符串中的javascript replace()
- Rangy replace parent
- window.parent.location.replace(document.URLUnencoded) in asp