【问题标题】:Selecting Text through JavaScript通过 JavaScript 选择文本
【发布时间】:2012-08-06 04:13:45
【问题描述】:

我想选择 Html 页面上的文本并将其设为粗体,我正在使用以下代码

<script type="text/javascript" >


function getSelectedText(){ 
    if(window.getSelection){   ;
        return window.getSelection().toString(); 
    } 
    else if(document.getSelection){;
        return document.getSelection(); 
    } 
    else if(document.selection){ ;

        return document.selection.createRange().text; 
    } 
} 
$(document).ready(function(){
 $("*").live("mouseup",
    function() {
        selection = getSelectedText(); 
        alert(selection);
        if(selection.length >= 3) {

            $(this).html($(this).html().replace(selection, "<b>" + selection + "</b>") );

        }       
    }
); 
});

</script>

此代码工作正常但是当文本位于两个不同的段落/ Div 或文本之间存在链接时,它似乎不起作用。

我怎样才能让它工作?

【问题讨论】:

  • 以某种方式从 javascript 启动浏览器搜索 (Ctrl+F) 怎么样?但是,我不知道如何从 javascript 中做到这一点。
  • 您也只想选择文本或附加标签?选择它的目的是什么?如果您解释了您想对文本做什么,将会有所帮助。
  • @pea window.find(string)
  • 这对于仅获取所选文本但不会告诉您有关包含该文本的 HTML 元素的任何信息都可以正常工作。你到底想要什么?
  • @All - 它是一个简单的程序,我只想将所选文本显示在屏幕上。 But when Two different paragraphs are selected then This Code doesn't seem to work ...

标签: javascript jquery html dom selection


【解决方案1】:

如果您想对当前选择进行某种突出显示,使用内置的document.execCommand() 是最简单的方法。它适用于所有主流浏览器。

以下内容应该对任何选择执行您想要的操作,包括跨越多个元素的选择。在非 IE 浏览器中,它会打开 designMode,应用背景颜色,然后再次关闭 designMode

更新

固定在 IE 9 中工作。

function makeEditableAndHighlight(colour) {
    var range, sel = window.getSelection();
    if (sel.rangeCount && sel.getRangeAt) {
        range = sel.getRangeAt(0);
    }
    document.designMode = "on";
    if (range) {
        sel.removeAllRanges();
        sel.addRange(range);
    }
    // Use HiliteColor since some browsers apply BackColor to the whole block
    if (!document.execCommand("HiliteColor", false, colour)) {
        document.execCommand("BackColor", false, colour);
    }
    document.designMode = "off";
}

function highlightSelection(colour) {
    var range;
    if (window.getSelection) {
        // IE9 and non-IE
        try {
            if (!document.execCommand("BackColor", false, colour)) {
                makeEditableAndHighlight(colour);
            }
        } catch (ex) {
            makeEditableAndHighlight(colour)
        }
    } else if (document.selection && document.selection.createRange) {
        // IE <= 8 case
        range = document.selection.createRange();
        range.execCommand("BackColor", false, colour);
    }
}

document.onmouseup = function() {
    highlightSelection("red");
};

现场示例:http://jsfiddle.net/eBqBU/9/

【讨论】:

  • 我无法让它工作......我这样调用你的函数 ====$("*").live("mouseup", function() { selection = highlightSelection(red ) ;
  • @Adi:对我来说很好用。您需要在“红色”周围添加引号。我已经用一个例子和一个活生生的例子更新了我的答案。
  • 哇!!!雅虎!!有效 !!有效!! :D 干得好!!最后一个问题.. 有没有一种方法可以使用我自己的 CSS 进行突出显示,我写的代码可以通过以下行 $(this).html($(this).html ().replace(selection, "" + selection + "") );
  • @Adi:在浏览器中没有什么可做的。您需要遍历选择中的节点并用您的跨度包围每个节点,这以跨浏览器的方式执行相当复杂。您可以使用我的 Rangy 库和它的 CSS 类应用程序模块来执行此操作:code.google.com/p/rangy/wiki/CSSClassApplierModule
  • @Adi:基本步骤是: 1. 在选择的开始和结束处分割文本节点; 2. 创建一个包含在范围内的文本节点数组,以及 3. 将每个文本节点包围在 &lt;span&gt; 中(除非它已经包含在具有相关类的跨度中)。
【解决方案2】:
a=document.getElementById('elementID').innerHTML;

变量 'a' 将获取元素内任何 id 为 'elementID' 的字符串值。

这样好吗?

【讨论】:

  • 先生,我想获取我用鼠标选择的内容,例如维基百科的页面。我希望当我单击并将鼠标拖动到返回的 2 个段落(选择文本)上时。我上面提到的代码在选择的内容跨两个不同的段落或超链接在我选择的文本之间的位置时无效。
【解决方案3】:

您需要的一切(基于您的 cmets)都可以在这里找到:http://www.awesomehighlighter.com/webliter.js

我没有时间提取相关部分,但请查看 Webliter.prototype.highlight 中的示例(只需在该文件中搜索即可)

您也可以使用 jQuery,例如这个插件:http://johannburkard.de/blog/programming/javascript/highlight-javascript-text-higlighting-jquery-plugin.html

【讨论】:

  • 先生,您提供的突出显示链接将根据在文档中搜索的所有值突出显示,而我希望它突出显示我选择的内容。先生,请执行我写的代码:)
  • @Adi 我认为给你代码的人更有可能弄清楚这一点。 :)
  • 它的所有实验代码...搜索这里和那里添加和修改得到该代码:D
猜你喜欢
  • 2011-05-06
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多