使用纯 JavaScript 显示动态内容有困难 - 路由问题

问题描述 投票:0回答:2

初始问题

问题
我目前正在开发一个 Web 项目,但遇到了无法使用纯 JavaScript 显示动态内容的问题。我正在尝试创建一个简单的仪表板页面来呈现“您好,这是仪表板!”屏幕上显示了,但是当我打开页面时,内容没有显示。

描述
我有一个仪表板页面 (Dashboard.html) 和一个负责呈现内容的 JavaScript 文件 (Dashboard.js)。这是我的代码:

// Dashboard.js
const app = document.getElementById("app");

const createDashboardPage = () => {
    const container = document.createElement("div");

    container.innerHTML = `
        <h1>Hello, this is the dashboard!</h1>
        <p>This is a simple dashboard page.</p>
    `;

    return container;
};

const dashboardPage = createDashboardPage();

app.appendChild(dashboardPage);
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Dashboard</title>
  </head>
  <body>
    <div id="app"></div>
    <!-- Include the Dashboard.js script -->
    <script type="module" src="./Dashboard.js"></script>
  </body>
</html>

但是,当我在浏览器中打开 Dashboard.html 时,内容不显示。我已经验证ID为“app”的元素存在,并且浏览器控制台中没有错误。

我尝试过的:

  1. 检查 Dashboard.html 中是否存在“app”元素。
  2. 验证Dashboard.html中的脚本标签指向正确 JavaScript 文件。
  3. 确保 Dashboard.js 的文件路径正确。
  4. 确认浏览器控制台中没有 JavaScript 错误。

什么可能导致内容不显示,如何解决此问题?使用纯 JavaScript 在网页上呈现动态内容时,我应该注意哪些常见陷阱?

初始问题添加信息
我决定制定一个项目的详细结构。

如果您不熟悉页面以及下面每个文件的工作原理,我已经为每个文件在 hashnode 上编写了一篇快速博客。我已将博客链接链接到每个页面。

我还包含了 Codesandbox
的基本布局 我的项目有一个基本结构:

  • pageLoader.js:该模块从各自的文件加载不同页面的 HTML 内容。 Hasnode
//load page. 


export const loadPage = async (page) => {
  const response = await fetch(page);
  return response.text();
};

export const loadAllPages = async () => {
  const pages = {};

  // Load index.html from the root directory
  pages.home = await loadPage('index.html');

  // Load other pages from the 'userPages' directory
  pages.about = await loadPage('userPages/about.html');

  return pages;
};
  • 路由器.js:

它管理网络应用程序内的导航,确保用户可以在不同视图或页面之间无缝移动,而不会触发全页面刷新。 哈希节点历史操作

// router.js

import { loadAllPages } from './loadPage';
import { onPopState, pushState } from './pageHistory'; // Import history-related functions

const routes = new Map();

const loadRoutes = async () => {
  // Load your routes here
  // For example, you can load pages from loadAllPages()
  const pages = await loadAllPages();
  routes.set('/', pages.home);
  routes.set('/about', pages.about);
  routes.set('/dashboard', pages.dashboard);
};

const handle404 = () => {
  const root = document.getElementById('root');
  root.innerHTML = `<div > Sorry we cannot find this page</div>
`;
};

// Define and export onNavClick handler
export const onNavClick = async (pathname) => {
  const root = document.getElementById('root');

  if (!routes.has(pathname)) {
    handle404();
    return;
  }

  const pageContent = routes.get(pathname);
  root.innerHTML = pageContent;

  // Update the URL using the pushState function from history
  pushState({}, '', pathname);
};

const handleRouting = () => {
  const pathname = window.location.pathname;
  onNavClick(pathname);
};

const router = async () => {
  await loadRoutes();

  // Set up routing
  window.addEventListener('popstate', handleRouting);

  // Trigger initial routing
  handleRouting();
};

router();

问题:

仪表板页面内容未按预期呈现。当我导航到仪表板路线时,我看到一个空白页面,并且仪表板内容丢失。

附加信息:

所有其他路线(例如/about等)均正常工作。 我已按照之前的建议将 jQuery 包含在 HTML 文件中,但没有任何更改。 我在控制台中没有收到任何错误消息。

问题:

什么可能导致呈现仪表板页面内容时出现问题?
如何确保仪表板页面内容正确加载并显示?
任何见解或建议将不胜感激。谢谢你!

代码沙盒

javascript html dom dynamic-routing
2个回答
0
投票

在这种情况下,type="module" 属性没有意义,删除该属性,一切都会按预期工作。 如果该模块的目的是为了避免在全局范围内定义变量,那么只需将所有内容包装在 IIFE 中


-1
投票

我建议尝试创建元素并使用 jQuery 而不是普通 JavaScript 动态显示它。

代码看起来像这样:

$(function() {
   createDashboardTitle();
});

createDashboardTitleI() {
  let app = $('.app');
  let container = document.createElement('container');
  container.innerHTML = `
    <h1>Hello, this is the dashboard!</h1>
    <p>This is a simple dashboard page.</p>
  `;
  app.append(container);
}
© www.soinside.com 2019 - 2024. All rights reserved.