jquery - jQuery .scrollLeft() 在我输入 contenteditable div 时不匹配
问题描述
编辑 在评论中,有人指出缺乏澄清。我正在构建一个文本编辑器。我最初使用包含所有文本的 contenteditable div,但意识到如果我希望它像编程编辑器那样更改特殊关键字的文本颜色,我需要使用更好的系统,因为大约 30-50 行后它会慢慢更改文本颜色。我本可以坚持前面提到的想法并让它发挥作用(更好),但我没有,而是转而采用将每条线路分开的想法。我目前将每一行拆分为一个新的 contenteditable div,并且每一行都位于父 div 中。显然这很复杂,但我实现了它并让所有自定义键功能正确执行它们最初所做的操作,例如使用键箭头向上、向下、向左和向右移动,允许添加和删除文本,甚至还实现了热键。在此过程中,我遇到了每行不允许水平滚动跟随您当前键入的位置的问题。下面列出的示例封装了我的问题,没有过多解释。我真的只需要下面的答案,从那里我相信我可以就使用答案或文本换行达成共识,并找出我的行号的调整解决方案。
最初的问题:
我有一个非常特殊的使用可编辑 div 的案例。在我的情况下,我有一个 contenteditable div,它.keydown()
可以防止默认设置,并且我添加了一个带有正在输入的字符的 span。
经验:
function captureKeys() {
// Let's focus on div
$("#editable-div").focus();
$("#editable-div").on('keydown', function(event) {
event.preventDefault(); // to stop the normal behavior **ISSUE**
var span = $(document.createElement('span'));
span.text(event.key);
$(this).append(span);
});
}
$(document).ready( captureKeys );
/* Need to stop the text wrap for the editable-div */
#editable-div {
white-space: nowrap;
overflow-x: auto;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<!DOCTYPE html>
<html lang="en">
<body>
<div id="editable-div" contenteditable=true>
<!-- This is where it dynamically puts in strings -->
</div>
</body>
</html>
现在这是一个粗略的例子,不像我的例子那样精致,但它明白了重点。当您输入时,div 不会跟随您当前输入的位置。事实上,你根本不动,因为默认行为被阻止了,这意味着它需要被写入。这是因为event.preventDefault();
在 key down 函数中。
我正在寻找解决方案来调整scrollLeft()
没有箭头键的默认行为!我为箭头键编写了自定义函数,因此默认行为不是一个选项。
任何帮助将不胜感激!
// This is not what I want
function captureKeys() {
// Let's focus on div
$("#editable-div").focus();
$("#editable-div").on('keydown', function(event) {
if ([37,38,39,40].includes(event.keyCode)) {
// Allowing the default behavior
} else {
event.preventDefault(); // to stop the normal behavior of everything but arrow-keys
var span = $(document.createElement('span'));
span.text(event.key);
$(this).append(span);
}
});
}
解决方案
推荐阅读
- python - Python 和 Pandas 似乎正在更改分配给变量的数据框,即使我没有明确更改变量
- python - 无法找出使用 apply lambda 在数据帧上实现 if 语句的正确方法
- mysql - MYSQL 如何将所有权限授予用户只对他创建的数据库?
- ubuntu - 使用 setuid 链接到共享库
- r - 根据唯一 ID 对数据进行分组,然后将其粘贴到同一行
- javascript - 在 Laravel Blade 中运行 javascript 时出现 ReferenceError
- git - 致命的:pathspec '.' 尝试 git rm 时没有匹配任何文件
- c - 如何确保以下功能没有过度分配?
- php - 数据正在通过 $http 发送到 php 文件,但 JSON 解码为空白或未定义?
- react-native - 谷歌课堂 API 的访问令牌表示它已授权课堂 api,但其余 api 返回请求缺少凭据