从textarea中删除顶行的最新(和快速)方法
我有一个显示最后1000
行日志文件的网页,然后每隔x
秒加载新内容(如果有的话)通过AJAX更新,并附加到带有$('#log').append(new_data)
textarea。append $('#log').append(new_data)
,一种tail -f
。
一段时间后,如果添加太多行并且页面变慢或无响应,则会出现问题。
所以我想将行数限制为5000,这意味着我应该:
- 检索
new_data
- 计算
overflow = 5000 - lines_ in_new_data - lines_in_textarea
- 如果
overflow > 0
从textarea中删除第一个overflow
行 - 将new_data附加到textarea
在我看来,这涉及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
Lines: 0
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/