我有一个 textarea 用于保存大量 SQL 脚本以进行解析。当用户单击“Parse”按钮时,他们会获得有关 SQL 脚本的摘要信息。
我希望摘要信息是可点击的,这样当点击它时,SQL 脚本的行会在 textarea 中突出显示。
我已经在输出中有行号,所以我只需要 javascript 或 jquery 告诉它要突出显示 textarea 的哪一行。
是否有某种类型的“ goToLine ”功能?在我所有的搜索中,没有什么能完全解决我正在寻找的东西。
我有一个 textarea 用于保存大量 SQL 脚本以进行解析。当用户单击“Parse”按钮时,他们会获得有关 SQL 脚本的摘要信息。
我希望摘要信息是可点击的,这样当点击它时,SQL 脚本的行会在 textarea 中突出显示。
我已经在输出中有行号,所以我只需要 javascript 或 jquery 告诉它要突出显示 textarea 的哪一行。
是否有某种类型的“ goToLine ”功能?在我所有的搜索中,没有什么能完全解决我正在寻找的东西。
此函数希望第一个参数是对您的 textarea 的引用,第二个参数是行号
function selectTextareaLine(tarea,lineNum) {
lineNum--; // array starts at 0
var lines = tarea.value.split("\n");
// calculate start/end
var startPos = 0, endPos = tarea.value.length;
for(var x = 0; x < lines.length; x++) {
if(x == lineNum) {
break;
}
startPos += (lines[x].length+1);
}
var endPos = lines[lineNum].length+startPos;
// do selection
// Chrome / Firefox
if(typeof(tarea.selectionStart) != "undefined") {
tarea.focus();
tarea.selectionStart = startPos;
tarea.selectionEnd = endPos;
return true;
}
// IE
if (document.selection && document.selection.createRange) {
tarea.focus();
tarea.select();
var range = document.selection.createRange();
range.collapse(true);
range.moveEnd("character", endPos);
range.moveStart("character", startPos);
range.select();
return true;
}
return false;
}
用法:
var tarea = document.getElementById('myTextarea');
selectTextareaLine(tarea,3); // selects line 3
工作示例:
darkheir 帖子中的代码无法正常工作。基于它,我缩短了代码并使其工作。
function onClickSelection(textarea){
if(typeof textarea.selectionStart=='undefined'){
return false;
}
var startPos=(textarea.value.substring(0,textarea.selectionStart).lastIndexOf("\n")>=0)?textarea.value.substring(0,textarea.selectionStart).lastIndexOf("\n"):0;
var endPos=(textarea.value.substring(textarea.selectionEnd,textarea.value.length).indexOf("\n")>=0)?textarea.selectionEnd+textarea.value.substring(textarea.selectionEnd,textarea.value.length).indexOf("\n"):textarea.value.length;
textarea.selectionStart=startPos;
textarea.selectionEnd=endPos;
return true;
}
搜索行的一个更简洁的版本:
function select_textarea_line (ta, line_index) {
const newlines = [-1]; // Index of imaginary \n before first line
for (let i = 0; i < ta.value.length; ++i) {
if (ta.value[i] == '\n') newlines.push( i );
}
ta.focus();
ta.selectionStart = newlines[line_index] + 1;
ta.selectionEnd = newlines[line_index + 1];
} // select_textarea_line
为了使函数对可能的错误输入更加宽容,请添加以下内容:
// array starts at 0
lineNum--;
这段代码:
if (typeof(tarea) !== 'object' || typeof(tarea.value) !== 'string') {
return false;
}
if (lineNum === 'undefined' || lineNum == null || lineNum < 0) {
lineNum = 0;
}
如何在textarea javascript中选择文本行双击特定行。
//This function expects first parameter to be reference to your textarea.
function ondblClickSelection(textarea){
var startPos = 0;
var lineNumber = 0;
var content = "";
if(typeof textarea.selectionStart == 'undefined') {
return false;
}
startPos = textarea.selectionStart;
endPos = textarea.value.length;
lineNumber = textarea.value.substr(0,startPos).split("\n").length - 1;
content = textarea.value.split("\n")[lineNumber];
var lines = textarea.value.split("\n");
var endPos = lines[lineNumber].length+startPos;
textarea.selectionStart = startPos;
textarea.selectionEnd = endPos;
return true;
}