Javascript “;hashchange”;不';不要在Wordpress中开火

Javascript “;hashchange”;不';不要在Wordpress中开火,javascript,jquery,wordpress,hashchange,Javascript,Jquery,Wordpress,Hashchange,嗨,我正在建立这个网站:。它是用Themify Ultra主题构建的 我的目标是在滚动或单击链接时去掉url中的#something部分。 我需要用JavaScript/jQuery来实现这一点,因为没有基于主题的解决方案,支持人员也帮不了我 我已经测试过了,并且知道以下代码会按照我的要求替换url: history.replaceState("",document.title,window.location.pathname + window.location.search); 现在的问题是

嗨,我正在建立这个网站:。它是用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>

addEventListener(“hashchange”,函数(e){
警报(“hiii”);
});


addEventListener(“hashchange”,函数(e){
警报(“hiii”);
},假);
我怀疑hashchange事件可能会被主题的设置阻止,但这只是一个猜测


你们知道为什么“hashchange”没有开火吗?

从你们澄清的评论中:

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

最好的方法是通过更新散列来找到响应滚动事件的插件(这大概是有帮助的;如果你把它添加到书签中,它会带你回到页面的那个部分)并关闭它。用页面上的插件来控制散列是个坏主意

其次是:

由于
hashchange
未触发,插件必须使用
history
replaceState
pushState
或类似工具来设置哈希,因为这样不会触发
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);
    };
})();

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

您的问题有点不清楚。在第一个代码块中运行代码时,是否希望看到
hashchange
事件?(您不会,
hashchange
不是由
history.replaceState
触发的)或者您是否正试图通过触发第一个块中的代码来响应哈希更改?FWIW,挂接事件(第二个和第三个块)的代码是正确的(对于符合标准的浏览器,因此,不是IE8或更早版本,也不是IE9+“兼容性模式”)。@tjcrowder当你访问该网站并向下滚动时,你会看到url会根据你所在的部分而变化。特别是#部分会发生变化。我的目标是防止这种行为,并始终保持一个干净的url(没有任何#散列)。因此,我尝试通过收听“散列变化”来访问这种行为“事件。但由于某些原因,“hashchange”事件在url更改时不会触发,它是“hashchange”的一部分。这可以理解吗?@tjcrowder感谢您的回复,并慢慢来!:)以上(不推荐)代码适用于我的情况。我想知道你的第一个方法到底是什么意思。您所说的“通过添加哈希片段并禁用它来查找对滚动事件做出响应的内容”是什么意思?如何“添加哈希片段”?如果你能详细说明,那就太好了,我想学习:)@StanislawLorenz:很高兴这能帮上忙。滚动时更改哈希值不是标准行为。因此,页面上有JavaScript代码(插件或其他什么)可以实现这一点。因此,与其与之抗争,我建议你找到它并关闭它,因为你不想要它所增加的行为。
// 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);
    };
})();