【问题标题】:setting caret (cursor) inside bold element present inside contenteditable paragraph在 contenteditable 段落内的粗体元素内设置插入符号(光标)
【发布时间】:2017-11-06 15:51:56
【问题描述】:

我一直在尝试构建一个基于 Web 的文本编辑器。作为该过程的一部分,我正在尝试动态创建和修改基于元素的按键事件以进行字体编辑。在这个特定的jsfiddle 示例中,我试图在按下 CTRL+b 并在强元素内设置焦点/插入符号时创建一个强元素,以便后续输入的文本将成为粗体元素的一部分,因此将具有粗体文本。但是我的代码只是创建了一个强大的元素,但没有转移焦点,因此没有文本变得更粗。

在下面的代码中,我正在创建事件侦听器来捕获击键事件

p=document.getElementsByTagName("p")[0];

//console.log(p)

// adding eventlistener for keydown
p.addEventListener("keydown",listener);

// eventlistenerr callback function
function listener(){
  e=window.event;
  if(e.ctrlKey && e.keyCode==66)
    {
      console.log("CTRL+B");

      // creating bold element
      belm=document.createElement("strong");
      belm.setAttribute("contenteditable","true")
      p.appendChild(belm);

      //bug below
      // setting focus inside bold element
      setfocus(belm,0);
      e.preventDefault();
    }
}

这里是设置焦点的功能。

function setfocus(context, position){
    var range = document.createRange();
    position =position || 0;
    var sel = window.getSelection();
    range.setStart(context, position);
    range.collapse(true);
    sel.removeAllRanges();
    sel.addRange(range);
    context.focus();
}

但是,我毫不怀疑设置焦点的功能有问题,因为如果您观察到小提琴,我已经创建了一个单独的设置来测试这个 出去。单击“单击此处”按钮,焦点动态转移到段落元素,没有任何麻烦。我无法弄清楚出了什么问题。

【问题讨论】:

    标签: javascript jquery html contenteditable rich-text-editor


    【解决方案1】:

    几乎不可能将光标移动到内容可编辑 div 中的空元素中。但是,正如 shay levi 在另一篇文章中所建议的那样,您可以将零宽度字符 &#200B 插入到您的空元素中以赋予它一个索引值。

    这是一个例子*:

    function insertNode(nodeName) {
      var sel = window.getSelection(),
        range;
      range = sel.getRangeAt(0);
      range.deleteContents();
    
      var child = document.createElement(nodeName);
      child.innerHTML = '​';
      range.insertNode(child);
    }
    
    var div = document.querySelector('div'),
      btn = document.querySelector('button');
    
    btn.addEventListener('click', function() {
      insertNode('strong');
      div.focus();
    });
    
    div.focus();
    <div contenteditable></div><button><strong>B</strong></button>

    *为简单起见,此脚本不会切换粗体文本,它只会设置它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-26
      • 2011-05-03
      • 1970-01-01
      • 2013-04-12
      • 2016-11-30
      • 2011-06-17
      • 1970-01-01
      相关资源
      最近更新 更多