vb.net JS-функция, определенная в заголовке, не определена в onLoad - PullRequest
1 голос
/ 10 апреля 2019

У меня есть приложение vb.net, и в приложении есть функция для отправки отчета.

Когда пользователь ответил на все вопросы отчета, он нажимает кнопку «Отправить» и отображается страница, на которой отображается форма, требующая от него ввести пароль - после того, как он ввел пароль (дважды). Поле «Пароль» и поле «Подтверждение пароля»), они нажимают кнопку «Продолжить» и переходят на страницу с сообщением «Отчет отправлен» и номером дела для отчета, который они отправили. На этом этапе отчет представляется, а информация записывается в базу данных.

Пользователь может использовать предоставленный ему номер дела и пароль, которые он создает, чтобы снова войти в систему, чтобы проверить наличие обратной связи, добавленной работодателем в его отчет.

Однако существует проблема, заключающаяся в том, что если пользователь заполняет отчет и нажимает кнопку «Отправить», если он нажимает кнопку «Назад» в браузере, или перемещается назад по странице другим способом, когда он просматривает Страница «Введите пароль», они возвращаются на страницу, на которой они заполнили отчет, и все их ранее введенные значения все еще отображаются там.

Если затем они снова нажимают кнопку «Отправить» (может быть, они изменили некоторые ранее введенные данные, а может и нет), то создается второй отчет, и информация записывается в базу данных во второй раз, так что это может привести к дублированию записей. .

Я хочу попытаться предотвратить переход пользователя на предыдущую страницу на этом двухэтапном этапе отправки отчета.

Я наткнулся на этот ответ по SO и попытался реализовать его в своем проекте.

Однако, когда я теперь нажимаю «Отправить», чтобы отправить отчет после завершения, в консоли браузера отображается сообщение об ошибке:

Uncaught ReferenceError: changeHashOnLoad не определяется при загрузке (подтверждение пароля: 118)

Я добавил функцию и вызов функции в passwordconfirm.aspx:

<head runat="server">
    ...
    <script>
        $(document).ready(function () {
            ...
            function changeHashOnLoad() {
                console.log("changeHashOnLoad() called ");
                window.location.href += "#";
                setTimeout("changeHashAgain()", "50");
            }

            function changeHashAgain() {
                window.location.href += "1";
            }

            var storedHash = window.location.hash;
            window.setInterval(function() {
                if (window.location.hash != storedHash) {
                    window.location.hash = storedHash;
                }
            }, 50);
            ...
        });
    </script>
</head>
<body onload="changeHashOnLoad(); ">
    ...
</body>

Но я не уверен, почему я получаю Uncaught ReferenceError с указанием changeHashOnLoad is not defined при отправке отчета, и страница подтверждения отправки загружается ...

Это потому, что свойство onload тега HTML запускается перед кодом внутри тегов <script></script> раздела HTML <head></head>? Если это так, как я могу убедиться, что функция changeHashOnLoad() уже определена к моменту загрузки страницы - где мне определять эту функцию?

Или, если нет, что я здесь не так делаю?

1 Ответ

2 голосов
/ 10 апреля 2019

Вы объявляете свои функции в функции обратного вызова document.ready.Это означает, что ваши хеш-функции будут локально ограничены и будут существовать только в этой области функций.Вместо этого сделайте следующее:

function changeHashOnLoad() {
  console.log("changeHashOnLoad() called ");
  window.location.href += "#";
  setTimeout("changeHashAgain()", "50");
}

function changeHashAgain() {
  window.location.href += "1";
}

$(document).ready(function () {
  var storedHash = window.location.hash;
  window.setInterval(function () {
    if (window.location.hash != storedHash) {
      window.location.hash = storedHash;
    }
  }, 50);
});
...