原文链接:js设置光标插入文字和HTML

在一个textarea的某个光标位置插入文字或者在某个编辑器中插入图片html内容,我最近经常和这些打交道,但总是一团模糊,今天整理一下关于如何插入文字,设置光标,移动光标等操作。

应用场景:新浪微博(网站留言本)中输入框某个位置插入表情、话题或者@ 某个人涉及到插入文本,重新设置光标位置。

代码一:在textarea某个位置插入文本

  1. function insertAtCursor(myField, myValue) {
  2. //IE support
  3. if (document.selection) {
  4. console.log('ie');
  5. myField.focus();
  6. sel = document.selection.createRange();
  7. sel.text = myValue;
  8. }
  9. //MOZILLA and others
  10. else if (myField.selectionStart || myField.selectionStart == '0') {
  11. console.log('modern');
  12. var startPos = myField.selectionStart;
  13. var endPos = myField.selectionEnd;
  14. myField.value = myField.value.substring(0, startPos)
  15. + myValue
  16. + myField.value.substring(endPos, myField.value.length);
  17. myField.selectionStart = startPos + myValue.length;
  18. myField.selectionEnd = startPos + myValue.length;
  19. } else {
  20. myField.value += myValue;
  21. }
  22. }

via演示 来源原文来自:http://caibaojian.com/js-insertcur.html

代码二:设置光标位置

  1. function setSelectionRange(input, selectionStart, selectionEnd) {
  2. //IE9 and non-IE
  3. if (input.setSelectionRange) {
  4. // console.log('IE9 and non-IE');
  5. input.focus();
  6. input.setSelectionRange(selectionStart, selectionEnd);
  7.  
  8. //IE < 9
  9. } else if (input.createTextRange) {
  10. // console.log('IE < 9');
  11. var range = input.createTextRange();
  12. range.collapse(true);
  13. range.moveEnd('character', selectionEnd);
  14. range.moveStart('character', selectionStart);
  15. range.select();
  16. }
  17. }
  18.  
  19. function setCaretToPos(input, pos) {
  20. setSelectionRange(input, pos, pos);
  21. }

演示 来源

jQuery版本

  1. $.fn.selectRange = function (start, end) {
  2. if (typeof end === 'undefined') {
  3. end = start;
  4. }
  5. return this.each(function () {
  6. if ('selectionStart' in this) {
  7. this.selectionStart = start;
  8. this.selectionEnd = end;
  9. } else if (this.setSelectionRange) {
  10. this.setSelectionRange(start, end);
  11. } else if (this.createTextRange) {
  12. var range = this.createTextRange();
  13. range.collapse(true);
  14. range.moveEnd('character', end);
  15. range.moveStart('character', start);
  16. range.select();
  17. }
  18. });
  19. };
  20. //使用
  21. $('#hw').selectRange(8);

演示 来源

代码三:获取光标位置

  1. function getCursorPos(input) {
  2. if ("selectionStart" in input && document.activeElement == input) {
  3. return {
  4. start: input.selectionStart,
  5. end: input.selectionEnd
  6. };
  7. }
  8. else if (input.createTextRange) {
  9. var sel = document.selection.createRange();
  10. if (sel.parentElement() === input) {
  11. var rng = input.createTextRange();
  12. rng.moveToBookmark(sel.getBookmark());
  13. for (var len = 0; rng.compareEndPoints("EndToStart", rng) > 0; rng.moveEnd("character", -1)) {
  14. len++;
  15. }
  16. rng.setEndPoint("StartToStart", input.createTextRange());
  17. for (var pos = { start: 0, end: len }; rng.compareEndPoints("EndToStart", rng) > 0; rng.moveEnd("character", -1)) {
  18. pos.start++;
  19. pos.end++;
  20. }
  21. return pos;
  22. }
  23. }
  24. return -1;
  25. }

演示 来源

代码四:在可编辑div或者iframe处插入HTML

  1. //code from http://caibaojian.com/js-insertcur.html
  2. function pasteHtmlAtCaret(html) {
  3. var sel, range;
  4. if (window.getSelection) {
  5. // IE9 and non-IE
  6. sel = window.getSelection();
  7. if (sel.getRangeAt && sel.rangeCount) {
  8. range = sel.getRangeAt(0);
  9. range.deleteContents();
  10.  
  11. // Range.createContextualFragment() would be useful here but is
  12. // only relatively recently standardized and is not supported in
  13. // some browsers (IE9, for one)
  14. var el = document.createElement("div");
  15. el.innerHTML = html;
  16. var frag = document.createDocumentFragment(), node, lastNode;
  17. while ( (node = el.firstChild) ) {
  18. lastNode = frag.appendChild(node);
  19. }
  20. range.insertNode(frag);
  21.  
  22. // Preserve the selection
  23. if (lastNode) {
  24. range = range.cloneRange();
  25. range.setStartAfter(lastNode);
  26. range.collapse(true);
  27. sel.removeAllRanges();
  28. sel.addRange(range);
  29. }
  30. }
  31. } else if (document.selection && document.selection.type != "Control") {
  32. // IE < 9
  33. document.selection.createRange().pasteHTML(html);
  34. }
  35. }

