diff --git a/browser/dom/mod.ts b/browser/dom/mod.ts
index 333021b..03dc042 100644
--- a/browser/dom/mod.ts
+++ b/browser/dom/mod.ts
@@ -6,5 +6,5 @@ export * from "./click.ts";
export * from "./statusBar.ts";
export * from "./caret.ts";
export * from "./dom.ts";
-export * from "./openInTheSameTab.ts";
+export * from "./open.ts";
export * from "./cache.ts";
diff --git a/browser/dom/open.ts b/browser/dom/open.ts
new file mode 100644
index 0000000..3657bb4
--- /dev/null
+++ b/browser/dom/open.ts
@@ -0,0 +1,78 @@
+///
+///
+///
+
+import { encodeTitleURI } from "../../title.ts";
+import type { Scrapbox } from "../../deps/scrapbox.ts";
+declare const scrapbox: Scrapbox;
+
+export interface OpenOptions {
+ /** line id */
+ id?: string;
+
+ /** ページに追記するテキスト */
+ body?: string;
+
+ /** 新しいタブで開くかどうか
+ *
+ * @default 同じタブで開く
+ */
+ newTab?: boolean;
+
+ /** 同じタブでページを開く場合、ページを再読込するかどうか
+ *
+ * @default 同じprojectの場合は再読み込みせず、違うprojectの場合は再読込する
+ */
+ reload?: boolean;
+}
+
+/** ページを開く
+ *
+ * @param project 開くページのproject名
+ * @param title 開くページのタイトル
+ * @param options
+ */
+export const open = (
+ project: string,
+ title: string,
+ options?: OpenOptions,
+) => {
+ const url = new URL(`/${project}/${encodeTitleURI(title)}`, location.href);
+ if (options?.body) url.search = `?body=${encodeURIComponent(options.body)}`;
+ if (options?.id) url.hash = `#${options.id}`;
+
+ if (
+ options?.newTab !== false &&
+ (options?.newTab === true || project !== scrapbox.Project.name)
+ ) {
+ window.open(url);
+ return;
+ }
+ if (
+ options?.reload !== false &&
+ (options?.reload === true || project !== scrapbox.Project.name)
+ ) {
+ window.open(url, "_self");
+ return;
+ }
+
+ const a = document.createElement("a");
+ a.href = url.toString();
+ document.body.append(a);
+ a.click();
+ a.remove();
+};
+
+/** 同じタブでページを開く
+ *
+ * このとき、ページは再読み込みされない
+ *
+ * @param project 開くページのproject名
+ * @param title 開くページのタイトル
+ * @param [body] ページに追記するテキスト
+ */
+export const openInTheSameTab = (
+ project: string,
+ title: string,
+ body?: string,
+) => open(project, title, { newTab: false, reload: false, body });
diff --git a/browser/dom/openInTheSameTab.ts b/browser/dom/openInTheSameTab.ts
deleted file mode 100644
index aafc163..0000000
--- a/browser/dom/openInTheSameTab.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-///
-///
-///
-import { encodeTitleURI } from "../../title.ts";
-
-/** 同じタブでページを開く
- *
- * このとき、ページは再読み込みされない
- *
- * @param project 開くページのproject名
- * @param title 開くページのタイトル
- * @param [body] ページに追記するテキスト
- */
-export function openInTheSameTab(
- project: string,
- title: string,
- body?: string,
-) {
- const a = document.createElement("a");
- a.href = `/${project}/${encodeTitleURI(title)}${
- typeof body !== "string" ? "" : `?body=${encodeURIComponent(body)}`
- }`;
- document.body.append(a);
- a.click();
- a.remove();
-}