在我们的着陆页上,我们有一个号召性用语按钮,可将用户引导至页面上的锚点。但在 URL 中添加锚点标签会扰乱我们的跟踪数据。
我想出了两个解决方案:split
和replaceState
。split
似乎不能持续工作,这取决于锚标记。replaceState
工作完美,但老板说这不是最优的。
哪一个是最好的,我该如何优化它?
分裂
$form.find('[name="source_url"]').val(location.href.split('#')[0]);
替换状态
$(window).on('hashchange', function() {
setTimeout(function() {
if (window.location.hash) {
history.replaceState('', document.title, window.location.href.split('#')[0]);
}
}, 500);
});
答案1
split
和方法replaceState
都可用于从 URL 中删除锚标记。让我们比较一下这两种方法并讨论它们的优缺点。
- 使用
split
:
$form.find('[name="source_url"]').val(location.href.split('#')[0]);
此方法直接使用字符作为分隔符来拆分 URL #
,并提取锚标记之前的部分。这看起来就像您使用不带锚标记的 URL 设置输入字段的值一样。
优点:
- 实现起来简单又直接。
- 当 URL 结构一致且锚标记始终位于末尾时效果很好。
缺点:
- 如果 URL 结构发生变化或者锚标记不总是位于末尾,则此方法可能无法按预期工作。
- 使用
replaceState
:
$(window).on('hashchange', function() {
setTimeout(function() {
if (window.location.hash) {
history.replaceState('', document.title, window.location.href.split('#')[0]);
}
}, 500);
});
此方法监听 URL 中哈希部分的变化(锚标记变化),并用锚标记之前的部分替换 URL 的当前状态。
优点:
- 更加灵活,因为只要锚标记出现在 URL 中,它就会动态地删除它。
- 适用于各种 URL 结构和锚标签位置。
缺点:
- 它涉及设置事件监听器,这可能会增加一点开销。
如果该split
方法并非在所有情况下都有效,并且replaceState
效果完美,那么您可能希望采用该replaceState
方法。老板可能会认为它不是最优的,因为它引入了事件监听器,但在大多数情况下,性能影响可以忽略不计。
优化replaceState
方法:
减少超时值:不要使用
setTimeout
500 毫秒,尝试将其减少到较低的值(例如 100 毫秒),以使 URL 更新响应更快,同时避免任何潜在的跟踪问题。事件去抖动:根据您的应用程序,您可以考虑对事件进行去抖动,以防止在短时间内
hashchange
过度调用。这样,您可以确保仅在一定间隔的不活动状态后才调用该函数,以避免不必要的更新。replaceState
以下是如何对事件进行去抖动的示例:
let timerId;
$(window).on('hashchange', function() {
clearTimeout(timerId);
timerId = setTimeout(function() {
if (window.location.hash) {
history.replaceState('', document.title, window.location.href.split('#')[0]);
}
}, 100); // Adjust the debounce interval as needed
});
请记住,最佳方法取决于应用程序的具体要求和 URL 结构的一致性。如果该split
方法始终适用于您的特定用例,则它可能是更简单、更高效的选择。但是,如果您遇到问题,replaceState
经过一些优化的方法是一个不错的选择。