javascript - contenteditable 中的自动链接 URL

标签 javascript range selection

当用户在可内容编辑的 div 中完成输入 URL 时,我想自动链接它,就像 Medium 那样:http://d.pr/i/DsZH+ ).

我想知道如何使用选择/范围实现这一点(我不需要支持 IE,只需要现代版本的 Chrome、Firefox 和 Safari),如果可能的话没有 rangy(但如果这是唯一的解决方案我会用它)。

在用户按下空格键后,我能够检测到 URL 是否在插入符号之前,但我无法让 execcommand('createLink'...) 在我的范围内工作。

这是一个非常简化的示例 ( jsfiddle ),其中我尝试在用户按下空格键后将插入符前面的 4 个字符设置为粗体格式:

$("#editor").on("keypress", function(event) {
  var pressedChar = String.fromCharCode(event.which);
  if(/\s/.test(pressedChar)) {
    var selection   = window.getSelection();
    var range       = selection.getRangeAt(0);
    range.setStart(range.startContainer, range.startOffset - 4);

    selection.removeAllRanges();
    selection.addRange(range);
    document.execCommand('bold', false);
  }
}

当我输入几个字符然后输入一个空格时,前面的 4 个字符没有按照我的意愿设置为粗体,它们只是从 div 中消失,只有我之后输入的新字符是粗体。

最佳答案

终于找到了一个解决方法,不使用 execCommand:

  1. 删除范围内容:range.deleteContents()
  2. 创建我要插入的链接节点
  3. 在范围内插入节点:range.insertNode(createdLinkNode)
  4. 将插入符放在插入的节点之后:

range.setStartAfter(createdLinkNode);
range.setEndAfter(createdLinkNode);
selection.removeAllRanges();
selection.addRange(range);

关于javascript - contenteditable 中的自动链接 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20127418/

相关文章:

javascript - 为什么脚本类型前面有 "text/"?

javascript - ng-Repeat 堆叠卡片

Javascript:使用 crypto.getRandomValues 生成一个范围内的随机数

jquery - removeAttr ("selected") 在 IE6 中显示错误

CSS::selection,背景仍然是蓝色

javascript - 在 HTML angularjs 中显示字符串

javascript - 从多个 GeoJSON 字符串创建 FeatureCollection

python - 修改for循环中的范围变量(python)

mysql用范围过滤一列中的多个json数据

checkbox - Primefaces 树复选框单选