从文本区域删除顶行的最整洁(和快速)方法
Neatest (and fast) way to remove top lines from a textarea
我有一个网页,显示日志文件的最后1000
行,然后每x
秒通过AJAX更新一次,加载新内容(如果有的话)并附加到文本区域,$('#log').append(new_data)
,这是一种tail -f
。
一段时间后,当附加的行太多并且页面变慢或无响应时,问题就会出现。
所以我想将行数限制为 5000 行,这意味着我应该:
- 检索
new_data
- 计算
overflow = 5000 - lines_ in_new_data - lines_in_textarea
- 如果
overflow > 0
从文本区域中删除前overflow
行 - 将new_data追加到文本区域
在我看来,这涉及textarea
值和new_data
值的一个或多个split(''n')
,然后使用数组长度和切片,但我想是否有更整洁或更好的方法来实现这一目标。
您应该能够使用单个split
,然后在截断数据后join
,如下所示:
// on data retrieved
var total = ((textarea.value
? textarea.value + "'n"
: "")
+ new_data).split("'n");
if (total.length > 10)
total = total.slice(total.length - 10);
textarea.value = total.join("'n");
工作示例:http://jsfiddle.net/ArvQ7/(为简洁起见,切成 10 行)
像这样的东西(下面链接的演示可能更有用):
.HTML
<button id="clickme">More lines</button>
<br/>
<textarea id="log" rows="24" cols="80"></textarea>
<p>Lines: <span id="numLines">0</span></p>
JavaScript
var $log = $('#log'),
$button = $('#clickme'),
$numLines = $('#numLines'),
MAX_LINES = 5000,
lorem_ipsum = ' Lorem ipsum dolor sit amet, consectetur adipiscing elit.',
lineCounter = 0;
$button.click(function()
{
$log.val($log.val() + generateMoreLines()).change();
});
$log.change(function ()
{
var text = tail(MAX_LINES, $log.val());
$log.val(text);
$numLines.text(countNewlines(text));
});
function generateMoreLines()
{
var buf = [];
for (var i = 0; i < 1000; i++)
{
buf.push(lineCounter++ + lorem_ipsum);
}
return buf.join(''n');
}
function countNewlines(haystack)
{
return count(''n', haystack);
}
function count(needle, haystack)
{
var num = 0,
len = haystack.length;
for (var i=0; i < len; i++)
{
if (haystack.charAt(i) === needle)
{
num++;
}
}
return num;
}
function tail(limit, haystack)
{
var lines = countNewlines(haystack) + 1;
if (lines > limit)
{
return haystack
.split(''n')
.slice(-limit)
.join(''n');
}
return haystack;
}
换行符处理并不完美(您是否计算所有出现的''n'
?如果字符串以 ''n'
开头或结尾怎么办?等)。
演示:http://jsfiddle.net/mattball/3ghjm/
相关文章:
- jquery插件或javascript方法自动调整文本输入(而非文本区域)(固定宽度)可变高度的大小
- 不使用自定义CSS或HTML(使用框架方法)的角度材质文本输入或文本区域标签大小
- 如何在OnPaste方法中清除文本区域
- 有没有一种方法可以用包含ENTER键换行符的SQL数据填充文本区域表单
- 在HTML中记住用户区域设置选择的最简单方法
- CSS区域的实现方法
- 任何比较两个不同位图图像并在javascript中检测不同区域的方法
- 是否有一种本机方法可以将字符串从任何区域设置转换为数字
- 想要通过GET方法从URL获取值,然后想在我的标题区域的右上角显示这些值
- 在javascript中单击按钮时更改文本区域中的文本的方法是什么
- 文本区域属性 wrap=hard 不适用于粘贴的文本,任何解决方法
- 跨浏览器方法,用于防止从文本区域复制所有文本的方法
- 如何使用http.post方法替换或更新文本区域中的现有内容
- 有没有一种方法可以将每个文本区域自动调整为其大小's从数据库查询返回的数据
- 有没有一种方法可以将javascript中的字符串解析为与区域设置相关的数字
- 一个页面应用程序中的多个区域/部分.杜兰达尔和淘汰赛的方法
- 如何在使用 GET 方法发送 url 时保留文本区域输入中的文本段落
- 有没有一种方法可以让我在“inspect”元素中抓取代码?区域
- 是否有一种方法来动画文本区域的不透明度与jQuery
- 不能使用jQuery和value方法设置文本区域中的文本