You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现每次点击浏览器窗口返回按钮时都触发指定函数

问题根源

你遇到的重复触发问题核心原因是每次调用call()函数时,都重复给window绑定了新的popstate事件监听器,旧的监听器没有被移除,点击返回时所有绑定的监听器都会同时执行,就出现了触发次数指数级增长的问题。同时你不需要每次触发事件都重新绑定监听器,只需要在事件触发后重新往历史栈中插入一条记录即可。

修复方案

最优写法(推荐)

事件监听器仅绑定一次,每次触发popstate后仅重新插入历史记录即可:

$(function() {
  // 兼容性判断,不支持的浏览器直接跳过
  if (!window.history || !window.history.pushState) return;

  // 事件监听器全局仅绑定一次
  $(window).on('popstate', function () {
    alert('Back button was pressed.');
    // 触发后重新插入历史记录,保证下次返回操作可被捕获
    window.history.pushState('', null, './');
  });

  // 页面初始化时插入第一条历史记录
  window.history.pushState('', null, './');
});

配套HTML引入代码:

<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

兼容原有逻辑的写法

如果你的业务需要保留原来的call()函数封装模式,可以在每次绑定事件前先移除旧的同类型监听器,避免重复绑定:

function handleBackEvent() {
  alert('Back button was pressed.');
  call();
}

function call() {
  if (window.history && window.history.pushState) {
    window.history.pushState('', null, './');
    // 先解绑旧的监听器,再绑定新的,避免重复注册
    $(window).off('popstate', handleBackEvent).on('popstate', handleBackEvent);
  }
}

$(document).ready(function () {
  call();
});

内容的提问来源于stack exchange,提问作者Ambiguous Turtle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 01:36:01