更新其中的 html 时光标跳转到代码标记的开头

Posted

技术标签:

【中文标题】更新其中的 html 时光标跳转到代码标记的开头【英文标题】:Cursor jumps to the start of code tag when updating html in it 【发布时间】:2016-01-19 03:53:42 【问题描述】:

当我输入我的代码标签并使用下面的脚本更新上下文时,它会不断将我的光标移动到代码框的开头。我该如何解决?

function HastTagLocation(Controll) 
  var controller = $('.' + Controll);
  controller.keyup(function() 

    // Get the code element.
    var e = $(this);
    // Get the text content.
    var text = e.text();
    // Replace the matches and wrap them with span tag.
    var text = text.replace(/(\![a-zA-Z]*)/g, '<span class="mark">$1</span>');
    // Set the html of the original element.
    e.html(text);

  );

;

$(document).ready(function() 
  HastTagLocation('form-control');
);
.hash 
  background-color: #808080;
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<code class="form-control" id="test" contenteditable="true" style="height: 100%; min-height: 100px"></code>

如何解决这个问题?

感谢您的时间和帮助。

更新

解决方案不是让光标跳到文本的末尾,而是让光标跳回到我上次写的东西

【问题讨论】:

http://***.com/questions/4233265/contenteditable-set-caret-at-the-end-of-the-text-cross-browser/4238971#4238971 【参考方案1】:

我认为一种解决方案是使用两种不同的元素,一种是您实际编写代码的地方,使用透明颜色或另一种隐藏其内容的方式,另一种是您实际显示您想要显示的内容。

希望这会有所帮助。

【讨论】:

【参考方案2】:

要使其工作,您可以使用input 事件而不是keyup(这样即使在按住键时它也会在每次输入后触发)。然后使用SelectionRange 对象相应地更改插入符号的位置。例如,Range 具有 setStartsetEnd 方法,可让您将 carret 移动到特定位置。

有关这些对象的更精确信息,请参阅:https://developer.mozilla.org/en-US/docs/Web/API/Range 和 https://developer.mozilla.org/en-US/docs/Web/API/Selection(请注意,这些对象上的某些功能仍处于试验阶段)

以下是使用您的代码的快速示例。 请注意,这不是完全可操作的,要使其正常工作,当感叹号生成元素时,您必须进行相应调整以使插入符号进入正确位置。您可能还必须处理特定键输入(如 SupprBackspace)与额外元素的交互。

function HastTagLocation(Controll) 
    var controller = $('.' + Controll);
    controller.on('input', function (evt) 
        // Storing the caret state
        var sel, range, start, end ;
        sel = window.getSelection();
        range = sel.getRangeAt(0);
        start = range.startOffset;
        end =  range.endOffset;

        // Get the code element.
        var e = $(this); 
        // Get the text content.
        
        var text = e.text();
        // Replace the matches and wrap them with span tag.
        var text = text.replace(/(\![a-zA-Z]*)/g, '<span class="mark">$1</span>');
        // Set the html of the original element.
        e.html(text);

        // restoring the caret
        range.setStart(this.childNodes[0], start);
        range.setEnd(this.childNodes[0], end);

    );

;

$(document).ready(function () 
        HastTagLocation('form-control');

    );
.hash 
    background-color:#808080;
<link href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" rel="stylesheet"/>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<code class="form-control" id="test" contenteditable="true" style="height: 100%; min-height: 100px"></code>

【讨论】:

以上是关于更新其中的 html 时光标跳转到代码标记的开头的主要内容,如果未能解决你的问题,请参考以下文章

怎么样在HTML页面上添加锚点啊?

idea打开多个工程代码不能跳转

a标记 跳转到 另一页面特定位置

angular ,ngRouter 新增了 路由以后 更新到测试环境 不能跳转到正确页面。而是跳转到第一个路由页面?

vue超链接跳转外部链接

Linux如何快速跳转到文档开头或者末尾