使用javascript在元素中选择一行文本
Select a single line of text within an element with javascript
我已经找到了很多使用各种形式的onclick="this.select()"
来选择元素的全部内容的解决方案,但是否可以使用javascript从元素onclick
中选择一行?
例如,我正在编写一本Linux指南,其中涉及<pre>
和<code>
标记中的许多bash命令,我不希望用户必须单击并拖动才能逐行选择每个命令,因为这在几十行之后会变得乏味。但是,我也不想将每个命令分离成它自己的元素,这些元素可以用于选择事件。
代码块示例:
<pre><code>
sudo apt-get install foo
cd /etc/bar
sudo cp baz.conf baz.local
sudo nano baz.local
</code></pre>
我希望用户只需单击一行就可以选择它,但没有类或id可供使用。我还希望这适用于页面上的任何<pre><code>
块,而不仅仅是特定的块。jQuery解决方案就可以了。
这可能吗?
您可以计算行数,并将其与代码元素的当前垂直鼠标除法器相乘(例如,如果您位于元素中间,则为0.5)。
这是相应的代码片段:
Math.floor(lines.length * (y/height))
基于这个想法的jQuery插件可以这样编码:
jQuery.fn.lineSelection = function(options) {
var _this = this,
height = null,
lines = this.text().split(''n'),
textChanged = false;
// remove first empty lines (optional)
while(lines[0] == '') {
textChanged = true;
lines.shift();
}
// remove last empty lines
while(lines[lines.length-1] == '') {
textChanged = true;
lines.pop();
}
if(textChanged) {
this.text(lines.join(''n'));
}
height = this.height();
this.on('click', function() {
var y = event.offsetY,
// now use the described formula
lineIndex = Math.floor(lines.length * y/height),
line = lines[lineIndex];
_this.trigger('lineClicked', [line, lineIndex]);
});
if(options.lineClicked) {
this.on('lineClicked', options.lineClicked);
}
};
插件可以这样使用:
$('pre > code').lineSelection({
lineClicked: function(event, text, index) {
console.log(text, index);
}
});
还可以查看正在运行的jsfiddle演示
相关文章:
- 拆分文本以每隔n个字符添加一行新行,并注意空格
- 文本区域-获取每一行,找到换行符
- 用javascript读取文本文件的第一行
- 使用VBScript或Javascript从文本框(文本区域)中删除最后一行空/空行
- 如何在文本区域中复制文本的每一行
- 如何使用jquery复制文本区域中的每一行文本
- 如何使用 jQuery 在文本区域中的每一行添加文本
- 更改多个文本框并选择从一行检索到另一行的数据
- 通过jQuery在文本区域占位符内新建一行
- 在用户键入时修剪和编辑文本区域的每一行
- 是否可以将光标锁定/聚焦到文本区域的最后一行
- 如何从 ACE 编辑器检索一行文本
- 如何在 Jquery 中计算一行文本的宽度
- 如何为一行文本输入字段添加用户可编辑的文本标签
- 使用javascript在元素中选择一行文本
- 如何对每一行文本执行Marquee stop Delay
- 如何使用javascript/jquery改变每一行文本的方向
- 如何在
中显示一行文本 - 删除并返回一行文本
- 使用URL参数使用JS调用一行文本