Получение отдельных обратных вызовов в браузерах нажатием кнопки «назад» и «вперед»

У меня есть простое веб-приложение, состоящее из 3 простых страниц.

  • а.html
  • б.html
  • c.html
<!-- a.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
        <a href="b.html">b.html</a>    
    </body>
</html>
<!-- b.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
            <a href="a.html">a.html</a>    
            <br />
            <a href="c.html">c.html</a>  
    </body>
</html>
<!-- c.html -->
<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="UTF-8">
        <title>Document</title>
    </head>
    <body>
            <a href="b.html">b.html</a>
    </body>
</html>

Как видно из приведенного выше кода, a.html имеет ссылку на b.html, b.html имеет ссылку на a.html и c.html и, наконец, c.html имеет ссылку на b.html.

Все страницы будут размещены на одном домене, и мне нужна очень простая вещь. Все, что я хочу, это выполнять обратный вызов всякий раз, когда нажимается кнопка браузера назад/вперед (в частности, перед переходом на новую страницу), и в обратном вызове мне нужна страница, на которую мы будем переходить. И я не хочу обновлять историю браузера, достигая вышеуказанного (я не хочу испортить работу пользователя, обновление истории браузера приведет к неожиданной навигации для пользователя)

Решения, которые я пробовал:


person Lavish Kothari    schedule 06.08.2019    source источник
comment
I want to execute a callback whenever browser's back/forward button is pressed Все, что вы можете сделать, это запустить код в beforeunload, но нет способа узнать, что вызвало срабатывание этого события; пользователь мог ввести новый веб-адрес или закрыть браузер. Если есть конкретная причина, по которой вы хотите знать, была ли нажата кнопка «вперед/назад», вам потребуется перепроектировать страницу, чтобы обойти это ограничение.   -  person Rory McCrossan    schedule 06.08.2019
comment
Возможность подключиться к назад/вперед и знать, куда он пойдет, звучит как огромная дыра в безопасности.   -  person freedomn-m    schedule 06.08.2019
comment
@RoryMcCrossan Спасибо за предложение beforeunload, но, как вы уже сказали, оно мне не очень полезно. Не могли бы вы объяснить, что вы подразумеваете под реинжинирингом страницы, чтобы обойти это ограничение?   -  person Lavish Kothari    schedule 06.08.2019
comment
Лучший способ, который я мог придумать, - это перейти на использование одностраничного приложения. Затем вы можете точно контролировать, какой контент отображается, и знать, каким образом пользователь перемещается по странице.   -  person Rory McCrossan    schedule 06.08.2019
comment
@RoryMcCrossan достаточно честно. Но я боюсь, что этот реинжиниринг будет стоить мне больших усилий, так как написанный код уже огромен. В любом случае спасибо за предложение.   -  person Lavish Kothari    schedule 06.08.2019
comment
@freedomn-m, так ты имеешь в виду, что это невозможно сделать? Должен ли я перестать тратить свое время на поиск решения этой проблемы и переделать свое приложение, сделав его одностраничным, как предложил Рори?   -  person Lavish Kothari    schedule 06.08.2019
comment
Это может потребовать больших усилий, но на самом деле у вас нет большой альтернативы.   -  person Rory McCrossan    schedule 06.08.2019
comment
Я вижу, вы уже идентифицировали это как дыру в безопасности. Хорошо сделано для исследования, прежде чем спрашивать. Но вы, по сути, сказали: я знаю, что не могу получить URL-адрес ... но могу ли я получить URL-адрес?   -  person freedomn-m    schedule 06.08.2019
comment
Я не уверен, что вы можете даже различать назад/вперед до того, как действие произошло.   -  person freedomn-m    schedule 06.08.2019
comment
Я бы посоветовал пересмотреть необходимость. Кажется, это довольно уникально (иначе было бы намного больше вопросов по этому поводу), и я уверен, что у вас есть веская причина для этого.   -  person freedomn-m    schedule 06.08.2019