【问题标题】:jQuery click event after new page loads新页面加载后的jQuery点击事件
【发布时间】:2017-11-28 04:58:50
【问题描述】:

我有一个使用 Node/Express/Handlebars 的网络项目

我在侧面有一个粘性导航,它是通过部分手把呈现的。

当单击链接并加载页面时,我希望活动状态更改为被单击的元素。我已经尝试过 .click().on('click', child, callback) 。当我单击它时它可以工作,但在 DOM 重新加载后它会重置。

感谢您对 Stackoverflow 的帮助。

这是我的 jQuery:

//NAVIGATION ACTIVES
$('.stickynav').on('click', '.platform-nav',
  function() {
    $('.main-hand').removeClass("nav-active");
    $('.sticky-hand').removeClass("nav-active");
    $(this).addClass("nav-active");

  });
$('.stickynav').on('click', '.tools-nav',
  function() {
    $('.main-hand').removeClass("nav-active");
    $('.sticky-hand').removeClass("nav-active");
    $(this).addClass("nav-active");
  });
$('.stickynav').on('click', '.diensten-nav',
  function() {
    $('.main-hand').removeClass("nav-active");
    $('.sticky-hand').removeClass("nav-active");
    $(this).addClass("nav-active");
  });
$('.stickynav').on('click', '.blog-nav',
  function() {
    $('.main-hand').removeClass("nav-active");
    $('.sticky-hand').removeClass("nav-active");
    $(this).addClass("nav-active");
  });

和 HTML (.hbs):

<div class="stickynav" data-spy="affix">
  <div class="hands-connector">
        <img src='/img/connector-sticky.png'  />
  </div>


<div class="hands-sticky">
  <div class="sticky-hand platform-nav nav-active" id="platform-sticky">
    <a href="/">        <img src="/img/platform-sticky.png" alt="Naar kennisplatform" />
            <p>Kennisplatform</p></a>

  </div>
  <div class="sticky-hand tools-nav" id="tools-sticky">
    <a href="/tools">
        <img src="/img/tools-sticky.png" alt="Naar gratis tools" />
        <p>
          Tools
        </p>
      </a>
  </div>
  <div class="sticky-hand diensten-nav" id="diensten-sticky">
    <a href="/diensten">
        <img src="/img/diensten-sticky.png" alt="Naar diensten" />
        <p>
          Diensten
        </p>
    </a>
  </div>
  <div class="sticky-hand blog-nav" id="blog-sticky">
    <a href="/blog?page=1">
        <img src="/img/blog-sticky.png" alt="Naar blog" />
      <p>
        Blog
      </p>
    </a>
  </div>
</div>
</div>

以及供参考的 CSS 类(禁用链接):

.nav-active {
  text-decoration:none;
  color:black;
  -webkit-filter: drop-shadow(1px 1px 0 blue) drop-shadow(-1px -1px 0 blue);
  -ms-filter: drop-shadow(1px 1px 0 blue) drop-shadow(-1px -1px 0 blue);
  filter: drop-shadow(1px 1px 0 blue) drop-shadow(-1px -1px 0 blue);
  pointer-events:none;
  cursor:default;
}

【问题讨论】:

  • 应该在页面加载时添加类...基于当前加载的 url。单击链接后,当前页面脚本消失了,它在新页面上重新开始
  • 我刚才在想这个,但是在早上 6:15 我不知道该怎么做。任何指针将不胜感激。当然,我总是可以在它们各自的模板中添加不带部分的stickynav,然后手动将类放在那里。但我认为 jQuery 可能能够帮助我并防止重复使用代码。
  • 关于如何在页面加载时执行此操作有很多类似的问题。您基本上只需将导航链接的hreflocation 进行比较...如果所有href 都是相对的,则将它们与location.pathname 进行比较

标签: jquery html css handlebars.js


【解决方案1】:

我不确定您尝试做的事情是否可行..

如果页面重新加载,您将丢失任何未备份的状态。 所以你需要某种数据源或会话。

如果不需要页面重新加载,可以“return false;”在您的点击功能结束时,这应该可以防止页面重新加载并为您提供您正在寻找的类更改。

如果您的点击事件正在更改路线,我建议您使用在页面加载完成后运行的脚本(在文档准备就绪时)

$(function () { your code here }) 

检查当前路由并根据路由设置 css 类。 (而不是基于点击的内容,因为您会在页面加载时丢失该信息,但您仍然拥有路线。)

location.href

【讨论】:

  • 链接指向不同的路线,这些路线在其转向把手模板上呈现。使用默认布局会阻止导航在路线更改时重新加载吗?我可以使用 .click( function() { $(document).load(callback) }; 吗?
  • 有单页应用程序 (SPA) 可以在不进行页面加载的情况下更改路由。但是在您重新加载页面的情况下,我建议在加载完成后运行一个脚本(在文档准备就绪时)$(function () { your code here }) 检查当前路由并在那里设置 css 类在路线上。 (而不是基于点击的内容,因为您会在页面加载时丢失该信息,但您仍然拥有路线)
  • 感谢编辑,当然还有帮助!通过一些谷歌搜索,我发现这个正则表达式可以拆分 URL 并获取我需要轻松工作的路径的字符串。 var path = window.location.href.split(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?# ]*)(\?([^#]*))?(#(.*))?/); var path = path[5] 给出没有查询的第一个目录。
【解决方案2】:

HTTP is stateless.

任何时候刷新页面,它的状态都会丢失,并且您的页面不知道它在哪里。所以,你需要想办法在你的页面中保持状态。

例如,您可以使用浏览器的this API 将状态保存在本地存储中。本地存储对于主机名是持久的。因此,无论何时单击链接,您都可以将其详细信息存储在本地存储中,当您的 DOM 再次准备就绪时,您可以从本地存储中读取相同的值并使该链接处于活动状态。

更多方法可以在this discussion找到。

【讨论】:

  • 使用 localStorage 来跟踪导航是丑陋的......只需使用 location
【解决方案3】:

你不能这样做,因为当页面重新加载时,它是一个全新的 HTTP 请求,它会丢失上一个页面上执行的最后一个请求。您可以做的是基于您可以使用服务器端脚本设置 class= "nav-active" 的 url,假设您使用的是 php,那么您可以尝试类似

设置 $page = "平台"

在编写html时你可以添加

<div class="sticky-hand tools-nav" id="tools-sticky" class="<?php ($page=='tools')?"active":"" ?>" >
<div class="sticky-hand platform-nav" id="tools-sticky" class="<?php ($page=='platform')?"active":"" ?>" >

【讨论】:

  • php 是怎么回事?在这个问题上没有 php 标签。 OP 正在服务器上运行 node/express
  • 这只是一个通过php添加动态类的例子,我相信node会有类似的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多