summaryrefslogtreecommitdiff
path: root/node_modules/swup/src/modules/replaceContent.ts
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2024-08-30 17:21:18 +0800
committerlittleblack111 <littleblack11111@gmail.com>2024-08-30 17:21:18 +0800
commitefbc2ffe6a1ee5ec38a4396305561d6515d0943e (patch)
tree2b4c94f18f2c792dfda813050755d5c0273fae22 /node_modules/swup/src/modules/replaceContent.ts
parent43acceb75957c880a5ba5a31aae221394a36d5f6 (diff)
node fixes, updates
Diffstat (limited to 'node_modules/swup/src/modules/replaceContent.ts')
-rwxr-xr-xnode_modules/swup/src/modules/replaceContent.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/node_modules/swup/src/modules/replaceContent.ts b/node_modules/swup/src/modules/replaceContent.ts
new file mode 100755
index 00000000..62859acd
--- /dev/null
+++ b/node_modules/swup/src/modules/replaceContent.ts
@@ -0,0 +1,51 @@
+import type Swup from '../Swup.js';
+import { query, queryAll } from '../utils.js';
+import type { Visit } from './Visit.js';
+
+/**
+ * Perform the replacement of content after loading a page.
+ *
+ * @returns Whether all containers were replaced.
+ */
+export const replaceContent = function (this: Swup, visit: Visit): boolean {
+ const incomingDocument = visit.to.document;
+ if (!incomingDocument) return false;
+
+ // Update browser title
+ const title = incomingDocument.querySelector('title')?.innerText || '';
+ document.title = title;
+
+ // Save persisted elements
+ const persistedElements = queryAll('[data-swup-persist]:not([data-swup-persist=""])');
+
+ // Update content containers
+ const replaced = visit.containers
+ .map((selector) => {
+ const currentEl = document.querySelector(selector);
+ const incomingEl = incomingDocument.querySelector(selector);
+ if (currentEl && incomingEl) {
+ currentEl.replaceWith(incomingEl.cloneNode(true));
+ return true;
+ }
+ if (!currentEl) {
+ console.warn(`[swup] Container missing in current document: ${selector}`);
+ }
+ if (!incomingEl) {
+ console.warn(`[swup] Container missing in incoming document: ${selector}`);
+ }
+ return false;
+ })
+ .filter(Boolean);
+
+ // Restore persisted elements
+ persistedElements.forEach((existing) => {
+ const key = existing.getAttribute('data-swup-persist');
+ const replacement = query(`[data-swup-persist="${key}"]`);
+ if (replacement && replacement !== existing) {
+ replacement.replaceWith(existing);
+ }
+ });
+
+ // Return true if all containers were replaced
+ return replaced.length === visit.containers.length;
+};