如何限制 Textarea (Redactor) 中的行数?
How to limit number of lines in Textarea (Redactor)?
在达到最大行数后,我目前很难让 Enter 键停止在我的文本区域中创建新行。行数作为我制作的组件中的参数传递。我的 textarea 是一个 Redactor 编辑器,新行由换行符分隔。
我有一个计算的可观察值,它根据文本中换行符的数量确定行数,并且返回正确的值:
self.numberOfRows = ko.computed(function () {
return self.value().split(/<br>/).length;
}, this);
在我的 Redactor 设置中,我有一个 keydownCallback 函数,该函数将行数与最大行数进行比较,并且应该在达到或超过最大值时防止回车键创建新行:
keydownCallback: function (e) {
if (e.keyCode > 48 || e.keyCode === 32) {
if (self.remainingCharacters() <= 0) {
e.preventDefault();
}
} else if (e.keyCode === 13) {
if (self.maxRows != null) {
if (self.numberOfRows() >= self.maxRows) {
e.preventDefault();
}
}
}
},
回调函数的第一部分限制了字符数并且工作正常,但是回车键仍然会创建新行。我还尝试了 "return false;" 而不是 preventDefault,并且我还在 preventDefault 之前尝试了 stopPropagation,但没有成功。我不关心用户将值粘贴到文本区域,也不关心自动换行。建议?
分离回调:
enterCallback: function(e) {
if (self.maxRows != null) {
if (self.numberOfRows() >= self.maxRows) {
return false;
}
}
},
keydownCallback: function (e) {
if (e.keyCode > 48 || e.keyCode === 32) {
if (self.remainingCharacters() <= 0) {
e.preventDefault();
}
}
},
更新
有机会尝试使用 Redactor 并注意到当我按下 return 时,没有插入 <br>
而是创建了新的 <p>
标签。空段落将包含 <p><br></p>
。所以实际的 textarea 值是这样的:
<h2>Foo</h2>
<p>Bar
</p>
<p>Buz
</p>
我整理了一个关于如何处理的最小概念证明
$('#content').redactor({
focus: true,
enterCallback: function(e)
{
var lines = this.code.get().split(/\r?\n/g).length;
console.log(this.code.get(), lines);
if (lines > 3) { // self.numberOfRows()
return false;
}
},
keydownCallback: function(e)
{
//
}
});
我不确定按新行拆分是否比按 this.code.get().split(/<\/(p|h[1-6])>/)
.
这样的关闭标签拆分更可靠
我会更新 self.numberOfRows
函数内的正则表达式,以换行或结束标记分隔
原始答案
你检查过他们的 docs 了吗?
enter
and keyup
:
似乎有 2 个单独的回调
You can return false in this callback to prevent Redactor from
handling Enter/Return key inputs. It allows you to develop custom
handlers for this event.
$('#redactor').redactor({
callbacks: {
enter: function(e)
{
console.log(this.code.get());
return false;
}
}
});
此外,如果您查看他们的 Limiter plugin,它只是 return 错误:
if (count >= this.opts.limiter)
{
return false;
}
在达到最大行数后,我目前很难让 Enter 键停止在我的文本区域中创建新行。行数作为我制作的组件中的参数传递。我的 textarea 是一个 Redactor 编辑器,新行由换行符分隔。
我有一个计算的可观察值,它根据文本中换行符的数量确定行数,并且返回正确的值:
self.numberOfRows = ko.computed(function () {
return self.value().split(/<br>/).length;
}, this);
在我的 Redactor 设置中,我有一个 keydownCallback 函数,该函数将行数与最大行数进行比较,并且应该在达到或超过最大值时防止回车键创建新行:
keydownCallback: function (e) {
if (e.keyCode > 48 || e.keyCode === 32) {
if (self.remainingCharacters() <= 0) {
e.preventDefault();
}
} else if (e.keyCode === 13) {
if (self.maxRows != null) {
if (self.numberOfRows() >= self.maxRows) {
e.preventDefault();
}
}
}
},
回调函数的第一部分限制了字符数并且工作正常,但是回车键仍然会创建新行。我还尝试了 "return false;" 而不是 preventDefault,并且我还在 preventDefault 之前尝试了 stopPropagation,但没有成功。我不关心用户将值粘贴到文本区域,也不关心自动换行。建议?
分离回调:
enterCallback: function(e) {
if (self.maxRows != null) {
if (self.numberOfRows() >= self.maxRows) {
return false;
}
}
},
keydownCallback: function (e) {
if (e.keyCode > 48 || e.keyCode === 32) {
if (self.remainingCharacters() <= 0) {
e.preventDefault();
}
}
},
更新
有机会尝试使用 Redactor 并注意到当我按下 return 时,没有插入 <br>
而是创建了新的 <p>
标签。空段落将包含 <p><br></p>
。所以实际的 textarea 值是这样的:
<h2>Foo</h2>
<p>Bar
</p>
<p>Buz
</p>
我整理了一个关于如何处理的最小概念证明
$('#content').redactor({
focus: true,
enterCallback: function(e)
{
var lines = this.code.get().split(/\r?\n/g).length;
console.log(this.code.get(), lines);
if (lines > 3) { // self.numberOfRows()
return false;
}
},
keydownCallback: function(e)
{
//
}
});
我不确定按新行拆分是否比按 this.code.get().split(/<\/(p|h[1-6])>/)
.
我会更新 self.numberOfRows
函数内的正则表达式,以换行或结束标记分隔
原始答案
你检查过他们的 docs 了吗?
enter
and keyup
:
You can return false in this callback to prevent Redactor from handling Enter/Return key inputs. It allows you to develop custom handlers for this event.
$('#redactor').redactor({
callbacks: {
enter: function(e)
{
console.log(this.code.get());
return false;
}
}
});
此外,如果您查看他们的 Limiter plugin,它只是 return 错误:
if (count >= this.opts.limiter)
{
return false;
}