社区首页 >问答首页 >如何基于文本获取列号

如何基于文本获取列号
EN

Stack Overflow用户
提问于 2017-05-23 01:35:52
回答 2查看 1.2K关注 0票数 4

我使用eBook将Html内容(属于以下步骤 )划分为多个列。

1)我在容器中的内容中添加了HTML。

代码语言:javascript
代码运行次数:0
复制
<body>
<div id="container">
    <div id="content">

        BOOK HTML CONTENT

        <span id="endMarker"></span>
    </div>
</div>
</body>

2)接下来,我添加了内容和容器的CSS样式,如下所示:

代码语言:javascript
代码运行次数:0
复制
#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>临时添加到每一行并删除它。一旦添加,我就可以将列总数提高到该行(如下面所示)。

代码语言:javascript
代码运行次数:0
复制
columnCount = Math.floor($('#marker').position().left/(columnWidth + columnGap));

如果将行扩展到另一列,这将给出错误的数字。

第二个解决方案是棘手的,书的内容是巨大的。我不认为这是获得列号的最好方法。我在找一个更简单的解决方案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-31 02:44:59

试试这个,为你的问题做一个可行的版本。琴键

虽然OP没有用jQuery标记问题,但实际上在问题中使用了jQuery,我也使用它作为更干净的代码。(并与问题相符)

我在这个例子中所做的事情:

  1. 使一个长的内容跨越几个页面来可视化分页(使用css:列宽)。
  2. 单击“上一页/下一页”浏览页。
  3. 输入并单击“查找”按钮,使找到的文本突出显示。
  4. 列出在输入文本中找到的所有列(页)。
  5. 单击该链接并跳转到包含搜索文本的列。

详细地说,我制作了临时DOM元素来计算列,然后将它们删除,以保持DOM树的整洁。

2017/6/1编辑:增加搜索文本的高亮颜色。

代码语言:javascript
代码运行次数:0
复制
  $('#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);
    }
  });
票数 3
EN

Stack Overflow用户

发布于 2017-05-26 14:40:23

与预先添加<span>不同,您可以在找到文本的地方临时插入它,并在确定位置后再次删除它。

关键是如何在长文档中找到文本。此任务的接口是TreeWalker,它可以遍历DOM子树中的每个文本节点。

如何在文本节点中间插入元素是从这里复制的。

您的问题没有说明这一点,而是使用jQuery作为依赖项。这个解决方案只使用普通的DOM接口。

代码语言:javascript
代码运行次数:0
复制
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;
  }
}

这个解决方案的明显限制是它找不到跨越多个节点的文本。所以,如果你有一个文本片段

代码语言:javascript
代码运行次数:0
复制
<p>The quick brown fox <em>jumps</em> over the lazy dog.</p>

搜索“狐狸跳过去”找不到这句话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44131044

复制
相关文章
awk命令结构/内置变量/获取文本某行或某列
一个awk脚本通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块3部分组成,这三个部分是可选的。任意一个部分都可以不出现在脚本中,脚本通常是被单引号或双引号中,例如:
yiduwangkai
2019/09/17
2.2K0
如何获取公众号里面的歌曲
前段时间一首歌火了,是学弟学妹们自编自导的宿院版成都,唱出了我们这些毕业在异乡漂泊无比怀念母校的心声。 让我梦里遇见的 不止故乡的愁 可是不会保存这段音频啊 于是研究了一下,成功把这首歌曲收到了扣扣音
王小婷
2018/06/01
4.3K0
Python修改文本列对齐
letter                   ->              LadderScore0                   ->        LadderScore1                   ->        LadderScore2                   ->        LadderScore3                   ->        LadderScore4                   ->        LadderScor
py3study
2020/01/15
2.4K0
Python修改文本列对齐
ArcMap获取点要素在栅格图像中所处的行号与列号
  如下图所示,我们已知一张栅格图像以及其上的几个点要素;本文就以此数据为例,介绍获取点要素所处行列号的方法。
