我希望您能提供一份纯粹的 JavaScript 解决方案,因为它反映了我的项目范围。jQuery 的答案将不被标记为正确答案,但欢迎以后有类似问题的用户提问。顺便提一句:我也不感兴趣第三方库。
我试图获取多行文本框中当前行(基于 selectionStart,用户选择超过 1 行的几率)的第一个位置(0),但要将其转换为光标索引。
我试过什么?没有什么优雅的方法:
我试图获取多行文本框中当前行(基于 selectionStart,用户选择超过 1 行的几率)的第一个位置(0),但要将其转换为光标索引。
我试过什么?没有什么优雅的方法:
for ( i = 0; i < this.selectionStart; i++ ) {
if (this.value.substr(i,1).match(/\r?\n|\r/)) {
lineStartIndx = i + 1
}
}
当迭代具有大量行的文本区域时,这将证明是昂贵的。我的个人使用不会在每次按下键时执行,但我只是用它作为一个例子。是否有任何更好的方法,内置或其他方法来模拟这个结果?
完整示例:
var input = document.getElementById("ta");
var output = document.getElementById("output");
let pattern = /\r?\n|\r/;
var lineNum, lineStartIndx;
input.addEventListener("keydown", function(e) {
taHandler(this);
})
input.addEventListener("click", function(e) {
taHandler(this);
})
function taHandler(elem) {
lineNum = getLineNumForSelection(elem);
let caretPos = elem.selectionStart;
lineStartIndx = 0;
for ( i = 0; i < caretPos; i++ ) {
if (elem.value.substr(i,1).match(pattern)) {
lineStartIndx = i + 1
}
}
output.innerHTML = "Selection Start: " + caretPos + " Selection End: " + elem.selectionEnd +
" <br> Line Number: " + lineNum.start +
"<br>Line Start Position: " + lineStartIndx;
}
function getLineNumForSelection(sel) {
return {
'start' : sel.value.substr(0, sel.selectionStart).split(pattern).length,
'end' : sel.value.substr(0,sel.selectionEnd).split(pattern).length
};
}
<textarea id="ta" rows="5" cols="50">
Line one
Line two
Line three
Line four
</textarea>
<hr>
<div id="output"></div>
document.getElementById("output").split('\n').charAt(0)
? - Meghan