- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 HTML 文本区域。我想修改它,让它实现自动缩进,即在插入NEWLINE后,我想在新行的开头自动插入空格(空格的数量取决于上一行的缩进)。我想通了,我可以通过注册一个监听“按键”事件的处理程序来做到这一点。现在我有一个选择:(a) 保留默认处理程序并在浏览器将换行符添加到 textarea.value 后插入空格,或者 (b) 使用 preventDefault() 并自己插入整个内容(即换行符和空格)。
在情况 (a) 中,如下面的代码所示,我的处理程序在浏览器添加换行符之前执行,因此空格(或用于说明的“--”)结束于行尾,而不是行尾新的开始。
在情况 (b) 中,如以下代码的注释所示,文本已正确修改,但如果导致光标离开文本区域 View ,则内容不会滚动(很可能是因为内容滚动是一部分默认处理),因此光标消失在文本区域边界后面,并且只有在我发送另一个击键(即不是换行符)时才会重新出现。
如何在不丢失默认滚动的情况下实现自动缩进效果?
我知道可以通过延迟插入空格(例如使用 setTimeout())来近似这种效果,以便运行时有足够的时间来完成默认处理(即插入换行符和垂直滚动),但是对我来说,这似乎是一个巨大的困惑,而且我担心引入竞争条件会在最意想不到的情况下打击我(大量复制粘贴、由于其他操作导致运行时间变慢、键盘重复率高等)。理想情况下,我希望 (i) 在默认处理之后调用我的代码,或者 (ii) 能够阻止默认处理、运行我的代码并显式调用默认处理。如何实现?
谢谢!
格雷格
PS:我对集成复杂的文本区域替换不感兴趣,例如Editarea(我使用一个,它在浏览器中非常脆弱)。
在 FF3 上测试。
<html>
<head>
<script type="text/javascript">
function onKeyPressHandler(e) {
if (e.which == 13) // ASCII newline
{
var start = this.selectionStart;
var end = this.selectionEnd;
var v = this.value;
this.value = v.slice(0, start) + '--' + v.slice(end); // (a)
// (b): this.value = v.slice(0, start) + '\n--' + v.slice(end);
// (b): e.preventDefault();
}
}
onload = function() {
var editor = document.getElementById("editor");
editor.addEventListener('keypress', onKeyPressHandler, false);
}
</script>
</head>
<body>
<textarea rows="20" cols="80" id="editor"></textarea>
</body>
</html>
最佳答案
我修改了 Leo 的答案以解决延迟问题(通过使用按键而不是带有 setTimeout 的按键),以及导致编辑文本中间部分不起作用的错误。
$("textarea").keydown(function(e)
{
if (e.which == 9) //ASCII tab
{
e.preventDefault();
var start = this.selectionStart;
var end = this.selectionEnd;
var v = $(this).val();
if (start == end)
{
$(this).val(v.slice(0, start) + " " + v.slice(start));
this.selectionStart = start+4;
this.selectionEnd = start+4;
return;
}
var selectedLines = [];
var inSelection = false;
var lineNumber = 0;
for (var i = 0; i < v.length; i++)
{
if (i == start)
{
inSelection = true;
selectedLines.push(lineNumber);
}
if (i >= end)
inSelection = false;
if (v[i] == "\n")
{
lineNumber++;
if (inSelection)
selectedLines.push(lineNumber);
}
}
var lines = v.split("\n");
for (var i = 0; i < selectedLines.length; i++)
{
lines[selectedLines[i]] = " " + lines[selectedLines[i]];
}
$(this).val(lines.join("\n"));
}
});
$("textarea").keypress(function(e)
{
if (e.which == 13) // ASCII newline
{
setTimeout(function(that)
{
var start = that.selectionStart;
var v = $(that).val();
var thisLine = "";
var indentation = 0;
for (var i = start-2; i >= 0 && v[i] != "\n"; i--)
{
thisLine = v[i] + thisLine;
}
for (var i = 0; i < thisLine.length && thisLine[i] == " "; i++)
{
indentation++;
}
$(that).val(v.slice(0, start) + " ".repeat(indentation) + v.slice(start));
that.selectionStart = start+indentation;
that.selectionEnd = start+indentation;
}, 0.01, this);
}
});
<textarea rows="20" cols="40"></textarea>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
关于javascript - 如何将自动缩进添加到 HTML 文本区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5743916/
我正在使用 libxml2 的 xmlwriter api 编写一个 xml 文件。 当我使用记事本打开文件时,缩进不正确。 有人知道怎么解决吗? 非常感谢。 最佳答案 我在这里有点冒进,但我会说“缩
我正在尝试让这个脚本工作,但它...给我缩进错误 #!/usr/bin/env python import io myfile = open('stats.txt', 'r') dan = myfil
我使用 Emacs 有一段时间了,我真的很想念一个古老的 Geany 快捷方式 - “C-i”和“C-u”。 “C-i”缩进整个当前行(将鼠标光标保持在原处),“C-u”取消整个当前行的缩进。 我发现
如何向 UILabel 内的文本添加缩进或偏移?它需要是特定的像素大小,与字体大小无关。 最佳答案 您可以创建另一个UILabel,然后将每个标签的框架设置为一定的宽度,这样,如果您想要实现这一目标,
请帮我在 Emacs haskell-mode 中设置正确的缩进 当我尝试输入诸如 ADT 或记录之类的内容时,按 后我进入了错误的列。 ,然后按 不会切换到右边,直到我输入 |或者 ';'! d
我在 Visio 2010 中有一个项目符号列表,我试图在其中缩进二级项目符号。例如: 我希望“子项目符号”项目向右缩进,这样很明显它是一个子元素。我认为功能区上的“增加缩进”选项可以做到这一点,但这
我写了这段代码: addNums key num = add [] key num where add res a:as b:bs | a == [] = res
我在生成的 xml 文档中添加了换行符。 "\n" some text etc."\n" "\n" 这最终应该是: some text etc. 这是否可以通过 google-code-pre
使用 JTabbedPane 时,如何缩进选项卡? Swing 默认输出: ------- --------- ------ | A | | B | | C | --------
我收到这些行的缩进错误 有没有在线验证器可以帮助我? showAliveTests : (pageIndex, statusFilter) -> data= pageI
在 Python 中,当你写了 100 行代码而忘记在某个地方添加一堆循环语句时,你会怎么做? 我的意思是,如果您在某处添加一个 while 语句,您现在必须缩进它下面的所有行。这不像您可以戴上牙套并
我喜欢这样做,如 indesign 或 quark...段落缩进...图片 如何在 html 和 css 中做到这一点的正确方法 我不希望文字环绕图像...我喜欢保护整个左边的部分给图片留边距就可以了
我试过添加 10px 的内边距但没有成功。你可以看到它的一个例子lower down on this page . #menu li { float: left;
这个问题在这里已经有了答案: I'm getting an IndentationError. How do I fix it? (6 个答案) 关闭去年。 while 1 == 1:
您好,我正在尝试使用来自 C# 应用程序的收据打印机打印帐单/收据。 预期的输出是这样的: ITEM NAME QTY PRICE Banana Large Y
有没有办法在 JTextPane 中缩进一段文本? import javax.swing.*; import java.awt.*; import javax.swing.text.StyledDoc
我知道 #define 等通常从不缩进。为什么? 我目前正在编写一些代码,其中混合了#define、#ifdef、#else s、#endifs 等。所有这些通常与普通 C 代码混合在一起。 #def
我认为缩进在 YAML 中很重要。 我在 irb 中测试了以下内容: > puts({1=>[1,2,3]}.to_yaml) --- 1: - 1 - 2 - 3 => nil 我期待这样的事情:
我在带有 openmp 语句的 C++ 代码中使用 Vim。 而在我的 ~/.vimrc set ai " auto indent 我的问题:当我使用 openmp 语句(以 # 开头)时,光标会跳
我想使用 Megaparsec 解析一种基本的缩进语言。最初我使用的是 Parsec,我设法通过缩进正常工作,但现在我遇到了一些麻烦。 我一直在关注一个教程here这是我必须解析一种忽略缩进的语言的代
我是一名优秀的程序员,十分优秀!