演示 来源

今天先写这些,后面再详细说说这些兼容性问题。

js设置光标插入文字和HTML的更多相关文章

  1. javascript实现在textarea光标位置插入文字并移动光标到文字末尾

    1.背景:实现在textarea光标位置插入文字并移动光标到文字末尾 如果每次通过val("ss")赋值的形式插入文字到textarea中,会将上一次赋的值覆盖掉. 2.思路: & ...

  2. textarea 在光标处插入文字

    效果演示 // 欢迎访问cssfirefly.cnblogs.com html: <textarea id="text" style="width:500px;he ...

  3. JQ在光标处插入文字

    内容转载自网络这是一个JQ的扩展方法.在teatarea获得焦点时,往光标处插入文字,扩展代码如下 (function($){ $.fn.extend({ "insert":fun ...

  4. word-如何将文字设置为插入超链接

    前言 使用word有时候想要将文字部分设置为插入超链接,本文对此进行介绍. 操作步骤 1. 输入需要插入链接的文字部分: 2. 选中文字部分单击右键,点击超链接进行插入: 具体操作如下图所示: 参考 ...

  5. js获取光标位置并插入内容

    先来几个网上找的参考资源,我爱互联网,互联网使我变得更加强大. https://blog.csdn.net/mafan121/article/details/78519348 详细篇,该作者很用心的解 ...

  6. JS获取和设置光标的位置

    <html> <head> <script language="javascript"> function getCursortPosition ...

  7. js获取光标位置

    js获取光标位置   var TT = { /* * 获取光标位置 * @Method getCursorPosition * @param t element * @return number */ ...

  8. javascript获取以及设置光标位置

    一. 获取光标位置: // 获取光标位置 function getCursortPosition (textDom) { var cursorPos = 0; if (document.selecti ...

  9. 使用C#模拟键盘输入、鼠标移动和点击、设置光标位置及控制应用程序的显示

    1.模拟键盘输入(SendKeys) 功能:将一个或多个按键消息发送到活动窗口,就如同在键盘上进行输入一样. 语法:SendKeys.Send(string keys);SendKeys.SendWa ...

随机推荐

  1. linux对文件赋权限的命令chmod的详细说明

    指令名称 : chmod使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案调 ...

  2. 话谈C#第二天

    今天做了几个小小的练习,和大家分享一下. 1.用*打印出等腰三角形,代码如下: static void Main(string[] args) { int n = 5; for (int i = 1; ...

  3. 在vue项目中使用swiper2.7.6

    $ npm install swiper@2.7.6 --save-dev npm WARN rollback Rolling back node-pre-gyp@0.10.0 failed (thi ...

  4. c++之sleep函数

    c++之sleep函数 c++中使用sleep函数需要导入第三方库,标准库中没有该函数实现. 我们导入window.h使用Sleep()方法,注意:第一个S要大写,括号中的表示的整数倍的毫秒 Slee ...

  5. 8.在XamarinAndroid上进一步控制包的大小

    在Android上链接 Xamarin.Android应用程序使用链接器来减小应用程序的大小.链接器使用应用程序的静态分析来确定哪些程序集.类型.成员被实际使用.链接器的行为就像一个GC,不断寻找被引 ...

  6. javascript中的浅拷贝和深拷贝 分类: JavaScript 2015-05-07 15:29 831人阅读 评论(1) 收藏

    1.js对象浅拷贝 简单的赋值就是浅拷贝.因为对象和数组在赋值的时候都是引用传递.赋值的时候只是传递一个指针. 看下面的实例代码: var a = [1,2,3]; var b =a ; var te ...

  7. Android 开发工具类 17_setAlarm

    Alarm 是在应用程序生命周期之外设置的,所以它们十分适合于调度定时更新或者数据查询,从而避免了在后台持续运行 Service.但触发 Alarm 时,就会广播指定的 Pending Intent. ...

  8. xgboost使用

    xgboost的实现方式为多颗CART树,其实xgboost就是类似于随机森林,但是与随机森林不同,他不是多个子树决策的结果,CART树最后会算出一个得分,是一个值,最后算出分类的时候,是多个值结合在 ...

  9. 1-hadoop中遇到的各种异常

    本贴记录学习hadoop中遇到的各种异常, 包括推荐系统分类下的和本分类下的, 持续更新 1, 搭建ha时, active和standy之间不能自由切换 经检查, 配置文件错误, 私钥配置 root ...

  10. springboot 常用插件

    热部署 使用run as -java application, 把spring-loader-1.2.4.RELEASE.jar下载下来,放到项目的lib目录中,然后把IDEA的run参数里VM参数设 ...