简体   繁体   English

在contenteditable div中的span元素后面设置光标

[英]Set cursor after span element inside contenteditable div

How can I set the cursor after a span element inside an contenteditable div? 如何在一个contenteditable div中的span元素之后设置光标? Right now, I've an image inside a span element, inside the contenteditable div. 现在,我在一个span元素里面有一个图像,在contenteditable div中。

When I add some characters, they are added inside the span, but I want them to be added after the span element. 当我添加一些字符时,它们会添加到span中,但是我希望它们在span元素之后添加。 Any ideas how I can achieve this? 我有什么想法可以达到这个目的吗?

In browsers other than IE <= 8, this will do it: 在IE <= 8以外的浏览器中,这样做:

function placeCaretAfterNode(node) {
    if (typeof window.getSelection != "undefined") {
        var range = document.createRange();
        range.setStartAfter(node);
        range.collapse(true);
        var selection = window.getSelection();
        selection.removeAllRanges();
        selection.addRange(range);
    }
}

However, some browsers (notably WebKit-based ones) have fixed ideas about which positions in the document are valid for the caret and will normalize any range you add to the selection to comply with those ideas. 但是,某些浏览器(特别是基于WebKit的浏览器)已经确定了文档中哪些位置对插入符有效,并将规范化您添加到选择中的任何范围以符合这些想法。 The following example will do what you want in Firefox and IE 9 but not in Chrome or Safari as a result: 以下示例将在Firefox和IE 9中执行您想要的操作,但不会在Chrome或Safari中执行此操作:

http://jsfiddle.net/5dxwx/ http://jsfiddle.net/5dxwx/

None of the workarounds are good. 没有一种解决方法是好的。 Options include: 选项包括:

  • add a zero-width space character after the span and select it 在span后添加零宽度空格字符并选择它
  • use an <a> element instead of a <span> because WebKit makes an exception for <a> elements 使用<a>元素而不是<span>因为WebKit使<a>元素成为例外

This function manages what I had in mind: 这个功能管理我的想法:

<script type="text/javascript">
function pasteHtmlAtCaret(char) {
        var sel = rangy.getSelection();
        var range = sel.rangeCount ? sel.getRangeAt(0) : null;
        var parent;
        if (range) {
            var parentEl = document.createElement("span");
        jQuery(parentEl).addClass('char').addClass('latest');
            parentEl.appendChild(range.createContextualFragment(char));

            // Check if the cursor is at the end of the text in an existing span
            if (range.endContainer.nodeType == 3
            && (parent = range.endContainer.parentNode)
            && (parent.tagName == "SPAN")) {
            range.setStartAfter(parent);
            }
            range.insertNode(parentEl);
        if(jQuery(parentEl).parent().get(0).tagName.toLowerCase() == 'span'){
            var spanParent = jQuery(parentEl).parent('span');
            var parentEl = jQuery('<span class="char latest spanchild"></span>').insertAfter(spanParent).append(parentEl).get(0);
        }
        jQuery("span.spanchild").each(function(index, element){
            var content = jQuery(element).children('span.char').first().html();
            jQuery(element).children('span.char').remove();
            jQuery(element).html(content);
            jQuery(element).removeClass('spanchild');
        });
            range.setStartAfter(parentEl);
            rangy.getSelection().setSingleRange(range);
        jQuery(parentEl).removeClass('latest');
        }
}
</script>

只有span.contentEditable = false才能使Tim的解决方案正常工作;)

I managed to solve this problem using 'a' tag with &nbsp . 我设法解决使用的一个标签这个问题&nbsp Example :- "<a>"+ content/element you want to add +"</a>&nbsp;" 示例: - "<a>"+ content/element you want to add +"</a>&nbsp;"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM