gpt4 book ai didi

javascript - 在 .html() 和 .text() 中获取高亮文本位置

转载 作者:数据小太阳 更新时间:2023-10-29 04:49:51 26 4
gpt4 key购买 nike

我正在使用以下脚本来获取突出显示文本的位置:

function getSelectionCharOffsetsWithin(element) {
var start = 0, end = 0;
var sel, range, priorRange;
if (typeof window.getSelection != "undefined") {
range = window.getSelection().getRangeAt(0);
priorRange = range.cloneRange();
priorRange.selectNodeContents(element);
priorRange.setEnd(range.startContainer, range.startOffset);
start = priorRange.toString().length;
end = start + range.toString().length;
} else if (typeof document.selection != "undefined" &&
(sel = document.selection).type != "Control") {
range = sel.createRange();
priorRange = document.body.createTextRange();
priorRange.moveToElementText(element);
priorRange.setEndPoint("EndToStart", range);
start = priorRange.text.length;
end = start + range.text.length;
}
return {
start: start,
end: end
};
}

function alertSelection() {
var mainDiv = document.getElementById("detailBoxParagraph");
var sel = getSelectionCharOffsetsWithin(mainDiv);
alert(sel.start + ": " + sel.end);
}

现在,如果我在 $('p').text() 上使用它, 其中包含

Lorem ipsum dolor sit amet, consetetur sadipscing elitr.

一切正常。但我还需要获得 $ ('p').html() 中的位置由于<b>,这显然是不同的标签

Lorem ipsum dolor `<b>sit</b>` amet, consetetur sadipscing elitr.

我该如何防止或改变这种情况?

编辑:

我忘了说,我的第一个想法是计算标 checkout 现的次数,然后使用该值来计算新位置,但不知何故这是愚蠢的。

我的第二种方法是用星号替换带有 .text() 的工作的标签。

编辑 #2

这是一个显示问题的杂乱 fiddle 。如果用鼠标突出显示文本,然后单击按钮,第一次它会正确设置为粗体。第二次将无法正常工作。

我会尽快收拾 fiddle

http://jsfiddle.net/UpLaw/2/

编辑 #3

我试了一下下面提到的突出显示插件,但我无法限制该功能只影响标记的字符串。它将突出显示所有匹配的单词或仅突出显示第一次出现的单词。谁能帮忙?

这是必要的代码:

jQuery.fn.highlight = function(pat) {
this.length = 1 ;

function innerHighlight(node, pat) {

var skip = 0;
if (node.nodeType == 3) {
var pos = node.data.toUpperCase().indexOf(pat);
if (pos >= 0) {
var spannode = document.createElement('span');
spannode.className = 'highlight';
var middlebit = node.splitText(pos);
var endbit = middlebit.splitText(pat.length);
var middleclone = middlebit.cloneNode(true);
spannode.appendChild(middleclone);
middlebit.parentNode.replaceChild(spannode, middlebit);
skip = 1;
}
}
else if (node.nodeType == 1 && node.childNodes && !/(script|style)/i.test(node.tagName)) {

for (var i = 0; i < 1; ++i) { // So it will highlight only the first occurence.
i += innerHighlight(node.childNodes[i], pat);
}
}
return skip;
}
return this.length && pat && pat.length ? this.each(function() {
innerHighlight(this, pat.toUpperCase());

}) : this;
};

编辑 #4

好的,我试着理解那个 javscript。据我所知,这是无法完成的,因为 highlight() 是用一个简单的字符串作为参数调用的。它无法知道这个字符串的位置。我可以/应该解析位置,然后尝试从该位置搜索,突出显示第一次出现的位置,然后中止吗?

最佳答案

根据您的评论,这就是您想要完成的。

i will try to explain this as good as i can. English is not my native language, so sorry for the confusion. I would like to insert a html-tag before and after the highlighted text. To achieve this, i will have to get the beginning and end of the text.

假设 sit 是您要处理的突出显示的选择。

您可以使用 .wrap() 或 .after() 和 .before() 来完成此操作。

function alertSelection() {
$("b", $('#detailBoxParagraph')).wrap('<i/>'); // make the highlighted section inside a tag.

$("b", $('#detailBoxParagraph')).before('<u>Content inserted before </u> '); // insert an html before highlighted selections.

$("b", $('#detailBoxParagraph')).after(' <u>Content inserted after </u>'); // insert an html after highlighted selections.
}

$(function () {
alertSelection();
})

这里我将突出显示的文本设为斜体。

参见 jsFiddle 中的示例

引用


如果你想完成选中文本的高亮显示,可以使用jQuery highlight插件。

参见 jsFiddle. 中的示例

function getSelectionText() {
var text = "";
if (window.getSelection) {
text = window.getSelection().toString();
} else if (document.selection && document.selection.type != "Control") {
text = document.selection.createRange().text;
}
return text;
}

$(function () {
$('#detailBoxParagraph').mouseup(function (e){
$(this).removeHighlight();
$(this).highlight(getSelectionText());
});
});

关于javascript - 在 .html() 和 .text() 中获取高亮文本位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16103157/

26 4 0