diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts index 059c0d341..0208e38f8 100644 --- a/app/src/menus/commonMenuItem.ts +++ b/app/src/menus/commonMenuItem.ts @@ -8,7 +8,7 @@ import {isLocalPath, movePathTo, pathPosix} from "../util/pathName"; import {MenuItem} from "./Menu"; import {hasClosestByClassName} from "../protyle/util/hasClosest"; import {saveExport} from "../protyle/export"; -import {writeText} from "../protyle/util/compatibility"; +import {openByMobile, writeText} from "../protyle/util/compatibility"; import {fetchPost} from "../util/fetch"; import {hideMessage, showMessage} from "../dialog/message"; import {Dialog} from "../dialog"; @@ -652,13 +652,7 @@ export const exportMd = (id: string) => { id, }, response => { hideMessage(msgId); - if (window.siyuan.config.system.container === "ios") { - window.location.href = response.data.zip; - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { - window.JSAndroid.openExternal(response.data.zip); - } else { - window.open(response.data.zip); - } + openByMobile(response.data.zip); }); } }, { @@ -670,13 +664,7 @@ export const exportMd = (id: string) => { id, }, response => { hideMessage(msgId); - if (window.siyuan.config.system.container === "ios") { - window.location.href = response.data.zip; - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { - window.JSAndroid.openExternal(response.data.zip); - } else { - window.open(response.data.zip); - } + openByMobile(response.data.zip); }); } }, @@ -774,13 +762,7 @@ export const openMenu = (src: string, onlyMenu = false) => { label: window.siyuan.languages.useBrowserView, accelerator: "Click", click: () => { - if (window.siyuan.config.system.container === "ios") { - window.location.href = src; - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { - window.JSAndroid.openExternal(src); - } else { - window.open(src); - } + openByMobile(src); } }); /// #endif diff --git a/app/src/menus/protyle.ts b/app/src/menus/protyle.ts index bd410dbe9..c5e7d7c60 100644 --- a/app/src/menus/protyle.ts +++ b/app/src/menus/protyle.ts @@ -579,8 +579,11 @@ export const imgMenu = (protyle: IProtyle, range: Range, assetElement: HTMLEleme genImageWidthMenu(window.siyuan.languages.default, assetElement, imgElement, protyle, id, nodeElement, html), ] }).element); - window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element); - openMenu(imgElement.getAttribute("src")); + const imgSrc = imgElement.getAttribute("src") + if (imgSrc) { + window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element); + openMenu(imgSrc); + } window.siyuan.menus.menu.popup({x: position.clientX, y: position.clientY}); window.siyuan.menus.menu.element.querySelector("input").focus(); }; @@ -736,7 +739,9 @@ export const linkMenu = (protyle: IProtyle, linkElement: HTMLElement, focusText } }).element); } - openMenu(linkAddress); + if (linkAddress) { + openMenu(linkAddress); + } window.siyuan.menus.menu.element.classList.remove("fn__none"); if (focusText || protyle.lute.IsValidLinkDest(linkAddress)) { window.siyuan.menus.menu.element.querySelectorAll("input")[1].select(); @@ -812,10 +817,15 @@ export const iframeMenu = (protyle: IProtyle, nodeElement: Element) => { event.stopPropagation(); }); } - }, { - type: "separator" }]; - return subMenus.concat(openMenu(iframeElement.getAttribute("src") || "", true) as IMenu[]); + const iframeSrc = iframeElement.getAttribute("src"); + if (iframeSrc) { + subMenus.push({ + type: "separator" + }) + return subMenus.concat(openMenu(iframeSrc, true) as IMenu[]); + } + return subMenus; }; export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string) => { @@ -833,11 +843,12 @@ export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string) event.stopPropagation(); }); } - }, { - type: "separator" }]; const src = videoElement.getAttribute("src"); if (src.startsWith("assets/")) { + subMenus.push({ + type: "separator" + }) subMenus.push({ label: window.siyuan.languages.rename, click() { @@ -845,7 +856,11 @@ export const videoMenu = (protyle: IProtyle, nodeElement: Element, type: string) } }); } - return subMenus.concat(openMenu(videoElement.getAttribute("src"), true) as IMenu[]); + const VideoSrc = videoElement.getAttribute("src"); + if (VideoSrc) { + return subMenus.concat(openMenu(VideoSrc, true) as IMenu[]); + } + return subMenus; }; export const tableMenu = (protyle: IProtyle, nodeElement: Element, cellElement: HTMLTableCellElement, range: Range) => { diff --git a/app/src/mobile/util/menu.ts b/app/src/mobile/util/menu.ts index 1e8ddaaea..3be8e1d9b 100644 --- a/app/src/mobile/util/menu.ts +++ b/app/src/mobile/util/menu.ts @@ -1,5 +1,5 @@ import {fetchPost} from "../../util/fetch"; -import {getEventName, writeText} from "../../protyle/util/compatibility"; +import {getEventName, openByMobile, writeText} from "../../protyle/util/compatibility"; import {popSearch} from "./search"; import {initAppearance} from "../settings/appearance"; import {closePanel} from "./closePanel"; @@ -382,11 +382,7 @@ ${accountHTML} }); modelMainElement.querySelector("#exportData").addEventListener("click", () => { fetchPost("/api/export/exportData", {}, response => { - if (window.JSAndroid) { - window.JSAndroid.openExternal(response.data.zip); - return; - } - window.location.href = response.data.zip; + openByMobile(response.data.zip); }); }); modelMainElement.querySelector("#importData").addEventListener("change", (event: InputEvent & { target: HTMLInputElement }) => { diff --git a/app/src/protyle/preview/index.ts b/app/src/protyle/preview/index.ts index 1f507cb88..059dcad1d 100644 --- a/app/src/protyle/preview/index.ts +++ b/app/src/protyle/preview/index.ts @@ -1,4 +1,4 @@ -import {getEventName, writeText} from "../util/compatibility"; +import {getEventName, openByMobile, writeText} from "../util/compatibility"; import {hasClosestByTag} from "../util/hasClosest"; import {focusByRange} from "../util/selection"; import {showMessage} from "../../dialog/message"; @@ -38,11 +38,9 @@ export class Preview { if (event.target.tagName === "A") { const linkAddress = event.target.getAttribute("href"); if (isMobile()) { - if (window.JSAndroid) { - window.JSAndroid.openExternal(linkAddress); - event.stopPropagation(); - event.preventDefault(); - } + openByMobile(linkAddress); + event.stopPropagation(); + event.preventDefault(); return; } event.stopPropagation(); diff --git a/app/src/protyle/util/compatibility.ts b/app/src/protyle/util/compatibility.ts index d6e3bbe07..3cca3f8bf 100644 --- a/app/src/protyle/util/compatibility.ts +++ b/app/src/protyle/util/compatibility.ts @@ -1,3 +1,16 @@ +export const openByMobile = (uri:string) => { + if (!uri) { + return; + } + if (window.siyuan.config.system.container === "ios") { + window.location.href = uri; + } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { + window.JSAndroid.openExternal(uri); + } else { + window.open(uri); + } +}; + export const writeText = async (text: string) => { try { // navigator.clipboard.writeText 抛出异常不进入 catch,这里需要先处理移动端复制 diff --git a/app/src/protyle/wysiwyg/index.ts b/app/src/protyle/wysiwyg/index.ts index e90dda63a..bc602d323 100644 --- a/app/src/protyle/wysiwyg/index.ts +++ b/app/src/protyle/wysiwyg/index.ts @@ -51,7 +51,7 @@ import {openAsset, openBy, openFileById} from "../../editor/util"; import {openGlobalSearch} from "../../search/util"; /// #endif import {BlockPanel} from "../../block/Panel"; -import {isCtrl} from "../util/compatibility"; +import {isCtrl, openByMobile} from "../util/compatibility"; import {MenuItem} from "../../menus/Menu"; import {fetchPost} from "../../util/fetch"; import {onGet} from "../util/onGet"; @@ -1419,11 +1419,7 @@ export class WYSIWYG { const fileIds = fileElement.getAttribute("data-id").split("/"); const linkAddress = `assets/${fileIds[1]}`; /// #if MOBILE - if (typeof window.JSAndroid === "undefined") { - window.open(linkAddress); - } else { - window.JSAndroid.openExternal(linkAddress); - } + openByMobile(linkAddress) /// #else if (window.siyuan.ctrlIsPressed) { openBy(linkAddress, "folder"); @@ -1441,13 +1437,7 @@ export class WYSIWYG { event.preventDefault(); const linkAddress = aElement.getAttribute("data-href"); /// #if MOBILE - if (window.siyuan.config.system.container === "ios") { - window.location.href = linkAddress; - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { - window.JSAndroid.openExternal(linkAddress); - } else { - window.open(linkAddress); - } + openByMobile(linkAddress); /// #else if (isLocalPath(linkAddress)) { const linkPathname = linkAddress.split("?page")[0]; @@ -1471,13 +1461,7 @@ export class WYSIWYG { openBy(linkAddress, "app"); } /// #else - if (window.siyuan.config.system.container === "ios") { - window.location.href = linkAddress; - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { - window.JSAndroid.openExternal(linkAddress); - } else { - window.open(linkAddress); - } + openByMobile(linkAddress) /// #endif } } else { @@ -1486,13 +1470,7 @@ export class WYSIWYG { showMessage(e); }); /// #else - if (window.siyuan.config.system.container === "ios") { - window.location.href = linkAddress; - } else if (window.siyuan.config.system.container === "android" && window.JSAndroid) { - window.JSAndroid.openExternal(linkAddress); - } else { - window.open(linkAddress); - } + openByMobile(linkAddress) /// #endif } /// #endif diff --git a/app/src/util/functions.ts b/app/src/util/functions.ts index 81b874492..4137178b1 100644 --- a/app/src/util/functions.ts +++ b/app/src/util/functions.ts @@ -5,6 +5,7 @@ export const isMobile = () => { export const getRandom = (min: number, max: number) => { return Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值 }; + export const getSearch = (key: string, link = window.location.search) => { if (link.indexOf("?") === -1) { return "";