javascript – 在内容可编辑的div中设置光标位置

前端之家收集整理的这篇文章主要介绍了javascript – 在内容可编辑的div中设置光标位置前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
摘要

我试图实现这样的效果:当用户键入a(或[在内容可编辑的div中,第二个]或]时自动插入,并且插入符号位于两者之间,即(和)之间.

FIDDLE

键入–s的右侧,并查看它在第一行中的工作方式,而在第二行中不起作用.

我的努力:

我正在使用此代码(通过Tim Down)来突出显示文本的某些部分并设置光标位置.前者有效,但后者没有:(

  1. function getTextNodesIn(node) { // helper
  2. var textNodes = [];
  3. if (node.nodeType == 3) {
  4. textNodes.push(node);
  5. } else {
  6. var children = node.childNodes;
  7. for (var i = 0,len = children.length; i < len; ++i) {
  8. textNodes.push.apply(textNodes,getTextNodesIn(children[i]));
  9. }
  10. }
  11. return textNodes;
  12. }
  13.  
  14. function highlightText(el,start,end) { // main
  15. if (el.tagName === "DIV") { // content-editable div
  16. var range = document.createRange();
  17. range.selectNodeContents(el);
  18. var textNodes = getTextNodesIn(el);
  19. var foundStart = false;
  20. var charCount = 0,endCharCount;
  21.  
  22. for (var i = 0,textNode; textNode = textNodes[i++];) {
  23. endCharCount = charCount + textNode.length;
  24. if (!foundStart && start >= charCount && (start < endCharCount || (start == endCharCount && i < textNodes.length))) {
  25. range.setStart(textNode,start - charCount);
  26. foundStart = true;
  27. }
  28. if (foundStart && end <= endCharCount) {
  29. range.setEnd(textNode,end - charCount);
  30. break;
  31. }
  32. charCount = endCharCount;
  33. }
  34.  
  35. var sel = window.getSelection();
  36. sel.removeAllRanges();
  37. sel.addRange(range);
  38. } else { // textarea
  39. el.selectionStart = start;
  40. el.selectionEnd = end;
  41. }
  42. }

笔记:

>< div>将有子元素(主要是< br> s).
>使用vanilla JS只需要Chrome支持

我的问题:

>为什么上述功能不起作用?
>如何才能成功?

我花了几个小时搜索这个并没有发现任何有用的东西.有些是关于设置儿童div的开始或结束,但对我来说,它可以是任何位置,任何地方.

更新:

感谢大家终于finished development了!

解决方法

这是一个更简单的方法.有几点需要注意:

> keypress是唯一可以可靠地检测键入的字符的关键事件. keyup和keydown不会这样做.
>代码通过阻止keypress事件的默认操作来手动处理括号/括号的插入.
>使用DOM方法时,选择/插入符号很简单.
>这在IE< = 8中不起作用,它具有不同的范围和选择API.如果您需要支持这些浏览器,我建议您使用我自己的Rangy库.没有它可能,但我真的不想写额外的代码.

演示:

http://jsfiddle.net/HPeb2/

码:

  1. var editableEl = document.getElementById("editable");
  2. editableEl.addEventListener("keypress",function(e) {
  3. var charTyped = String.fromCharCode(e.which);
  4. if (charTyped == "{" || charTyped == "(") {
  5. // Handle this case ourselves
  6. e.preventDefault();
  7.  
  8. var sel = window.getSelection();
  9. if (sel.rangeCount > 0) {
  10. // First,delete the existing selection
  11. var range = sel.getRangeAt(0);
  12. range.deleteContents();
  13.  
  14. // Insert a text node at the caret containing the braces/parens
  15. var text = (charTyped == "{") ? "{}" : "()";
  16. var textNode = document.createTextNode(text);
  17. range.insertNode(textNode);
  18.  
  19. // Move the selection to the middle of the inserted text node
  20. range.setStart(textNode,1);
  21. range.setEnd(textNode,1);
  22. sel.removeAllRanges();
  23. sel.addRange(range);
  24. }
  25. }
  26. },false);

猜你在找的JavaScript相关文章