JavaScript - 如何在文档中获取当前选择“索引”

时间:2010-10-27 07:39:39

标签: javascript

此处的代码返回iFrame中的JavaScript选择对象(iFrame页面位于同一个域中,因此没有xss问题)。

我需要知道的是原始 html代码(不是dom)中的选择索引。

更新

E.g。

如果您有html doc:

<html><body>ABC</body></html>

在UI中,用户使用鼠标选择文本“ABC”,我希望能够使用JavaScript来确定html源中所选文本的位置。在这种情况下,ABC的索引是13。

更新2

我坚持这种疯狂的原因是,我需要创建一个工具,可以根据用户之前识别的选定文本重新访问页面并拉取文本。用户告诉系统文本的位置,从那时起系统使用正则表达式来拉取文本。现在,如果dom与原始html不同,并且无法确定原始html中的选择 - 那么很难知道reg ex会产生什么。我不认为还有另一种解决方法。

// Returns the raw selection object currently
        // selected in the UI
        function getCurrentSelection() {

            var selection = null;

            var iFrame = document.getElementById('uc_iFrameGetPriceData');

            try {

                if (window.getSelection) { // Gecko

                    selection = iFrame.contentWindow.getSelection();
                }
                else { // IE

                    var iframeDoc = iFrame.contentWindow.document;

                    if (iframeDoc.selection) {

                        selection = iframeDoc.selection;
                    }
                    else {

                        selection = iframeDoc.contentWindow.getSelection();
                    }
                }
            }
            catch (err) {

                alert( 'Error: getCurrentSelection() - ' + err.description )

            }

            return selection;
        }

4 个答案:

答案 0 :(得分:1)

您可以使用selection.anchorOffsetselection.focusOffset来访问所选内容的索引和偏移量。

看看这个: http://help.dottoro.com/ljjmnrqr.php

这是另一篇很好的解释文章: http://www.quirksmode.org/dom/range_intro.html

更新到您的更新:我不确定您为什么要尝试获取原始HTML代码的索引。但是你可以根据选择这样选择DOM:

selection.anchorNode.nodeValue.replace(selection.anchorNode.nodeValue.substring(selection.anchorOffset, selection.focusOffset), 'replace value')

请注意,anchorOffset仍然可能在focusOffset之前,具体取决于您是从左到右还是从右到左选择了文字。

答案 1 :(得分:0)

如果我理解正确,你会想要在DOM中移动。在这种情况下,您可以使用以下方法/属性:

  • parentNode
  • getChildNodes()
  • firstChildlastChild

......这些链接可能有所帮助:

http://www.codingforums.com/archive/index.php/t-81035.html

http://www.sitepoint.com/forums/showthread.php?t=586034

最快的方式可能是

var node = document.getElementById('myElement'); alert(node.parentNode.indexOf(node));

(抱歉,由于某种原因格式化按钮没有出现在我的“你的答案”区域......)

答案 2 :(得分:0)

如果有这些信息,我会感到惊讶。

没有DOM API可以区分

<html><body>ABC</body></html>

<html    ><body      >ABC</body></html>

原始HTML中的索引在每种情况下都不同,但构造的DOM是相同的。

答案 3 :(得分:0)

你不能理智地做到这一点:唯一可能的方法是通过Ajax重新下载页面的HTML,解析HTML并将生成的DOM与当前的DOM相匹配,这些DOM本身可能已被JavaScript改变。此外,它无论如何都不是一个有用的数字,因为一旦加载了页面,原始HTML字符串就不再存在于DOM中,因此该字符串中的偏移在JavaScript中没有任何意义。从节点和偏移方面进行选择更为明智。