【问题标题】:HTML - link to open page, then to anchor on that pageHTML - 链接到打开页面,然后锚定在该页面上
【发布时间】:2016-11-16 21:37:54
【问题描述】:

我正在开发一个相当广泛的本地网站。它不在网络服务器上,我或多或少地受限于 HTML 和 JavaScript。

我在使用此语句调用的所有页面上都有一个侧面导航菜单:

<script type="text/javascript" src="menu/menu.js"></script>

menu.js 本质上是一个这样的链接列表:

document.write("<a href='page5.html#part1'>Part 1</a>");

在所有页面上都有一个粘性标题脚本,这使得链接到锚点很麻烦。如果您当前位于链接链接到的页面上并且链接链接到的锚点上方,则它可以正常工作。但是,如果您当前位于同一页面上的锚点下方,则会出现故障。它不会把你带到它应该去的地方。

可能还有另一种方法,但我觉得一个易于实施的解决方案是创建一个链接,首先在顶部打开页面,然后将您带到锚点。

我尝试使用此问题 ([Force page reload with html anchors (#) - HTML & JS) 中的@Qwerty 解决方案,但没有成功。我试过这个:

document.write("<a href='page5.html#part1' onclick='location.reload()'>Part 1</a>");

我猜它不起作用,因为它是本地的和/或因为从 JS 文件中读取的链接。

示例 为简单起见,假设网站上有 3 个页面,每个页面上有 3 个锚点。我希望这个外部 JS 菜单打开并在所有页面上工作。它有这些链接:

page1.html#part1
page1.html#part2
page1.html#part3

page2.html#part1
page2.html#part2
page2.html#part3

page3.html#part1
page3.html#part2
page3.html#part3

【问题讨论】:

  • 迷失了你的目标,需要更多代码,我不想写一个完整的网页来猜测你的页面是如何制作的。
  • 99% 的发布问题都需要MCVE (Minimal, Complete, and Verifiable Example)。请发布与您的问题相关的 JavaScript/jQuery、CSS 和 HTML。使用以下任何或所有服务创建演示:jsFiddle.net、CodePen.io、Plunker.co、JS Bin 或 sn-p(位于文本编辑器工具栏或 CTRL+M 上的第 7 个图标)。
  • 我不能。它必须在本地工作,我认为这些服务中没有任何一个可以效仿。另外,我正在使用一个外部 JS 文件,这会给事情带来麻烦。
  • 本站会模拟多个文件:plnkr.co外部JS文件没问题。您遇到的活动扳手是document.write 不要使用它......永远。 developer.mozilla.org/en-US/docs/Web/API/Document/write
  • 这在某些情况下很重要,但在您的情况下,这可能不重要,如果没有代码或所述网页作者的明确意图,这很难说。

标签: javascript html


【解决方案1】:

下面的代码段是为了便于参考,其中涉及的内容比代码段中的要多。如果您喜欢现场演示,请访问此PLUNKER。

首页必须是index.html 作为网站的要求,但您可以在PC 上随意命名您的页面。请记住链接不包含index.html,因为我懒得包含它,这意味着编写对您没有用处的代码。

// Code goes here

var pages = 5;
var parts = 3;
var pg = [];
var pt = [];
var menu = document.getElementById('menu');
var i, j;
for (i = 0; i < pages; i++) {
  var page = 'page' + (i+1);
  pg.push(page);
  for (j = 0; j < parts; j++) {
    var part = 'part' + (j+1);
    pt.push(part);
    var url = pg[i] + '.html#' + pt[j];
    var anchor = document.createElement('a');
    anchor.href = url;
    anchor.textContent = 'Page ' +(i+1) + ' Part ' +(j+1) ;
    menu.appendChild(anchor);
  }
}
<!DOCTYPE html>
<html>

<head>
  <link rel="stylesheet" href="style.css">

</head>

<body>
  <h1>Index</h1>
  <nav id='menu'></nav>
  <section id='part1'>
    <h2>Part1</h2>
  </section>
  <section id='part2'>
    <h2>Part2</h2>
  </section>
  <section id='part3'>
    <h2>Part3</h2>
  </section>
  <script src="menu.js"></script>
</body>

</html>

【讨论】:

  • 我很欣赏这一点,但 Plunker 上没有显示菜单。应该这样吗?
  • 所有这些链接都生成到每个页面上的特定部分。菜单是链接。 &lt;nav id='menu'&gt;&lt;/nav&gt; 是它的样子,但是在页面加载后,每个导航将填充 15 个链接,即 5 个页面,每个页面有 3 个部分。当您单击一个链接时,它将按照要求将您带到页面的一部分。您实际上不会在 menu.js 中看到完整的 url,因为每个 url 都是以编程方式构建的。如果要在构建后查看 HTML,则必须使用 F12。您是否真的点击了任何链接或查看了文件? [继续-->]
  • [-->CONT] 另外,你不能指望菜单看起来像你的菜单。如果我尝试使用提供的信息来做这件事,我需要几天的时间才能这样做,因为我需要盲目猜测。
  • 放入样式,大部分 style.css 规则集来自我制作的演示页面,因此大部分不适用。虽然我最终建立了一个小型网站,但我不会再为它付出或离开它而付出更多努力。您需要一些 HTML 基础知识并更多地接触 JavaScript。
【解决方案2】:

这可能与您的问题完全无关,或者让您了解如何更好地构建应用。要处理您的导航需求,您不需要 Javascript。但是您可以将其添加到组合中,以通过漂亮的噱头改进此解决方案。

<html>

<head>
  <title>one-page-app</title>
  <style>
    .pages {
      display: none;
    }
    .pages:target {
      display: block;
    }
  </style>
</head>

<body>

  <nav>
    <p>Main Menu:</p>
    <a href="#home">Home</a>
    <a href="#faq">FAQ</a>
    <a href="#external">External content (other file)</a>
  </nav>

  <a name="home"></a>
  <div id="home" class="pages">

    <h1>Home</h1>
    <p>Hi. Check <a href="#faq">FAQ</a> to see how it's working.</p>

  </div>

  <a name="faq"></a>
  <div id="faq" class="pages">

    <h1>FAQ</h1>
    <ul>
      <li>
        <h2>How does it work?</h2>
        <p>The magic of the <a target="_blank" href="https://developer.mozilla.org/en-US/docs/Web/CSS/:target">:target pseudo-class in CSS</a>.</p>
      </li>
      <li>
        <h2>What if I have more content?</h2>
        <p>
          I've worked with 2-3 MB html files without a problem. That's when smartphone browsers were really choking. ;) For local pages, loading time is no issue after all.</p>
      </li>
      <li>
        <h2>What about REALLY old browsers?</h2>
        <p>They will see all the content at once, but due to the anchors, the main menu will still work. Add "back to top" links to the pages if you want.</p>

  </div>

  <a name="external"></a>
  <iframe id="external" class="pages" src="http://google.com"></iframe>

</body>

</html>

编辑 - 问题编辑后:

如果您想保持当前的结构,您可以这样做:

<a name="page1_1"></a>
<iframe id="page1_1" class="pages" src="page1.html#part1"></iframe>

<a name="page1_2"></a>
<iframe id="page1_2" class="pages" src="page1.html#part2"></iframe>

等等。

【讨论】:

  • 菜单代码正在从所有页面上的外部文件中读取,类似于 SSI。我想出如何为本地网站执行此操作的唯一方法是使用 JavaScript。
  • 这就是我的观点:这种方法不需要那个。所有导航都是在单个 HTML 文件中完成我的“正常”链接。我有这个文件是由Gulp 从 pug 模板构建的,但你也可以手动编写它。内容也可以在该文件中 - 为您提供单文件应用程序!或者,您可以将内容放入单独的 html 文件中,并使用 IFrame 包含那些内容,同时仍然在这个单个文件中拥有所有导航。通常使用 IFrame 会给您带来诸如“奇怪”的后退按钮、没有浏览器历史记录等问题,但使用这种方法(使用锚链接)则不适用。
  • 因此,根据您的结构,您的菜单看起来像&lt;a href="#page1_1"&gt;Page one part one&lt;/a&gt;&lt;a href="#page1_2"&gt;Page one part two&lt;/a&gt;,相应的内容将是我回答的最后一个示例中的 IFrame。您的内容文件(page1.html、page2.html)将只是没有任何菜单的 pure 内容。它们被 IFrame 包含,而菜单保留在 index.html
猜你喜欢
  • 2012-04-30
  • 2020-05-31
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多