更新 #2
进行了更多测试。当我使用伪空间符时,代码看起来运行良好,但正则表达式最终失败。具体而言,以下情况有效:
- 选择
a
标签上方或下方的单词 - 仅选择直接在
a
标签上方或下方的一行 - 选择
a
标签上方/下方多行 - 选择任何
a
标签下方的多行
以下情况无效:
- 选择
a
标签上方的行/多行,然后选择a
标签下方的行/多行
当“不起作用”时,将从 DOM 中删除 a
标签空间符。这可能是正则表达式的问题...
基本上,当您选择围绕 a
标签的文本时,它会失败。
更新:
我不需要将每行都包装在一个 p
标签中,我可以使用内联元素,例如 a
、span
或 label
标签,带有 display:inline-block
和高度+宽度以充当新的行元素(<br />
)。这应该使修改代码更容易,因为唯一需要更改的部分是在边界之间获取文本的位置。我只需更改那个部分 selectedText.textContent
,就可以检索在边界内的 HTML 而不仅仅是文本。
我正在创建一个 Phonegap,需要用户选择文本。但是,我需要对文本选择进行精细控制,而不能再将整个文本内容放入样式化的 p
标签中。相反,我需要用类似于 <a class="space"></a>
的东西来表示换行,以便可以精确地突出显示正确单词。当我的文本如下时:
<p class="text">This is line one
Line two
Line three
</p>
如果有 .text{ white-space:pre-wrap }
,下面的代码允许我选择单词,然后用 span
元素包裹文本以显示高亮文本:
$("p").on("copy", highlight);
function highlight() {
var text = window.getSelection().toString();
var selection = window.getSelection().getRangeAt(0);
var selectedText = selection.extractContents();
var span = $("<span class='highlight'>" + selectedText.textContent + "</span>");
selection.insertNode(span[0]);
if (selectedText.childNodes[1] != undefined) {
$(selectedText.childNodes[1]).remove();
}
var txt = $('.text').html();
$('.text').html(txt.replace(/<\/span>(?:\s)*<span class="highlight">/g, ''));
$(".output ul").html("");
$(".text .highlight").each(function () {
$(".output ul").append("<li>" + $(this).text() + "</li>");
});
clearSelection();
}
function clearSelection() {
if (document.selection) {
document.selection.empty();
} else if (window.getSelection) {
window.getSelection().removeAllRanges();
}
}
这段代码非常好用,但是当每行之间由一个间隔标签分隔时就无法正常工作。新的文本看起来像这样:
<p class="text">
Line one
<a class="space"></a>
Line two
<a class="space"></a>
Line three
</p>
当我修改上面的代码以便让换行用
<a class="space"></a>
表示时,代码就失败了。它只检索文本选择部分的文本,而不是HTML (selectedText.textContent
)。我不确定正则表达式是否也会用一个 a
元素作为新行而失败。这个 a
元素可以是一个 span
或 label
, 或者任何通常内联定位的元素,以欺骗iOS允许我选择字母而不是块元素。有没有办法改变代码以保留新行元素呢?
jsFiddle: http://jsfiddle.net/charlescarver/39TZ9/3/
期望输出应该像这样:
如果高亮显示文本“第一行”:
<p class="text">
<span class="highlight">Line one</span>
<a class="space"></a>
Line two
<a class="space"></a>
Line three
</p>
如果高亮显示文本“Line one Line two”:
<p class="text">
<span class="highlight">Line one
<a class="space"></a>
Line two</span>
<a class="space"></a>
Line three
</p>
当然,不仅可以突出显示整行文本,还可以突出显示不同部分和单个字母。