更新#2
好的,接下来会进行更多测试。当我使用人造垫片时,看起来代码工作正常,但正则表达式最终失败。具体来说,以下场景有效:
a
选择标签上方或下方的单词a
您只选择标签正上方或正下方的一行a
您在标签上方/下方选择了多行a
您在任何标签下方选择了多行
以下场景不起作用:
- 您选择标签上方的行/多行,然后选择标签
a
下方的行/多行a
当它“不起作用”时会发生什么,它会a
从 DOM 中删除标签间隔。这可能是正则表达式的问题......
基本上a
,当您选择标签周围的文本时,它会失败。
更新:
我不需要将每一行包装在一个p
标签中,我可以使用一个内联元素,例如一个a
、、span
或label
标签,display:inline-block
以及一个高度 + 宽度作为一个新的行元素 ( <br />
)。这应该使修改代码更容易,因为唯一需要更改的部分是我在边界之间获取文本的位置。我应该只需要更改那部分 ,selectedText.textContent
来检索也在边界内的 HTML,而不仅仅是文本。
我正在创建一个要求用户选择文本的 Phonegap。但是,我需要对文本选择进行精细控制,并且不能再将整个文本内容放入pre
样式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
orlabel
或任何通常内联定位的元素,以欺骗 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>
如果突出显示文本“第一行第二行”:
<p class="text">
<span class="highlight">Line one
<a class="space"></a>
Line two</span>
<a class="space"></a>
Line three
</p>
当然,不同的部分和单个字母也可以并且将被突出显示,而不是整行。