我想让用户点击一个链接,然后它在另一个元素(不是输入)中选择HTML文本。

我所说的“选择”是指通过拖动鼠标选择文本的相同方式。这一直是一个难以研究的问题,因为每个人都在谈论“选择”或“突出”。

这可能吗?到目前为止我的代码:

HTML:

<a href="javascript:" onclick="SelectText('xhtml-code')">Select Code</a>
<code id="xhtml-code">Some Code here </code>

JS:

function SelectText(element) {
    $("#" + element).select();
}

我是不是错过了什么显而易见的东西?


当前回答

我的特殊用例是在一个可编辑的span元素中选择一个文本范围,据我所知,这里的任何答案都没有描述。

主要的区别是你必须传递一个Text类型的节点给Range对象,就像Range. setstart()的文档中描述的那样:

如果startNode是Text, Comment或CDATASection类型的节点, 那么startOffset是从开始的字符数 startNode。对于其他Node类型,startOffset是子节点的编号 节点之间的startNode的开始。

Text节点是span元素的第一个子节点,因此要获取它,请访问span元素的childNodes[0]。其余部分与大多数其他答案相同。

下面是一个代码示例:

var startIndex = 1;
var endIndex = 5;
var element = document.getElementById("spanId");
var textNode = element.childNodes[0];

var range = document.createRange();
range.setStart(textNode, startIndex);
range.setEnd(textNode, endIndex);

var selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);

其他相关文件: 范围 选择 Document.createRange () Window.getSelection ()

其他回答

Tim的方法非常适合我的情况-在替换以下语句后,为IE和FF选择div中的文本:

range.moveToElementText(text);

与以下:

range.moveToElementText(el);

通过下面的jQuery函数点击它来选择div中的文本:

$(function () {
    $("#divFoo").click(function () {
        selectElementText(document.getElementById("divFoo"));
    })
});

这是另一个简单的解决方案,以字符串的形式获得选定的文本,你可以使用这个字符串很容易地追加一个div元素子元素到你的代码:

var text = '';

if (window.getSelection) {
    text = window.getSelection();

} else if (document.getSelection) {
    text = document.getSelection();

} else if (document.selection) {
    text = document.selection.createRange().text;
}

text = text.toString();

根据jQuery的select()文档:

触发每个匹配元素的选择事件。这将导致执行绑定到该选择事件的所有函数,并对匹配的元素调用浏览器的默认选择操作。

这就是为什么jQuery select()在这种情况下不起作用的原因。

Jason的代码不能用于iframe内的元素(因为作用域不同于window和document)。我修复了这个问题,我修改了它,以便用于任何其他jQuery插件(可链):

示例1:选择< code >标签内的所有文本,单击并添加类"selected":

$(function() {
    $("code").click(function() {
        $(this).selText().addClass("selected");
    });
});

例2:单击按钮,选择Iframe中的一个元素:

$(function() {
    $("button").click(function() {
        $("iframe").contents().find("#selectme").selText();
    });
});

注意:请记住iframe源应该位于同一个域中,以防止安全错误。

jQuery插件:

jQuery.fn.selText = function() {
    var obj = this[0];
    if ($.browser.msie) {
        var range = obj.offsetParent.createTextRange();
        range.moveToElementText(obj);
        range.select();
    } else if ($.browser.mozilla || $.browser.opera) {
        var selection = obj.ownerDocument.defaultView.getSelection();
        var range = obj.ownerDocument.createRange();
        range.selectNodeContents(obj);
        selection.removeAllRanges();
        selection.addRange(range);
    } else if ($.browser.safari) {
        var selection = obj.ownerDocument.defaultView.getSelection();
        selection.setBaseAndExtent(obj, 0, obj, 1);
    }
    return this;
}

我在IE8、Firefox、Opera、Safari和Chrome(目前的版本)中进行了测试。我不确定它是否适用于旧的IE版本(我真的不在乎)。

纯Javascript

function selectText(nodeId) { const node = document.getElementById(nodeId); if (document.body.createTextRange) { const range = document.body.createTextRange(); range.moveToElementText(node); range.select(); } else if (window.getSelection) { const selection = window.getSelection(); const range = document.createRange(); range.selectNodeContents(node); selection.removeAllRanges(); selection.addRange(range); } else { console.warn("Could not select text in node: Unsupported browser."); } } const clickable = document.querySelector('.click-me'); clickable.addEventListener('click', () => selectText('target')); <div id="target"><p>Some text goes here!</p><p>Moar text!</p></div> <p class="click-me">Click me!</p>

这里是一个工作演示。对于那些正在寻找jQuery插件的人,我也做了一个这样的插件。


jQuery(原始答案)

我在这篇文章中找到了一个解决方案。我能够修改给出的信息,并将其与jQuery混合在一起,创建一个完全很棒的函数来选择任何元素中的文本,而不管浏览器:

function SelectText(element) {
    var text = document.getElementById(element);
    if ($.browser.msie) {
        var range = document.body.createTextRange();
        range.moveToElementText(text);
        range.select();
    } else if ($.browser.mozilla || $.browser.opera) {
        var selection = window.getSelection();
        var range = document.createRange();
        range.selectNodeContents(text);
        selection.removeAllRanges();
        selection.addRange(range);
    } else if ($.browser.safari) {
        var selection = window.getSelection();
        selection.setBaseAndExtent(text, 0, text, 1);
    }
}