【问题标题】:Is there a way to load a fully functional Menu Bar without PHP?有没有办法在没有 PHP 的情况下加载功能齐全的菜单栏?
【发布时间】:2019-10-15 09:33:27
【问题描述】:

我目前正在尝试将我的 HTML 网页的菜单栏放入一个单独的文件中,而不使用 php。

如何正确设置?

由于我使用的是 CMS(http://www.coast-cms.de,仅限德语),因此无法选择使用 php 文件。因此我需要在没有包含的情况下这样做。通过使用jquery.load,我几乎让它按照我想要的方式工作。

导航栏已正确加载,但在我重新加载之前无法打开其中的下拉菜单,或者在某些页面上根本无法使用。

我怀疑这与加载脚本的顺序有关,但鉴于我对 jQuery 的经验有限,我既不知道如何对加载过程进行排序,也不知道哪个顺序是正确的。

<script src="assets/js/jquery-3.4.1.min.js"></script>
<div id="navbar"></div>
<script>
  $("#navbar").load( "/modules/navbar.html");
</script>

我希望能够在其他任何事情发生之前将另一个 html 文件粘贴到我现有的文件中,但我的代码似乎在其他时候加载了该文件。

编辑: 我将 jquery.dropotron 用于子菜单 https://github.com/ajlkn/jquery.dropotron

navbar.html

<header id="header">
               <h1 id="logo"><a href="index.html">Company Name</a></h1>
                <nav id="nav">
                    <ul>
                        <li><a href="index.html">Home</a></li>
                        <li>
                            <a href="" class="submenu">X</a>
                            <ul>
                                <li><a href="a.html">A</a></li>
                                <li><a href="b.html">B</a></li>
                                <li><a href="c.html">C</a></li>
                                <li><a href="d.html">D</a></li>
                                <li><a href="e.html">E</a></li>
                                <li><a href="f.html">F</a></li>

                            </ul>
                        </li>
                        <li><a href="ueber_uns.html">Über uns</a></li>
                        <li><a href="g.html">G</a></li>
                        <li><a href="h.html">H</a></li>
                        <li><a href="#FOOTER">Kontakt</a></li>
                    </ul>
                </nav>
            </header>

编辑 2: 我认为 main.js 中用于汉堡菜单的代码

a('<a href="#navPanel" class="navPanelToggle"></a>').appendTo(b);
        a('<div id="navPanel"><nav>' + a("#nav").navList() + '</nav><a href="#navPanel" class="close"></a></div>').appendTo(d).panel({
            delay: 500,
            hideOnClick: true,
            hideOnSwipe: true,
            resetScroll: true,
            resetForms: true,
            side: "right"
        });

【问题讨论】:

  • 你能分享navbar.html 代码,或者至少是没有任何个人/公司信息的最小版本吗?在上面显示的代码之后,您是否有任何适用于 #navbar 的 JS?有问题的下拉菜单是简单的&lt;select&gt;,没有额外的 JS,还是像 selectmenu 或 Bootstrap 的下拉菜单这样的自定义下拉菜单?
  • 抱歉,我真的应该马上提供这些信息。现在添加它。我在子菜单中使用 jquery.dropotron。(github.com/ajlkn/jquery.dropotron) 我还在原帖中添加了 navbar.html 代码。
  • 包含dropotron.js 并调用$('#nav ul').dropotron() 的代码是在navbar.html 文件中还是在第一页中.load 调用之后的某个位置?如果您执行$('#navbar').load('/modules/navbar.html', function() { $('#nav ul').dropotron(); }); 之类的操作,这似乎可以缓解问题吗?
  • 你的建议确实解决了这个问题,但我现在很少得到两个下拉菜单。至于应该调用的位置,我不是 100%,我是 JS 的新手,并且使用我购买的模板。我在 main.js 中找到了以下内容,该文件加载在主页的末尾:a("#nav &gt; ul").dropotron({ alignment: "right", hideDelay: 400 }); 这就是您所指的吗?
  • 我的猜测是,最初,该代码偶尔会在 load() 调用以导入 HTML 之后运行,这将使下拉菜单正常工作,但有时会在 load() 调用完成之前运行 -因此没有找到 #nav ul 元素,因为它还没有加载。现在,它仍然在之前和之后运行,但我在之前的评论中建议的回调方法总是运行 - 所以它偶尔会在同一个元素上创建两个下拉列表。我不熟悉你们的 CMS;您可以编辑main.js 并注释掉dropotron() 行,或者该文件不是您可以编辑的吗?

标签: jquery html content-management-system


【解决方案1】:

终于明白了。问题只是加载脚本的顺序。 解决的问题是确保在整个页面加载完成之前未加载 main.js(其中下拉菜单和汉堡菜单都被激活)。

我通过以下代码实现了这一点:

<script>$(document).ready(function() {$.getScript("assets/js/main.js");});</script>

【讨论】:

    【解决方案2】:

    为可能遇到此问题的其他人“总结”我们的评论讨论 - 问题是下拉菜单脚本(使用 jquery.dropotron)最初偶尔在 AJAX 加载元素之前运行,偶尔在之后运行(换句话说, 有时元素在解析器到达main.js 文件中调用dropotron 的 JS 之前由 AJAX 快速加载,有时它是在之后加载的)。

    在 AJAX 加载元素之前调用 dropotron 调用时,它找不到要附加的任何东西,所以它什么也没做。在 AJAX 加载元素后调用它时,它找到了元素并能够生成下拉列表(因此导航栏有时工作有时不工作)。

    为了缓解第一个问题,您确认在加载后使用回调来创建下拉列表,事实上,总是会产生一个下拉列表:

    $('#navbar').load('/modules/navbar.html', function() { 
      $('#nav ul').dropotron(); 
    });
    

    但是,随后的问题是它在某些情况下被调用了两次 - 这是由于 dropotron 行在 main.js 中被调用,以与最初相同的方式,有时它会在AJAX 完成,有时在之后;当它运行后,它创建了第二个菜单。

    最后的解决方案是注释掉main.js中的那一行,去掉第二个调用,只用AJAX回调保证元素加载后调用dropotron

    【讨论】:

    • 很抱歉再次打扰您,但我认为这不是完整的解决方案。该错误不会经常出现(可能 20 次中有 1 次),但它仍然不时发生。 html index.html:61 Uncaught TypeError: $(...).dropotron is not a function at HTMLDivElement.&lt;anonymous&gt; (index.html:61) at HTMLDivElement.&lt;anonymous&gt; (jquery-3.4.1.min.js:2) 对我来说,这听起来像是脚本在加载之前运行。我还注意到小型设备的汉堡菜单有时也会丢失。您认为可以强制在正确的时刻加载 main.js 吗?
    • 通过将 dropoton 的加载移动到 来修复新的下拉问题,但仍然没有弄清楚如何修复汉堡菜单
    • 我打算建议 JS 没有按正确的顺序加载。我用来包含脚本的最好方法是在 HTML 的末尾按顺序加载它们,就在 &lt;/body&gt; 标记之前。所以应该是&lt;body&gt;&lt;!-- other HTML --&gt;&lt;script src='jquery.js'&gt;&lt;/script&gt;&lt;script src='dropotron.js'&gt;&lt;/script&gt;&lt;script&gt; /* CUSTOM CODE */ &lt;/script&gt;&lt;/body&gt;。这样,您就知道所有的 HTML 都是首先加载的(除了通过 AJAX 加载的内容),并且您知道您的脚本是有序的(dropotron 应该在 jQuery 之后,因为它依赖于它 - 如果使用自定义代码,则应该在最后要么)。
    • 至于汉堡菜单,我自己没用过dropotron,但我会看看,看看我能不能发现是怎么回事。当汉堡菜单没有出现时,你有什么错误吗?
    • 我不太确定汉堡菜单是否使用 dropotron,但我添加了我认为是用于从 main.js 到原始帖子的汉堡菜单的代码。汉堡菜单不出现时没有错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-23
    • 2019-06-17
    • 1970-01-01
    • 2015-07-15
    • 2019-11-01
    • 1970-01-01
    • 2016-01-10
    相关资源
    最近更新 更多