4

我正在尝试实现一个文本插入字段,它应该自动为每一行编号(基于换行符)。

用户应该不能自己选择或删除数字,文本字段应该从一开始就配置为编号列表。

这是在 JQuery 中完成的,我无法找到解决方案。

以下是我尝试过的,但它不能按需要工作。我从LineAreaText Demo得到了解决方案。

还有JSFIDDLE

但需要结构为 jsfiddle 文本框,如:


1. here is first line.
2. when press enter key this two will add in this line and 
   now I am not pressing enter key so there is no next line 
   count.
3. Now pressed enter and third is there as line number.

我试过了

  • 使用如上所述的可编辑 div 结构,但在未按下回车键且句子尚未完成时未能留空。
  • 使用 ajax htmleditor 扩展器,但需要按顶部的有序列表图标按钮。

这是 JsFiddle 使用的与我需要做的相同的事情。

在此处输入图像描述

由于我现在陷入困境,因此我将非常感谢任何帮助或指导。

提前致谢。

4

2 回答 2

4

几行 JavaScript 就可以解决问题。http://jsfiddle.net/mkWhy/1/ 您只需处理 textarea 的 onkeyup 事件,将当前文本拆分为行(在新行字符'\n'上拆分),遍历这些行并确保开始每一行都有正确的数字。

<textarea id="num" rows="5" cols="32">1. </textarea>

纯JS

document.getElementById("num").onkeyup = function(e) {
    var evt = e ? e : event;
    if((evt.keyCode && evt.keyCode != 13) || evt.which != 13) 
        return;
    var elm = evt.target ? evt.target : evt.srcElement;
    var lines = elm.value.split("\n");
    for(var i=0; i<lines.length; i++)
        lines[i] = lines[i].replace(/(\d+\.\s|^)/, (i+1) + ". ");
    elm.value = lines.join("\n");
}

jQuery

$("#num").keyup(function(event) {
    if(event.which != 13)
        return;
    var elm = $(this);
    var lines = elm.val().split("\n");
    for(var i=0; i<lines.length; i++)
        lines[i] = lines[i].replace(/(\d+\.\s|^)/, (i+1) + ". ");
    elm.val(lines.join("\n"));
});

编辑这更符合 OP 的问题,一个 jsfiddle 类型的编号文本输入。http://jsfiddle.net/qZqX8/

我使用两个 textarea 的第一个设置为只读,并让它们彼此相邻。然后在输入文本区域上使用 keyup 和滚动事件。保持高度和滚动位置同步。

$(".numbered").scroll(function(event) {
    $(this).prev().height($(this).height());
    $(this).prev()[0].scrollTop = this.scrollTop;
});
$(".numbered").keyup(function(event) {
    var elm = $(this);
    var lines = elm.val().split("\n");
    var numbers = "";
    for(var i=0; i<lines.length; i++)
        numbers += (i+1) + "\n";
    elm.prev().val(numbers);
    elm.prev()[0].scrollTop = this.scrollTop;
});

编辑 2这是一个类似于 JSFiddle.net 的编辑器的版本。我不处理文本突出显示、移位或箭头键,但输入和退格键工作。http://jsfiddle.net/gqHgb/

HTML

<div id="ref_line" style="display:none">
    <div class="line"><div class="lineno"></div><pre contenteditable="true"> </pre></div>
</div>
<div class="editor">
</div>

CSS 我使用 CSS counter() 来处理行号

.editor {
    margin-left: 2em;
    counter-reset: lnno;
}
.editor .line {
    poisition: relative;
}
.line .lineno {
    position: absolute;
    left: 0px;
    width: 2em;
    color: blue;
    text-align: right;
}
.line .lineno:before {
    counter-increment: lnno;
    content: counter(lnno);
}
.line pre {
    position: relative;
    overflow: visible;
    white-space: pre-wrap;
    word-break: normal;
    word-wrap: break-word;
}

JS jQuery

// setup editors
$(".editor").each(function() {
    $(this).append($("#ref_line").html());
});
// line focus / blur
$(".editor").on("focus", ".line pre", function() {
    var pre = $(this);
    if(pre.text() == " ")
        pre.text("");
});
$(".editor").on("blur", ".line pre", function() {
    var pre = $(this);
    if(pre.text() == "")
        pre.text(" ");
});
// line add / remove
$(".editor").on("keydown", ".line pre", function(event) {
    var pre = $(this);
    if(event.which == 13) {
        event.stopPropagation();
        event.preventDefault();
        pre.parent().after($("#ref_line").html());
        pre.blur();
        pre.parent().next().find("pre").focus();
    } else if(event.which == 8 && pre.text() == "" && this != pre.parents(".editor").find("pre:first")[0]) {
        var back = pre.parent().prev();
        pre.parent().remove();
        back.find("pre").focus();
    }
});
于 2013-07-22T13:36:18.590 回答
0

http://www.andrewmpeters.com/blog/how-to-detect-enter-keypress-with-javascript/

这会有帮助吗?

这是关于每当按下一个键时触发一个功能。所以你可能只需要一个换行并将最后一个数字加 1 的函数。

+=1

Javascript 不是我最好的语言,所以这就是我所能做的。我希望我以正确的方式发送给您。

于 2013-07-22T13:12:26.427 回答