Vid*_*pta 5 html javascript css jquery selection-api
我需要根据鼠标移动找到输入字段中字符的位置。
例如:如果输入字段的值为“abcde”,并且我将鼠标移动到字符“a”上,则位置将为 1,“b”将为其他字符提供 2,依此类推。
我确实找到了一些与选择开始等一起使用的示例,但它们仅在插入符放置在某个位置然后找到放置的位置时才起作用。
我正在寻找的是 - 无论鼠标何时在字符上移动,输入字段中可能/可能不会单击 - 我能够知道鼠标悬停在其上的字符的位置。
我还没有想到如何将鼠标坐标分别转换为字符位置。有没有这样的 javascript API?
非常感谢任何帮助/指示/想法。
更新
我的最终目标是当拖动发生在 contenteditable div 上时自动移动插入符号。我发现以下链接询问了类似的问题 - 但到目前为止还没有建议的解决方案。
caret auto move - /sf/ask/867845471/#53660415
Run Code Online (Sandbox Code Playgroud)
我还添加了另一个示例来展示本机拖动与 jQuery 拖动的不同行为。我正在使用 jQuery Draggable,它不支持自动拖动插入符。
Jquery:您可以尝试Caret 插件(虽然我不确定这是否满足您的需求)您可以阅读jquery 页面,但它的信息不是很多!
JavaScript 解决方案:
我四处寻找现有的解决方案,但关于悬停/鼠标悬停,只发现了一种潜在的适应性解决方案。这段代码不是我的,它改编自我发现的 Carlos Delgado 的公共小提琴(我进行了改编,以便如果您将鼠标悬停在“显示位置”文本上,它将显示光标位置)。selectionStart它还演示了和的用法selectionEnd,因此如果选择文本,则会显示开始和结束位置。如果使用箭头键向前或向后移动光标,然后再次悬停,则会显示更新的光标位置。
function getInputSelection(el) {
var start = 0,
end = 0,
normalizedValue, range,
textInputRange, len, endRange;
if (typeof el.selectionStart == "number" && typeof el.selectionEnd == "number") {
start = el.selectionStart;
end = el.selectionEnd;
} else {
range = document.selection.createRange();
if (range && range.parentElement() == el) {
len = el.value.length;
normalizedValue = el.value.replace(/\r\n/g, "\n");
// Create a working TextRange that lives only in the input
textInputRange = el.createTextRange();
textInputRange.moveToBookmark(range.getBookmark());
// Check if the start and end of the selection are at the very end
// of the input, since moveStart/moveEnd doesn't return what we want
// in those cases
endRange = el.createTextRange();
endRange.collapse(false);
if (textInputRange.compareEndPoints("StartToEnd", endRange) > -1) {
start = end = len;
} else {
start = -textInputRange.moveStart("character", -len);
start += normalizedValue.slice(0, start).split("\n").length - 1;
if (textInputRange.compareEndPoints("EndToEnd", endRange) > -1) {
end = len;
} else {
end = -textInputRange.moveEnd("character", -len);
end += normalizedValue.slice(0, end).split("\n").length - 1;
}
}
}
}
return {
start: start,
end: end
};
}
document.getElementById("trigger").addEventListener("mouseover", function() {
var input = document.getElementById("texto");
var inputContent = input.value.length;
// You may want to focus the textbox in case it's not
input.focus();
var result = getInputSelection(input);
var resultSpan = document.getElementById("result");
if (result.start == result.end) {
resultSpan.innerHTML = "No text selected. Position of cursor is " + result.start + " of " + inputContent;
} else {
resultSpan.innerHTML = "You've selected text (" + result.start + " to " + result.end + ") from a total length of " + inputContent;
}
}, false);Run Code Online (Sandbox Code Playgroud)
#trigger{background:#ff8890;}Run Code Online (Sandbox Code Playgroud)
<p>
Get the cursor position in a textarea or a text input or the selected text.
</p><br>
<textarea id="texto"></textarea><br><br>
<input type="text" id="trigger" value="Show Position" size="10" /><br><br>
<span id="result"></span>Run Code Online (Sandbox Code Playgroud)
这个解决方案也可能有效:它显示控制台中的位置(也许这更好?)。如果需要的话你可以调整它。
document.getElementById('showpos').addEventListener('mouseenter', e => {
console.log('Caret at: ', e.target.selectionStart)
})Run Code Online (Sandbox Code Playgroud)
<input id="showpos" />Run Code Online (Sandbox Code Playgroud)
希望这些想法有帮助
雷切尔
| 归档时间: |
|
| 查看次数: |
1359 次 |
| 最近记录: |