firefox中的选择和模糊事件

时间:2018-06-10 10:35:31

标签: firefox selection contenteditable blur

我为我糟糕的英语道歉。 我制作了一个简单的所见即所得文本编辑器,并在Firefox浏览器中遇到了问题。 如果焦点从contenteditable块中丢失,则该函数保存选择,以便稍后通过execCommand将操作应用于该选项。在IE11,EDGE,Chrome中一切都很好,保存选择,您可以稍后恢复。在Firefox中,如果通过单击另一个项目而失去焦点,则会保留此元素的选择,而不是与blur事件关联的元素。也就是说,事件以迟到的方式触发,并向Selection对象写入对所单击元素中范围的引用。只有当通过点击丢失焦点时才会出现这样的错误,通过点击TAB,一切都按预期工作。

以下是此错误的一个小示例。同样,问题出现在Firefox中。



function sel() {
     var selection;
     if (document.getSelection !== undefined) {
         selection = document.getSelection();
         if (selection.getRangeAt && selection.rangeCount) {
             console.log(selection.getRangeAt(0));
          }
      } else if (document.selection && document.selection.createRange) {
          console.log(document.selection.createRange());
      }
    };

    document.getElementById("c").addEventListener("blur", sel, { capture: true });

<div id="c" contenteditable="true" style="width: 300px; height: 300px; border : 1px solid black;">ccccc</div>
<div id="b" style="width: 300px; height: 300px; background-color: green;">bbbbb</div>

    
&#13;
&#13;
&#13;

我等待你的建议,谢谢你。

1 个答案:

答案 0 :(得分:0)

Firefox非常令人失望

            function bindBeforeBlur(dom, callback){
                dom.addEventListener('focus', function(){
                    document.addEventListener('mousedown', callback, {
                        once: true
                    })
                })
                dom.addEventListener('mousedown', function(e){
                    e.stopPropagation();
                })
                dom.addEventListener('keydown', function(e){
                    if(e.key === 'Tab'){
                        e.preventDefault();
                    }
                })
            }

            var editable = document.getElementById('editable');
            
            var lastRange;
            bindBeforeBlur(editable, function(e){
                lastRange = window.getSelection().getRangeAt(0);
            })

            editable.focus();

            document.getElementById('insert')
            .addEventListener('click', function(){
                var sel = window.getSelection();
                sel.removeAllRanges();
                sel.addRange(lastRange);
                document.execCommand('insertHTML', false, Date.now() + ' ');
            })
        <button id="insert">insert</button>
        <div id="editable" contenteditable="true" 
        style="height: 400px;width: 400px;background: #eee"></div>