gpt4 book ai didi

javascript - window.getSelection() 返回意外值

转载 作者:行者123 更新时间:2023-11-30 16:17:20 32 4
gpt4 key购买 nike

我正在使用带有 contenteditable 的 div 来制作文本编辑器。我觉得我在第一个障碍中失败了。

<html>
<head></head>
<body>
<input type="button" id="bold" value="B" />
<div id="wysiwyg" contenteditable="true" style="border:solid;width:500px;height:300px;"></div>

<script>
var bold = document.getElementById("bold");
var wysiwyg = document.getElementById("wysiwyg");

bold.addEventListener("click", function(){
update("<b>", "</b>");
});

function update(startTag, endTag){

//find the selected text
var selected_text = "";
if (window.getSelection) {
selected_text = window.getSelection();
} else if (document.getSelection) {
selected_text = document.getSelection();
} else if (document.selection) {
selected_text = document.selection.createRange().text;
}

//user could have selected in reverse, so we need to make sure the values are in correct order
var startPos = selected_text.anchorOffset >= selected_text.focusOffset ? selected_text.focusOffset : selected_text.anchorOffset;
var endPos = selected_text.focusOffset <= selected_text.anchorOffset ? selected_text.anchorOffset : selected_text.focusOffset;

if (startPos == endPos) //There is no selection
return;

var startText = wysiwyg.innerText.substr(0, startPos);
var textToWrap = wysiwyg.innerText.substr(startPos, endPos- startPos);
var endText = wysiwyg.innerText.substr(endPos);
wysiwyg.innerHTML = startText + startTag + textToWrap + endTag + endText;

}

</script>
</body>
</html>

如果您要执行此代码并在 div 中键入 3 个单词,选择中间的单词(用鼠标突出显示)然后单击屏幕上的 B 按钮(在 HTML 中),您会注意到程序执行如下所需的,因为它会使您突出显示的单词变为粗体。

如果您现在选择您键入的 3 个单词中的最后一个单词,并尝试将其设为粗体,您会注意到第一个单词变为粗体。

看看代码,我可以看到问题是 selected_text.anchorOffset 最初返回正确的值,但在后续请求中,它出错了(或者至少提供了一个我不知道的值明白)。

JSFIDDLE将演示这个问题!

为什么 window.getSelection 返回不正确的选定文本开始和结束位置?

最佳答案

没必要把它弄复杂。如果您支持 IE8 及更高版本的任何浏览器,则可以使用 execCommand功能。更新后的代码如下:

var bold = document.getElementById("bold");
var wysiwyg = document.getElementById("wysiwyg");

bold.addEventListener("click", function(){
document.execCommand('bold');
});

添加到答案中,如果您还没有弄清楚为什么您的代码不起作用。

首先,来自 MDN 的 focusOffset 或 anchorOffset 的定义(两者相似):

“Selection.focusOffset:Selection.focusOffset 只读属性返回选择的焦点在 Selection.focusNode 中偏移的字符数。”

让我们以文本为例:“将文本设为粗体”,我们每次都选择“粗体”。

第一次,它正确地计算了位置并将元素加粗。所以新文本看起来像“Make text <b>bold</b>”。

第二次,它从<b>开始计算位置标签。因此,它的 0-3 和文本将是“<b>Make<b/> text bold ”。

第三次,从</b>开始统计位置标签。因此,它的 6-9 和结果文本将是“Make t<b>ext </b>bold”。

第四次,从</b>开始统计位置标签。所以,又是0-3。因此,0-3 和 6-9 模式将一次又一次地重复。

关于javascript - window.getSelection() 返回意外值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35296102/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com