Skip to content

Commit 3d19a8a

Browse files
committed
fix: new vue:url-changed event about handler for chaning SPA warm navigation
1 parent 9cf5bdb commit 3d19a8a

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

userscript/source/index.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,10 +47,12 @@ export async function RunNamuLinkUserscript(BrowserWindow: typeof window, Usersc
4747
const ArticleHTMLElement = await WaitForElement('#app', BrowserWindow.document)
4848
const EventName = 'vue:settled'
4949
const ChangeEventName = 'vue:change'
50+
const UrlChangeEventName = 'vue:url-changed'
5051
AttachVueSettledEvents(ArticleHTMLElement, {
5152
QuietMs: 75,
5253
EventName: EventName,
53-
ChangeEventName: ChangeEventName
54+
ChangeEventName: ChangeEventName,
55+
UrlChange: UrlChangeEventName
5456
})
5557

5658
const OCRInstance = CreateOcrWorkerClient(BrowserWindow, new Worker(URL.createObjectURL(new Blob([__OCR_WORKER_CODE__], { type: 'application/javascript' }))))
@@ -156,6 +158,7 @@ export async function RunNamuLinkUserscript(BrowserWindow: typeof window, Usersc
156158
}
157159

158160
ArticleHTMLElement.addEventListener('vue:settled', (EventParameter) => Handler(EventParameter))
161+
ArticleHTMLElement.addEventListener('vue:url-changed', (EventParameter) => setTimeout(() => Handler(EventParameter), 250))
159162

160163
// init Naver Nanum fonts
161164
const FontAddr = [

userscript/source/vuejsawait.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
export function AttachVueSettledEvents(TargetEl: HTMLElement, Options: { QuietMs?: number; EventName?: string; ChangeEventName?: string } = {}) {
1+
export function AttachVueSettledEvents(TargetEl: HTMLElement, Options: { QuietMs?: number; EventName?: string; ChangeEventName?: string; UrlChange?: string } = {}) {
22
const QuietMs = Options.QuietMs ?? 120
33
const EventName = Options.EventName ?? 'vue:settled'
44
const ChangeEventName = Options.ChangeEventName ?? 'vue:dom-changed'
5+
const UrlChangeEventName = Options.UrlChange ?? 'vue:url-changed'
56

67
if (!(TargetEl instanceof HTMLElement)) {
78
throw new TypeError('TargetEl must be an HTMLElement')
@@ -11,6 +12,7 @@ export function AttachVueSettledEvents(TargetEl: HTMLElement, Options: { QuietMs
1112
let Seq = 0
1213
let Destroyed = false
1314
let LastMutationAt = performance.now()
15+
let URLHistory: URL = new URL(location.href)
1416

1517
const EmitChange = (Mutations: MutationRecord[]) => {
1618
TargetEl.dispatchEvent(
@@ -47,6 +49,22 @@ export function AttachVueSettledEvents(TargetEl: HTMLElement, Options: { QuietMs
4749
})
4850
}
4951

52+
const EmitUrlChange = () => {
53+
const NewURL = new URL(location.href)
54+
if (NewURL.href !== URLHistory.href) {
55+
URLHistory = NewURL
56+
TargetEl.dispatchEvent(
57+
new CustomEvent(UrlChangeEventName, {
58+
detail: {
59+
Seq,
60+
At: performance.now(),
61+
URL: NewURL,
62+
},
63+
}),
64+
)
65+
}
66+
}
67+
5068
const ArmSettledTimer = () => {
5169
clearTimeout(Timer)
5270
Timer = setTimeout(EmitSettled, QuietMs)
@@ -60,6 +78,7 @@ export function AttachVueSettledEvents(TargetEl: HTMLElement, Options: { QuietMs
6078
if (Mutations.length >= 25) {
6179
ArmSettledTimer()
6280
}
81+
EmitUrlChange()
6382
})
6483

6584
Observer.observe(TargetEl, {

0 commit comments

Comments
 (0)