Vanessa 2024-12-28 19:05:24 +08:00
parent cd16c7c548
commit ffdcb4d57e
3 changed files with 20 additions and 20 deletions

View file

@ -380,7 +380,7 @@ export const setFirstNodeRange = (editElement: Element, range: Range) => {
return range;
};
export const focusByOffset = (container: Element, start: number, end: number) => {
export const focusByOffset = (container: Element, start: number, end: number, isFocus = true) => {
if (!container) {
return false;
}
@ -448,10 +448,22 @@ export const focusByOffset = (container: Element, start: number, end: number) =>
setLastNodeRange(getContenteditableElement(container as Element), range, false);
}
}
focusByRange(range);
if (isFocus) {
focusByRange(range);
}
return range;
};
export const setInsertWbrHTML = (nodeElement: HTMLElement, range: Range, protyle: IProtyle) => {
const offset = getSelectionOffset(nodeElement, nodeElement, range)
const cloneNode = nodeElement.cloneNode(true) as HTMLElement;
const cloneRange = focusByOffset(cloneNode, offset.end, offset.end, false);
if (cloneRange) {
cloneRange.insertNode(document.createElement("wbr"));
}
protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] = cloneNode.outerHTML;
}
export const focusByWbr = (element: Element, range: Range) => {
const wbrElements = element.querySelectorAll("wbr");
if (wbrElements.length === 0) {

View file

@ -14,7 +14,7 @@ import {
focusSideBlock,
getEditorRange,
getSelectionOffset,
setFirstNodeRange,
setFirstNodeRange, setInsertWbrHTML,
setLastNodeRange,
} from "../util/selection";
import {Constants} from "../../constants";
@ -673,7 +673,7 @@ export class WYSIWYG {
const imgElement = dragElement.parentElement.parentElement;
if (dragElement.tagName === "IMG") {
img3115(imgElement);
img3115(imgElement);
}
documentSelf.onmousemove = (moveEvent: MouseEvent) => {
if (dragElement.tagName === "IMG") {
@ -2011,9 +2011,7 @@ export class WYSIWYG {
const range = getEditorRange(protyle.wysiwyg.element);
const nodeElement = hasClosestBlock(range.startContainer);
if (!isMac() && nodeElement) {
range.insertNode(document.createElement("wbr"));
protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] = nodeElement.outerHTML;
nodeElement.querySelector("wbr").remove();
setInsertWbrHTML(nodeElement, range, protyle);
}
event.stopPropagation();
});
@ -2097,9 +2095,7 @@ export class WYSIWYG {
// 微软双拼 keyup 会记录拼音字符,因此在 compositionstart 记录
!isComposition &&
(typeof protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] === "undefined" || range.toString() !== "" || !this.preventKeyup)) {
range.insertNode(document.createElement("wbr"));
protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] = nodeElement.outerHTML;
nodeElement.querySelector("wbr").remove();
setInsertWbrHTML(nodeElement, range, protyle);
}
this.preventKeyup = false;
return;

View file

@ -8,7 +8,7 @@ import {
getSelectionOffset,
getSelectionPosition,
selectAll,
setFirstNodeRange,
setFirstNodeRange, setInsertWbrHTML,
setLastNodeRange,
} from "../util/selection";
import {
@ -169,15 +169,7 @@ export const keydown = (protyle: IProtyle, editorElement: HTMLElement) => {
!isNotEditBlock(nodeElement) && !/^F\d{1,2}$/.test(event.key) &&
// 微软双拼使用 compositionstart否则 focusByRange 导致无法输入文字
event.key !== "Process") {
const cloneRange = range.cloneRange();
range.collapse(false);
range.insertNode(document.createElement("wbr"));
protyle.wysiwyg.lastHTMLs[nodeElement.getAttribute("data-node-id")] = nodeElement.outerHTML;
nodeElement.querySelector("wbr").remove();
// 光标位于引用结尾后 ctrl+b 偶尔会失效
range = cloneRange;
focusByRange(cloneRange);
protyle.toolbar.range = cloneRange;
setInsertWbrHTML(nodeElement, range, protyle);
protyle.wysiwyg.preventKeyup = true;
}