【问题标题】:“hashchange” doesn't fire in Wordpress“hashchange”不会在 Wordpress 中触发
【发布时间】:2017-07-09 10:43:49
【问题描述】:

您好,我正在建立这个网站:http://www.freiheitmedia.com/en/。它是使用 Themify Ultra 主题构建的。

我的目标是在滚动或点击链接时去掉 url 中的#something 部分。

我需要用 JavaScript/jQuery 来做,因为没有基于主题的解决方案,支持人员也帮不了我。

我已经测试过,知道下面的代码可以随意替换url:

history.replaceState("",document.title,window.location.pathname + window.location.search);

现在,问题是 我似乎无法触发“hashchange”事件。我将以下代码放在页脚中,但在这两种情况下都没有达到警报语句:

<script>
    window.addEventListener("hashchange", function(e){
        alert("hiii");
    });
</script>

<script>
    window.addEventListener("hashchange", function(e){
        alert("hiii");
    }, false);
</script>

我怀疑主题设置可能会阻止 hashchange 事件,但这只是猜测。

你们知道为什么“hashchange”没有触发吗?

【问题讨论】:

  • 有点不清楚你在问什么。当您在第一个代码块中运行代码时,您是否期望看到 hashchange 事件? (您不会,hashchange 不会被 history.replaceState 解雇。)或者您是否尝试通过触发第一个块中的代码来响应哈希更改?
  • FWIW,您的代码挂钩事件(第二个和第三个块)是正确的(对于符合标准的浏览器 - 因此,不是 IE8 或更早版本,如果它们处于“兼容性”中,则不是 IE9+模式”)。
  • @tjcrowder 当您访问该站点并向下滚动时,您会看到 url 会根据您所在的部分而变化。特别是 #part 会发生变化。我的目标是防止这种行为,并始终拥有一个干净的 url(没有任何#hashes)。所以我尝试通过监听“hashchange”事件来访问这种行为。但由于某种原因,当 url 更改为 #part 时,“hashchange”事件不会触发。这可以理解吗?

标签: javascript jquery wordpress hashchange


【解决方案1】:

来自您的澄清评论:

当您访问该站点并向下滚动时,您会看到 URL 会根据您所在的部分而变化。特别是 #part 会发生变化。我的目标是防止这种行为,并始终拥有一个干净的 url(没有任何#hashes)。

最好的方法是通过更新哈希找到响应滚动事件的插件(这可能很有帮助;如果您将其添加为书签,则将您带回页面的该部分)并打开它关了。在页面上使用插件来争夺对哈希的控制是一个坏主意。

仅次于此:

由于hashchange 没有触发,插件必须使用historyreplaceStatepushState 或类似方法来设置哈希,因为这样不会触发hashchange。您可以将这些函数替换为您自己的去除哈希片段的版本:

// I DON'T RECOMMEND THIS APPROACH
(function() {
    function removeHash(url) {
        var u = String(url || "");
        var x = u.lastIndexOf("#");
        return x == -1 ? u : u.substring(0, x);
    }
    var originalReplaceState = history.replaceState;
    history.replaceState = function(state, title, url) {
        url = removeHash(url);
        return originalReplaceState.call(history, state, title, url);
    };
    var originalPushState = history.pushState;
    history.pushState = function(state, title, url) {
        url = removeHash(url);
        return originalPushState.call(history, state, title, url);
    };
})();

不过,实际上最好通过添加散列片段并禁用它来找到响应滚动事件的任何内容。

【讨论】:

  • @tjcrowder 感谢您的回复并抽出宝贵时间! :) 上述(不推荐)代码适用于我的情况。我想知道您的第一种方法到底是什么意思。 “通过添加哈希片段并禁用它来查找响应滚动事件的任何内容”是什么意思?如何“添加哈希片段”?如果你能详细说明一下就好了,我想学习:)
  • @StanislawLorenz:很高兴有帮助。滚动时更改的哈希不是标准行为。因此,该页面上有 JavaScript 代码(插件或其他)正在执行此操作。因此,我建议不要与之抗争,而是找到它并将其关闭,因为您不希望它添加的行为。
猜你喜欢
  • 2014-06-18
  • 2014-10-27
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多