Javascript “;hashchange”;不';不要在Wordpress中开火
嗨,我正在建立这个网站:。它是用Themify Ultra主题构建的 我的目标是在滚动或单击链接时去掉url中的#something部分。 我需要用JavaScript/jQuery来实现这一点,因为没有基于主题的解决方案,支持人员也帮不了我 我已经测试过了,并且知道以下代码会按照我的要求替换url: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); 现在的问题是
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);
};
})();