getSelection没有alt属性和脚本吗?

时间:2011-08-31 11:58:46

标签: javascript getselection

我正在使用window.getSelection()来获取所选文本。 但是,如果我也选择了一个图像,它也会返回一个图像。

实施例

<img src="someSrc.jpg" alt="image_alt" /> My text here ... 

如果我也选择图像,则返回

  

image_alt我的文字在这里......

但我只需要

  

我的文字在这里......

有没有办法只获得文字,没有alt?

非常感谢

2 个答案:

答案 0 :(得分:7)

试试这个:

window.getTextSelection = function() {
    //First get HTML Fragment of selection
    var html = window.getSelection().getRangeAt(0).cloneContents(); 
    //Return only the text
    return html.textContent||html.innerText;
}

在某些情况下,您只需通过CSS禁用用户选择: 您也可以通过禁用用户选择图像来实现此目的:

img {
        -webkit-user-select: none;
        -khtml-user-select: none;
        -moz-user-select: none;
        -o-user-select: none;
        user-select: none;
}

答案 1 :(得分:1)

最简单的方法是使用选择范围的toString()方法,这是在WHATWG's new Range spec的当前版本中指定window.getSelection().toString()的方法(尽管这是contrary to what some browsers do并且可能会也可能不会改变)。以下内容适用于多个选定范围(Mozilla支持)以及IE&lt; 9。

jsFiddle:http://jsfiddle.net/timdown/HkP2S/

代码:

function getSelectionRangeText() {
    var selText = "";
    if (window.getSelection) {
        var sel = window.getSelection(), rangeCount = sel.rangeCount;
        if (rangeCount) {
            for (var i = 0, rangeTexts = []; i < rangeCount; ++i) {
                rangeTexts.push("" + sel.getRangeAt(i));
            }
            selText = rangeTexts.join("");
        }
    } else if (document.selection && document.selection.type == "Text") {
        selText = document.selection.createRange().text;
    }
    return selText;
}

<强>更新

此解决方案包含<script><style>元素内的文字。要删除它,您可以在选择范围上使用cloneContents()并遍历生成的文档片段的DOM,仅从未包含在<script><style>元素中的文本节点收集文本。您还可以对此进行扩展,以删除具有CSS display: none的元素内部的文本。

jsFiddle:http://jsfiddle.net/timdown/HkP2S/2/

代码:

function getSelectionRangeText() {
    var selText = "", selTextParts = [];

    function getNodeText(node) {
        if (node.nodeType == 3) {
            selTextParts.push(node.data);
        } else if (node.hasChildNodes()
        && !(node.nodeType == 1 && /^(script|style)$/i.test(node.tagName))) {
            for (var child = node.firstChild; !!child; child = child.nextSibling) {
                getNodeText(child);
            }
        }
    }

    if (window.getSelection) {
        var sel = window.getSelection(), rangeCount = sel.rangeCount;
        if (rangeCount) {
            for (var i = 0; i < rangeCount; ++i) {
                getNodeText(sel.getRangeAt(i).cloneContents());
            }
            selText = selTextParts.join("");
        }
    } else if (document.selection && document.selection.type == "Text") {
        selText = document.selection.createRange().text;
    }
    return selText;
}