我使用eBook将Html内容(属于以下步骤 )划分为多个列。
1)我在容器中的内容中添加了HTML。
<body>
<div id="container">
<div id="content">
BOOK HTML CONTENT
<span id="endMarker"></span>
</div>
</div>
</body>
2)接下来,我添加了内容和容器的CSS样式,如下所示:
#container {
width: 240px;
overflow: hidden;
background-color: yellow;
}
#content {
position: relative;
height: 30em;
-moz-column-width: 240px;
-webkit-column-width: 240px;
column-width: 240px;
-moz-column-gap: 10px;
-webkit-column-gap: 10px;
column-gap: 10px;
}
现在,我想使用javascript找到文本(或一行)的列号?
还有其他问题,说明如何根据id获取列号。在我的例子中,没有id,唯一可用的是文本(或行),我需要通过搜索Html内容来获得列号。
目前,我有两个“解决方案”来获得列号,但它们是不完整的。
1)我可以通过使用window.find(text)
来找出文本是否存在,然后我就不知道该做什么了。
2)另一个选项是将带有id的<span>
临时添加到每一行并删除它。一旦添加,我就可以将列总数提高到该行(如下面所示)。
columnCount = Math.floor($('#marker').position().left/(columnWidth + columnGap));
如果将行扩展到另一列,这将给出错误的数字。
第二个解决方案是棘手的,书的内容是巨大的。我不认为这是获得列号的最好方法。我在找一个更简单的解决方案。
发布于 2017-05-31 02:44:59
试试这个,为你的问题做一个可行的版本。琴键
虽然OP没有用jQuery标记问题,但实际上在问题中使用了jQuery,我也使用它作为更干净的代码。(并与问题相符)
我在这个例子中所做的事情:
详细地说,我制作了临时DOM元素来计算列,然后将它们删除,以保持DOM树的整洁。
2017/6/1编辑:增加搜索文本的高亮颜色。
$('#find').click( () => {
var text = $('#findtext').val();
var columns = [];
var doms = [];
while (window.find(text, false)) {
var sel = window.getSelection();
if (sel) {
var range = sel.getRangeAt(0);
var el = document.createElement("span");
var frag = document.createDocumentFragment();
frag.appendChild(el);
range.insertNode(frag);
columns.push(Math.floor(el.offsetLeft/(_columnWidth + _columnGap)));
doms.push(el);
}
}
/// distinct
columns = columns.filter( (value, index, self) => self.indexOf(value) === index );
/// show result
$("#foundlist").empty();
for (var i=0; i<columns.length; i++)
$("#foundlist").append(`<li><a href="#" onclick="setColumn(${columns[i]})">Found in Column ${columns[i]+1}</a></li>`);
/// remove dom. keep dom tree clean
while (doms.length > 0) {
var dom = doms.pop();
dom.parentNode.removeChild(dom);
}
});
发布于 2017-05-26 14:40:23
与预先添加<span>
不同,您可以在找到文本的地方临时插入它,并在确定位置后再次删除它。
关键是如何在长文档中找到文本。此任务的接口是TreeWalker,它可以遍历DOM子树中的每个文本节点。
如何在文本节点中间插入元素是从这里复制的。
您的问题没有说明这一点,而是使用jQuery作为依赖项。这个解决方案只使用普通的DOM接口。
var columnWidth = 240,
columnGap = 10;
function getColumn(text) {
// the subtree to search in
var root = document.getElementById('content');
// define an iterator that only searches in text nodes
var treeWalker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT, {
// filter the text nodes to those containing the search text
acceptNode: function(node) {
if ( node.data.includes(text) ) {
return NodeFilter.FILTER_ACCEPT;
}
}
});
// look if there is a result
if (treeWalker.nextNode()) {
var node = treeWalker.currentNode;
// get start index of found text
var index = node.data.indexOf(text);
// and split into two nodes, referencing the second part
var foundTextNode = node.splitText(index);
// define an empty inline element
var span = document.createElement('span');
// insert it between the two text nodes
var elem = node.parentElement;
elem.insertBefore(span, foundTextNode);
// compute the column from the position of the element
// you might have to account for margins here
var x = span.getBoundingClientRect().left - root.getBoundingClientRect().left;
var column = Math.floor(x / (columnWidth + columnGap));
// restore previous state
elem.removeChild(span);
elem.normalize();
return column;
} else {
// no result
return false;
}
}
这个解决方案的明显限制是它找不到跨越多个节点的文本。所以,如果你有一个文本片段
<p>The quick brown fox <em>jumps</em> over the lazy dog.</p>
搜索“狐狸跳过去”找不到这句话。
https://stackoverflow.com/questions/44131044
复制相似问题