javascript replace selection all browsers

前端 未结 2 758
甜味超标
甜味超标 2020-12-14 10:35

Is there a simple js function I can use to replace the current document\'s selection with some html of mine?

For instance say the document contains a

相关标签:
2条回答
  • 2020-12-14 11:25

    Yes. The following will do it in all major browsers, with an option to select the inserted content afterwards as requested in the comments (although this part is not implemented for IE <= 8):

    Live demo: http://jsfiddle.net/bXsWQ/147/

    Code:

    function replaceSelection(html, selectInserted) {
        var sel, range, fragment;
    
        if (typeof window.getSelection != "undefined") {
            // IE 9 and other non-IE browsers
            sel = window.getSelection();
    
            // Test that the Selection object contains at least one Range
            if (sel.getRangeAt && sel.rangeCount) {
                // Get the first Range (only Firefox supports more than one)
                range = window.getSelection().getRangeAt(0);
                range.deleteContents();
    
                // Create a DocumentFragment to insert and populate it with HTML
                // Need to test for the existence of range.createContextualFragment
                // because it's non-standard and IE 9 does not support it
                if (range.createContextualFragment) {
                    fragment = range.createContextualFragment(html);
                } else {
                    // In IE 9 we need to use innerHTML of a temporary element
                    var div = document.createElement("div"), child;
                    div.innerHTML = html;
                    fragment = document.createDocumentFragment();
                    while ( (child = div.firstChild) ) {
                        fragment.appendChild(child);
                    }
                }
                var firstInsertedNode = fragment.firstChild;
                var lastInsertedNode = fragment.lastChild;
                range.insertNode(fragment);
                if (selectInserted) {
                    if (firstInsertedNode) {
                        range.setStartBefore(firstInsertedNode);
                        range.setEndAfter(lastInsertedNode);
                    }
                    sel.removeAllRanges();
                    sel.addRange(range);
                }
            }
        } else if (document.selection && document.selection.type != "Control") {
            // IE 8 and below
            range = document.selection.createRange();
            range.pasteHTML(html);
        }
    }
    

    Example:

    replaceSelection('<span><font color="red">hoho</font></span>', true);
    
    0 讨论(0)
  • 2020-12-14 11:26

    You can use the Rangy library http://code.google.com/p/rangy/

    You can then do

    var sel = rangy.getSelection();
    var range = sel.getRangeAt(0);
    
    range.deleteContents();
    var node = range.createContextualFragment('<span><font color="red">hoho</font></span>');
    range.insertNode(node);
    
    0 讨论(0)
提交回复
热议问题