Search code examples
javascriptjquerycontenteditableexeccommandrangy

Set anchor name with execCommand


I know how to set an <a /> tag with the href attribute in a contenteditable like this:

execCommand("CreateLink", false, "#jumpmark");

which will result in

<a href="#jumpmark">selection</a>

However I cannot figure out how to set an anchor name instead of the href.
This is my desired result:

<a name="jumpmark">selection</a>

Can anyone help me?

Side notes: I am using jQuery and Rangy as libraries, however I would prefer a solution that works directly with execCommand.

Update: Here's a jsfiddle: http://jsfiddle.net/fjYHr/ Select some text and click the button. All I want is that with the button click a link is inserted with a name attribute set instead of the href.


Solution

  • You could use something like the following, which is adapted from the pasteHtmlAtCaret() function from this answer of mine:

    Demo: http://jsfiddle.net/F8Zny/

    Code:

    function surroundSelectedText(element) {
        var sel, range;
        if (window.getSelection) {
            // IE9 and non-IE
            sel = window.getSelection();
            if (sel.getRangeAt && sel.rangeCount) {
                range = sel.getRangeAt(0);
                element.appendChild( document.createTextNode(range.toString()) );
                range.deleteContents();
                range.insertNode(element);
    
                // Preserve the selection
                range = range.cloneRange();
                range.setStartAfter(element);
                range.collapse(true);
                sel.removeAllRanges();
                sel.addRange(range);
            }
        } else if (document.selection && document.selection.type != "Control") {
            // IE < 9
            var selRange = document.selection.createRange();
            element.appendChild( document.createTextNode(selRange.text) );
            selRange.pasteHTML(element.outerHTML);
        }
    }
    

    If you must use document.execCommand() then you could use the InsertHTML command in non-IE browsers. However, IE does not support it.

    document.execCommand("InsertHTML", false, '<a name="jumpmark">selection</a>');