【问题标题】:Strange behavior of selection奇怪的选择行为
【发布时间】:2010-10-05 08:29:00
【问题描述】:

我的 JS 代码:


    function getSelectedText(){
      if(window.getSelection){
          select = window.getSelection().getRangeAt(0);
                  var st_span = select.startContainer.parentNode.getAttribute("id").split("_")[1];
                  var end_span = select.endContainer.parentNode.getAttribute("id").split("_")[1];
                  console.log(select.endContainer);
                  var ret_urn=[st_span,end_span];
                  return ret_urn
      }
      else if(document.getSelection){
          return document.getSelection();
      }

    }
    $(document).ready(function() {
      $("div#check_button button").click(function () {
                      var loc = getSelectedText();
                      console.log(loc);
                      });
    });
    

这是我的整个 html 文件:http://pastebin.com/acdiU623

很难解释,所以准备了短片:http://www.youtube.com/watch?v=tVk4K70JO80

简而言之:当我按住鼠标左键选择文本/数字并从字母/数字的一半开始选择时,虽然这个字母/数字没有突出显示,但它被添加到选择中。我必须精确地开始选择。宽字母没问题,但像 i、j 或 l 这样的字母很难。

这是我的电影的第二个例子。我在数字 5 长度的 3/4 处按下了左键,虽然 5 没有突出显示,但它被选中了。

在 FF 和 Opera 上测试。

【问题讨论】:

  • 有趣的问题,我无能为力帮助,但 +1 让我感兴趣。 =)
  • 啊哈,这很卑鄙。但这里也一样。

标签: javascript jquery selection range


【解决方案1】:

好的,刚刚尝试了这个演示。它完美无瑕。它甚至可以在 Firefox 上运行。刚刚测试了歌剧和野生动物园,它也适用于它们。即使我选择了半个字母或数字,它也只会返回突出显示的文本,这是您进行选择时所期望的。

在一个新的网页上尝试一下,尽管只是为了测试目的。然后当它工作并且您对结果感到满意时,然后开始对现有页面进行更改。

它比您的代码简单得多。这是一个跨浏览器脚本,用于获取用户选择的文本

<script language=javascript>
function getSelText()
{
    var txt = '';
     if (window.getSelection)
    {
        txt = window.getSelection();
             }
    else if (document.getSelection)
    {
        txt = document.getSelection();
            }
    else if (document.selection)
    {
        txt = document.selection.createRange().text;
            }
    else return;
document.aform.selectedtext.value =  txt;
}
</script>
<input type="button" value="Get selection" onmousedown="getSelText()"> 
<form name=aform >
<textarea name="selectedtext" rows="5" cols="20"></textarea>
</form>

http://www.codetoad.com/javascript_get_selected_text.asp

希望这会有所帮助。

PK

【讨论】:

  • window.getSelection()document.getSelection() 都返回 Selection 对象,而不是字符串。确保在此对象上调用 toString(),无论是显式 (txt = window.getSelection().toString()) 还是隐式 (txt = "" + window.getSelection())。
  • 没错。你必须调用 toString() 来获取文本。所以你可以按照蒂姆说的去做。非常感谢这个插件。
  • 谢谢你的想法!但我必须获得选择开始和结束时 span 的 id 属性的值。我使用 span 因为我需要样式。我添加了 console.log( txt.anchorNode.parentNode.getAttribute("id")) 到您的 js,插入 document.aform.[...]。问题仍然存在。电影:youtube.com/watch?v=CLbKmscGZ2I&videoformat=480p。我认为 Tim Down 找到了原因。但是你知道解决方案吗...:)?
  • 正如我所说,请将此代码与您在新页面上的代码分开尝试。在干净的空白画布上从新鲜开始。大声笑它会有所帮助。同样在每个 if 语句中将其更改为 txt = window.getSelection().toString() 并确保 txt 是一个字符串。而不是 document.aform.selectedtext.value = txt;
【解决方案2】:

对于一个选择有多个不同的边界点,在用户看来它们是相同的。您看到的可能是以下内容之间的区别,其中| 是选择边界:

<span>5</span><span>|6</span><span>7|</span><span>8</span>

<span>5|</span><span>6</span><span>7</span><span>|8</span>

在这两种情况下,对所选内容调用 toString() 会得到相同的结果(“67”)。

【讨论】:

  • 看来这就是这种行为的原因。你知道如何处理吗?
  • 你真正想要达到什么目的?
  • 每个字符都在单独的范围内。每个跨度都有不同的 id。我想从选择开始和结束时的跨度中提取这个 id。我需要不同的 ID,因为我必须识别每个跨度。
  • 好的,但是你想如何“处理”这个?事实是选择边界就在它们所在的位置。您是否正在寻找包含所选内容中第一个和最后一个文本字符的元素?
猜你喜欢
  • 2013-01-29
  • 2014-05-28
  • 1970-01-01
  • 2011-08-19
  • 2013-04-27
  • 2015-07-13
  • 1970-01-01
  • 2012-10-17
  • 1970-01-01
相关资源
最近更新 更多