疯狂学习GIS
2022/12/18
2.8K0
ArcMap获取点要素在栅格图像中所处的行号与列号
Selenium Chrome Webdriver 如何获取 Youtube 悬停文本
Youtube 是一个非常流行的视频分享平台,有时候我们可能想要爬取一些视频的信息,比如标题、播放量、点赞数等。但是有些信息并不是直接显示在网页上的,而是需要我们将鼠标悬停在某个元素上才能看到,比如视频的时长、上传时间等。这些信息被称为悬停文本,它们是通过 JavaScript 动态生成的,所以我们不能用普通的 HTML 解析方法来获取它们。那么,我们该如何用爬虫来获取 Youtube 的悬停文本呢?本文将介绍一种方法,使用 Selenium Chrome Webdriver 来模拟浏览器操作,获取 Youtube 的悬停文本。
jackcode
2023/07/24
4020
Selenium Chrome Webdriver 如何获取 Youtube 悬停文本
通过QQ号获取绑定手机号
国内的手机号有十一位数字,从数学的角度上来说,包含了10^11种可能。如果遍历这10^11个数据,通过QQ中手机号查找QQ号的接口来寻找,未免太过费时费力,根据网上查到的资料,同一个QQ号,在十分钟内只能进行30次查询(未验证)。因此,直接遍历的方法不现实。
kobe
2021/12/12
38.1K12
问与答130:如何比较两列文本是否完全相同?
Q:最近,我的一项任务是需要比较包含多行数据的两列中,每行对应列的文本是否完全相同。例如,列A中有一系列文本,列B中也有一系列文本,比较A1中的文本是B1中的文本是否完全相同,A2与B2中的文本是否完全相同,……,等等。
fanjy
2021/08/31
2K0
在不确定列号的情况下如何使用Vlookup查找
合计之外的每一个单元格 都需要引用 除了最基础的等于=引用 我们还有一种更加万能的Vlookup+Match的方法 这样无论日期怎么变化 无论日期顺序是否能对上 我们都不用更改公式
但老师
2022/03/22
2.5K0
在不确定列号的情况下如何使用Vlookup查找
DataGridView 密码列(显示为*号)的设置
曾经为在DataGridView中设置密码列(显示为*号)而发愁,如何把Windows 窗体 DataGridView 的某一列的数据显示为“*”。
Java架构师必看
2021/03/22
2.3K0
python 根据csv表头、列号读取数据
设置index_col=0,目的是设置第一列name为index(索引),方便下面示例演示
lovelife110
2021/01/14
3.9K0
python 根据csv表头、列号读取数据
微信公众号-文本消息
说明:扫描测试平台上的二维码关注测试公众号,第一个数据类型错误是因为关注后进入公众号时的问题,后面会讲到关注和取消关注可以解决
星哥玩云
2022/09/14
6150
微信公众号-文本消息
文本溢出-超出文本显示为省略号
HTML5学堂:本文当中我们主要为大家讲解如何实现文本超出显示为省略号;同时讲解一下,在网页开发与制作的时候,我们什么时候应该考虑内容撑开宽高,又应该在何时考虑文本超出的问题。 实现文本超出显示为省略号 使用CSS实现元素的文本超出隐藏,通常存在两种方式,一种是超出直接隐藏内容,另一种是超出显示为省略号。 超出隐藏 超出隐藏,只需要为一个有固定宽高设置为overflow:hidden; 单行文本超出显示为省略号 实现代码如下: <style> .text-overflow { wid
HTML5学堂
2018/03/12
2.2K0
springboot 获取公众号Token 明文获取Controller
注释的地方为servlet开发方式,解开后参数修改为HttpServletRequest和HttpServletResponse
用户5899361
2020/12/07
1.3K0
uniapp获取手机号
<button open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">getPhoneNumber</button> image.p
达达前端
2020/08/20
4.9K0
JavaScript 基于HTML5 canvas 获取文本占用的像素宽度
基于HTML5 canvas 获取文本占用的像素宽度 直接上代码 // 获取单行文本的像素宽度 getTextPixelWith(text, fontStyle) { var canvas = document.createElement("canvas"); // 创建 canvas 画布 var context = canvas.getContext("2d"); // 获取 canvas 绘图上下文环境 context.font = fontStyle; // 设置字体样式,使用前设置好对应的 fo
授客
2019/12/12
1.9K0
如何获取微信视频号的地址(微信公众号的链接地址)
有了这个信息,就可以通过<objectId><![CDATA[13792200214367967426]]></objectId>和<objectNonceId><![CDATA[12052175326133612216_4_20_13_1]]></objectNonceId>中的值获取到视频的源地址了。
全栈程序员站长
2022/08/01
10.6K1
教你如何获取微信公众号历史文章链接
获取这个链接还是很有用的,想想当你的微信号只是个人订阅号的时候,但是你又开启了开发配置接口,这样你公众号下面的菜单就失效了,为了让用户看到你的文章,这时候这个链接就派上用场啦。
PHP学习网
2022/08/03
2.6K0
教你如何获取微信公众号历史文章链接
​微信小程序如何获取用户手机号 ?
1、小程序端调用 wx.login() 方法,获取 code 后,将 code 通过后台 api 接口传递到后台。
热心的程序员
2020/03/09
9.8K1
​微信小程序如何获取用户手机号 ?
微信小程序如何获取用户手机号 ?
1、小程序端调用 wx.login() 方法,获取 code 后,将 code 通过后台 api 接口传递到后台。
热心的程序员
2020/03/20
9.1K2
点击加载更多

相似问题

如何根据文本获取具体的列号

39

基于元素号获取行、列和深度

12

基于其他列的自动列号

12

基于列号的条件子集

30

如何获取文本代码号Python Selenium

15
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文