在HTML中获取一个段落的一行
Obtain a line of a paragraph in HTML
在JavaScript中,是否可以从页面上显示的段落中获得特定的行?
例如,这里我试图获得段落的第三行作为字符串:
JavaScript://this function should return the specified line from the specified paragraph.
function getLine(paragraphId, lineNum){
//for example, getLine("sampleParagraph", 1); should return
// tore but year. An from mean on with when sing pain. Oh to as principles devonshire
}
HTML: <p id = "sampleParagraph">
Instrument cultivated alteration any favourable expression law far nor. Both new like tore but year. An from mean on with when sing pain. Oh to as principles devonshire companions unsatiable an delightful. The ourselves suffering the sincerity. Inhabit her manners adapted age certain. Debating offended at branched striking be subjects.
</p>
在jsfiddle上(显示段落如何显示):http://jsfiddle.net/RrXWW/
演示1: http://jsfiddle.net/LeTW6/2/
演示2: http://jsfiddle.net/LeTW6/3/
为了简单起见,我在这里使用jQuery,但这将与纯JavaScript一起工作。事实上,我在某些部分使用直接DOM访问来提高性能。
- 将所有单词分割成单独的元素。
- 使用位置计算行号
- 在选定的行中,开始构建一个包含所有单词元素的缓冲区。
- 大于所选行,退出
- 调整大小,重新计算(这可能不需要,也可能从其他事件调用)。
(function () {
// wrap all words
$(".count").each(function () {
var obj = $(this);
var html = obj.html().replace(/('S+'s*)/g, "<span>$1</span>");
obj.html(html);
});
var offset = 0; // keeps track of distance from top
var spans = $(".count span"); // collection of elements
function getLine(index) {
var top = 0,
buffer = [];
for (var i = 0; i < spans.length; i++) {
if (top > index) {
break; // quit once the line is done to improve performance
}
// position calculation
var newOffset = spans[i].offsetTop;
if (newOffset !== offset) {
offset = newOffset;
top++;
}
// store the elements in the line we want
if (top === index) {
buffer.push(spans[i]);
}
}
// buffer now contains all spans in the X line position
// this block is just for output purposes
var text = "";
for (var i = 0; i < buffer.length; i++) {
text += buffer[i].innerHTML;
}
$("#output").html(text);
}
var line = 3; // the line to select/highlight
getLine(line); // initial highlighting
// other recalculation triggers can be added here, such as a button click
// throttling to handle recalculation upon resize
var timeout;
function throttle() {
window.clearTimeout(timeout);
timeout = window.setTimeout(function () {
getLine(line);
}, 100);
}
$(window).on("resize", throttle);
})();
(function () {
// wrap all words
$(".count").each(function () {
var obj = $(this);
var html = obj.html().replace(/('S+'s*)/g, "<span>$1</span>");
obj.html(html);
});
var offset = 0; // keeps track of distance from top
var spans = $(".count span"); // collection of elements
function getLine(index) {
var top = 0,
buffer = [];
for (var i = 0; i < spans.length; i++) {
if (top > index) {
break; // quit once the line is done to improve performance
}
// position calculation
var newOffset = spans[i].offsetTop;
if (newOffset !== offset) {
offset = newOffset;
top++;
}
// store the elements in the line we want
if (top === index) {
buffer.push(spans[i]);
}
}
// buffer now contains all spans in the X line position
// this block is just for output purposes
var text = "";
for (var i = 0; i < buffer.length; i++) {
text += buffer[i].innerHTML;
}
$("#output").html(text);
}
var line = 3; // the line to select/highlight
getLine(line); // initial highlighting
// other recalculation triggers can be added here, such as a button click
// throttling to handle recalculation upon resize
var timeout;
function throttle() {
window.clearTimeout(timeout);
timeout = window.setTimeout(function () {
getLine(line);
}, 100);
}
$(window).on("resize", throttle);
})();
如果你想使用纯JavaScript来提高性能,这样你就不必包含jQuery,你可以使用这个
演示:http://jsfiddle.net/PX7cj/2/
function getLine(paragraphId, lineNum) {
lineNum--;
var elem = document.getElementById(paragraphId);
var spanChildren = elem.getElementsByTagName("span");
var paragraphText = elem.innerHTML.replace(/('r'n|'n|'r)/gm, "");
var newParagraphText = "";
var words = [];
if (spanChildren.length === 0) {
words = paragraphText.split(" ");
for (var i = 0; max = words.length, i < max; i++)
newParagraphText += '<span>' + words[i] + "</span> ";
elem.innerHTML = newParagraphText;
}else{
for(var i=0; max = spanChildren.length, i<max; i++){
words[words.length] = spanChildren[i].innerHTML;
}
}
var lineCounter = 0;
var previousY = spanChildren[0].offsetTop;
var returnText = "";
var startReturning = false;
for (var i = 0; max = words.length, i < max; i++) {
if (spanChildren[i].offsetTop != previousY) lineCounter++;
if (lineCounter === lineNum) startReturning = true;
if (lineCounter !== lineNum && startReturning) return returnText.substring(0, returnText.length - 1);
if (startReturning) {
returnText += words[i] + " ";
if (i + 1 === words.length) return returnText.substring(0, returnText.length - 1);
}
previousY = spanChildren[i].offsetTop;
}
}
alert(getLine("sampleParagraph", 5));
alert(getLine("sampleParagraph", 4));
相关文章:
- 拆分文本以每隔n个字符添加一行新行,并注意空格
- 动态插入的表:JQuery未检测到最后一行
- 在终端中运行 JavaScript 时(使用 rhino),如何使用 print() 函数在一行中打印
- 如何在Angular UI网格中选择下一行
- 通过单击动态加载的表中同一行的另一个字段来更新一行的字段
- Javascript-在文本区域中断,但不在段落中中断
- 附加“;显示更多“;仅当满足设定的字符数时,链接到截断的段落
- Jquery幻灯片以一行左侧的图像开始,但我希望它从右端开始
- 从重复的javascript数组结果集中只获取一行
- 在GridView中,当单击复选框时,在网格的同一行中使用JavaScript将标签中的值添加到TextBox
- html5画布在同一行中写入多个字体
- Javascript-从随机的单词数组中创建段落
- Angular JS在一行中查找最小值
- 简单的jQuery段落渐变器
- 在每个固定高度段落的最后一行添加省略号,并隐藏溢出 y
- 如何使段落在从包装标题的最后一行开始的浮动标题之后流动
- 如何在一行或段落中突出显示一些数字或文本
- 段落变成一行?(去掉换行)
- 在HTML中获取一个段落的一行
- 让一行段落自下而上而不是自上而下的技巧