Javascript 在Firefox中,修改从所选内容克隆的范围会在第一次清除所选内容 var是_gecko=/gecko/i.test(navigator.userAgent); var是_ie=/MSIE/.test(navigator.userAgent); 函数insertNodeAtSelStart() { 如果(是壁虎) { var S=window.getSelection(); 如果(!S.isCollapsed) { var R=S.getRangeAt(0); var R1=R.cloneRange(); var NN=document.createElement(“startMarker”); R1.插入节点(NN); NN.parentNode.removeChild(NN); } } 如果(是) { //IE特定代码 } } 123

Javascript 在Firefox中,修改从所选内容克隆的范围会在第一次清除所选内容 var是_gecko=/gecko/i.test(navigator.userAgent); var是_ie=/MSIE/.test(navigator.userAgent); 函数insertNodeAtSelStart() { 如果(是壁虎) { var S=window.getSelection(); 如果(!S.isCollapsed) { var R=S.getRangeAt(0); var R1=R.cloneRange(); var NN=document.createElement(“startMarker”); R1.插入节点(NN); NN.parentNode.removeChild(NN); } } 如果(是) { //IE特定代码 } } 123,javascript,firefox,Javascript,Firefox,在加载页面并选择一些文本后,我第一次单击按钮时,Firefox会清除所选内容。后来,它没有。这是我的代码中的错误还是Firefox中的错误?当您成功地将节点插入其起始点时,Firefox会清除选择 对我来说,第二次单击(取决于选择的文本范围)有时会失败: <script> var is_gecko = /gecko/i.test(navigator.userAgent); var is_ie = /MSIE/.test(navigator.userAgent);

在加载页面并选择一些文本后,我第一次单击按钮时,Firefox会清除所选内容。后来,它没有。这是我的代码中的错误还是Firefox中的错误?

当您成功地将节点插入其起始点时,Firefox会清除选择

对我来说,第二次单击(取决于选择的文本范围)有时会失败:

<script>
    var is_gecko = /gecko/i.test(navigator.userAgent);
    var is_ie    = /MSIE/.test(navigator.userAgent);

    function insertNodeAtSelStart()
    {
        if(is_gecko)
        {
            var S = window.getSelection();
            if(!S.isCollapsed)
            {
                var R = S.getRangeAt(0);
                var R1 = R.cloneRange();
                var NN = document.createElement("startMarker");
                R1.insertNode(NN);
                NN.parentNode.removeChild(NN);
            }
        }

        if(is_ie)
        {
            // IE-specific code
        }
    }
</script>

<div>
    <span>one two three</span>
</div>

<input type="button" value="Insert node at selection start" onclick="insertNodeAtSelStart();" />
在insertNode调用上。由于插入不成功,因此未清除选择。想必这就是发生在你身上的事情 — 检查您的错误控制台

此故障似乎确实是Firefox的错误。我不能完全追踪触发它的确切条件,但这与选择中的节点边界有关


我可以通过调用document.body.normalize()使您的示例始终有效(并清除所选内容),在按插入/删除循环分割后,将整个跨度内容返回到单个文本节点。

事实上,您偶然发现了一个丑陋的壁虎bug,该bug多年来一直在爬行:( 是的,最新的开发版本仍然存在这个缺陷

无论如何,如果您不想等待Mozilla的修复,一个更简单/更快的解决方法是在插入新节点之前折叠范围

为了符合要求,下面是用于测试代码的(某种程度上简化的)示例:

Error: uncaught exception: [Exception... "Index or size is negative or greater than the allowed amount"  code: "1" nsresult: "0x80530001 (NS_ERROR_DOM_INDEX_SIZE_ERR)"  location: "..."]

选择两个或多个字母,然后

如果(!window.getSelection) 抛出新错误(“MSIE,不欢迎您!”); var marker=document.createElement('span'); marker.style.color='#6C6'; marker.appendChild(document.createTextNode(“|”); 函数insertNodeAtSelStart(){ //window.getSelection().getRangeAt(0.insertNode)(marker.cloneNode(true)); var r=window.getSelection().getRangeAt(0); var n=标记克隆节点(真); r、 折叠(true);//Gecko的解决方法:( r、 insertNode(n);//Gecko有时(?!)会失败,出现NS\u错误\u DOM\u索引\u大小\u错误 } document.getElementById('butt').onclick=insertNodeAtSelStart;

OT,这不是“is gecko”,“is uNot uiE”更合适,因为此代码应该在除MSIE之外的所有浏览器上按预期运行;-)

谢谢。我的意见是,它不应该清除选择,而它第一次清除选择的事实是Firefox中的一个错误。我想,到此为止。选择崩溃是否是一个错误是有争议的;当然,当对所选内容进行更改时,其他应用程序也会做同样的事情。应该可以记住old选择范围,并在完成处理后将其设置回原来的范围。好的,我已经设法解决了如何记住旧的选择范围,然后再将其设置回原来的范围,这就足够了。谢谢。
<p id="para">select two or more letters, then </p>
<input id="butt" type="button" value="click me">
<script type="text/javascript">
  if (!window.getSelection)
    throw new Error("MSIE, you're not welcome!");

  var marker = document.createElement('span');
  marker.style.color = '#6C6';
  marker.appendChild(document.createTextNode('|'));

  function insertNodeAtSelStart() {
    // window.getSelection().getRangeAt(0).insertNode(marker.cloneNode(true));
    var r = window.getSelection().getRangeAt(0);
    var n = marker.cloneNode(true);
    r.collapse(true); // workaround for Gecko :(
    r.insertNode(n);  // Gecko sometimes(?!) fails with NS_ERROR_DOM_INDEX_SIZE_ERR
  }
  document.getElementById('butt').onclick = insertNodeAtSelStart;
</script>