diff --git a/app/src/emoji/index.ts b/app/src/emoji/index.ts index 33f023fba..a28fe06e3 100644 --- a/app/src/emoji/index.ts +++ b/app/src/emoji/index.ts @@ -17,13 +17,13 @@ export const getRandomEmoji = () => { return emojis.items[getRandom(0, emojis.items.length - 1)].unicode; }; -export const unicode2Emoji = (unicode: string, assic = false, className = "", needSpan = false) => { +export const unicode2Emoji = (unicode: string, assic = false, className = "", needSpan = false, lazy = false) => { if (!unicode) { return ""; } let emoji = ""; if (unicode.indexOf(".") > -1) { - emoji = ``; + emoji = ``; } else if (isMobile() || window.siyuan.config.appearance.nativeEmoji || assic) { try { unicode.split("-").forEach(item => { @@ -66,6 +66,21 @@ ${unicode2Emoji(emoji.unicode, assic)}`; }); }; +export const lazyLoadEmojiImg = (element: Element) => { + const emojiIntersectionObserver = new IntersectionObserver((entries) => { + entries.forEach((entrie: IntersectionObserverEntry & { target: HTMLImageElement }) => { + const src = entrie.target.getAttribute("data-src"); + if ((typeof entrie.isIntersecting === "undefined" ? entrie.intersectionRatio !== 0 : entrie.isIntersecting) && src) { + entrie.target.src = src; + entrie.target.removeAttribute("data-src"); + } + }); + }); + element.querySelectorAll("img").forEach((panelElement) => { + emojiIntersectionObserver.observe(panelElement); + }); +} + export const filterEmoji = (key = "", max?: number, assic = false) => { let html = ""; const recentEmojis: { @@ -107,7 +122,7 @@ export const filterEmoji = (key = "", max?: number, assic = false) => { customStore.push(emoji); } else { keyHTML += ``; +${unicode2Emoji(emoji.unicode, assic, undefined, false, true)}`; } maxCount++; } @@ -117,7 +132,7 @@ ${unicode2Emoji(emoji.unicode, assic)}`; } if (index < 2) { html += ``; +${unicode2Emoji(emoji.unicode, assic, undefined, false, true)}`; } } }); @@ -142,7 +157,7 @@ ${unicode2Emoji(emoji.unicode, assic)}`; return 0; }).forEach(item => { html += ``; +${unicode2Emoji(item.unicode, assic, undefined, false, true)}`; }); html = html + keyHTML + ""; } @@ -153,7 +168,7 @@ ${unicode2Emoji(item.unicode, assic)}`; const emoji = recentEmojis.filter((item) => item.unicode === emojiUnicode); if (emoji[0]) { recentHTML += ``; } }); @@ -222,6 +237,7 @@ export const openEmojiPanel = (id: string, target: HTMLElement, isNotebook = fal if (inputElement.value === "") { lazyLoadEmoji(window.siyuan.menus.menu.element); } + lazyLoadEmojiImg(window.siyuan.menus.menu.element); }); inputElement.addEventListener("input", (event: InputEvent) => { if (event.isComposing) { @@ -238,6 +254,7 @@ export const openEmojiPanel = (id: string, target: HTMLElement, isNotebook = fal if (inputElement.value === "") { lazyLoadEmoji(window.siyuan.menus.menu.element); } + lazyLoadEmojiImg(window.siyuan.menus.menu.element); }); inputElement.addEventListener("keydown", (event: KeyboardEvent) => { if (event.isComposing) { @@ -316,6 +333,7 @@ export const openEmojiPanel = (id: string, target: HTMLElement, isNotebook = fal inputElement.focus(); } lazyLoadEmoji(window.siyuan.menus.menu.element); + lazyLoadEmojiImg(window.siyuan.menus.menu.element); // 不能使用 getEventName 否则 https://github.com/siyuan-note/siyuan/issues/5472 window.siyuan.menus.menu.element.firstElementChild.addEventListener("click", (event) => { const eventTarget = event.target as HTMLElement; diff --git a/app/src/protyle/hint/index.ts b/app/src/protyle/hint/index.ts index d34623485..067a2ddb2 100644 --- a/app/src/protyle/hint/index.ts +++ b/app/src/protyle/hint/index.ts @@ -20,7 +20,7 @@ import {imgMenu} from "../../menus/protyle"; import {hideElements} from "../ui/hideElements"; import {fetchPost} from "../../util/fetch"; import {getDisplayName, pathPosix} from "../../util/pathName"; -import {addEmoji, filterEmoji, lazyLoadEmoji, unicode2Emoji} from "../../emoji"; +import {addEmoji, filterEmoji, lazyLoadEmoji, lazyLoadEmojiImg, unicode2Emoji} from "../../emoji"; import {escapeHtml} from "../../util/escape"; import {blockRender} from "../markdown/blockRender"; import {uploadFiles} from "../upload"; @@ -331,6 +331,7 @@ ${unicode2Emoji(emoji.unicode, true)}`; } else { panelElement.nextElementSibling.classList.remove("fn__none"); } + lazyLoadEmojiImg(panelElement); } else { this.element.innerHTML = `
${filterEmoji(value, 256, true)}
@@ -348,6 +349,7 @@ ${unicode2Emoji(emoji.unicode, true)}`;
`; lazyLoadEmoji(this.element, true); + lazyLoadEmojiImg(this.element); } const firstEmojiElement = this.element.querySelector(".emojis__item"); if (firstEmojiElement) {