【问题标题】:Get all text in a bounding rectangle获取边界矩形中的所有文本
【发布时间】:2016-07-07 17:32:16
【问题描述】:

我制作了一个区域选择器工具,它在屏幕上创建一个矩形并给出坐标(顶部、左侧、宽度和高度)。基本上我想在该矩形内获取所有(并且唯一)可见文本。此外,它应该是准确的文字,没有重复。

这就是我制作区域的方式:

我正在尝试这样的事情:

            var top = parseInt($('#selectionn33').css('top')) 
            var left = parseInt($('#selectionn33').css('left')) 
            var width = parseInt($('#selectionn33').css('width')) 
            var height = parseInt($('#selectionn33').css('height')) 

            var items = document.getElementsByTagName("*");
            for (var i = items.length; i--;) 
            {
                var rect = items[i].getBoundingClientRect();
                if(rect.top >= top && rect.top <= (top + height))
                {
                    if(rect.left >= left && rect.left <= (left + width))
                    {
                        console.log(items[i].textContent);
                    }
                }
            }

但它会收到很多我不想要的文本,例如来自符合条件但位于矩形之外的元素的文本。

有什么想法可以做到这一点吗?

【问题讨论】:

  • 如果您使用已知大小的固定宽度字体,是否可以在获取所有文本后将不属于矩形的文本中的字符修剪掉?
  • 绝对没有简单的方法可以做到这一点。我最好的建议是使用Range.getBoundingClientRect() 并迭代设置范围的开始和结束,随时进行测试。这会很快变得丑陋且缓慢,但应该是可能的。
  • 一个元素如何满足条件但在矩形之外?您想根据选择边框裁剪每一行文本吗?还是只有完全适合选择的元素?在从多个元素收集文本之后,您希望如何组织文本?您能否上传一张图片,详细说明预期的行为?
  • 没错,如下图所示,我做了一个矩形区域选择工具。我想获取该矩形内的所有文本。 i.imgur.com/oT0MwPC.jpg
  • 我会接受@nrabinowitz 告诉你的,也许结合Range.caretRangeFromPoint 你可以实现一些不那么丑陋但仍然很重的东西。

标签: javascript html


【解决方案1】:

您应该能够获得完全在选择中的元素,如您的评论中所述,只需对您的代码进行很少的更改。基本上,您将获得选择中左上角的元素。您需要确保右下角也在选择范围内:

var $selection = $('#selection33');
var top = parseInt($selection.css('top')); 
var left = parseInt($selection.css('left')); 
var right = left + parseInt($selection.css('width')); 
var bottom = top + parseInt($selection.css('height')); 

var items = document.getElementsByTagName("*");
for (var i = items.length - 1; i >= 0; i--) {
  var rect = items[i].getBoundingClientRect();
  if(
    rect.top >= top && rect.bottom <= bottom &&
    rect.left >= left && rect.right <= right
  ) {
       try
       {
           found = items[i].childNodes[0].nodeValue;
       }
           catch(err)
       {
           found = items[i].textContent;
       }
  }
}

【讨论】:

  • 我认为这更好,虽然我认为它可能会错过一些可能在矩形内显示文本的元素,但它的实际元素超出了它。不过还没有遇到过。但是这种情况正在发生,如果你看视频,它可能是重复的文本,可能是因为父母将孩子的文本视为他们的。 tryna.get.a.handbeezy.com/2016-07-06_21-42-34.mp4
  • 这是一个非常复杂的场景,有很多可能性。您应该真正考虑一下您的需求,并使用更多详细信息更新您的问题。
  • 话虽如此,您可以在计算中包含填充,以获取超出选择范围的元素,并检查嵌套元素以避免重复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多