window.location.href запускается сразу по клику - PullRequest
0 голосов
/ 10 октября 2019
function refresh(context) {
    console.log(" in refresh view ");
    window.location.href = context + '/abc.do';
}
function resetCookie(context) {
    var view = getView();
    if (view == "First") {
        clearCookies();
        setCookie("Second", "on");
        console.log(" context in resetCookie 2");
    } else {
        clearCookies();
        setFirstViewCookie();
        setCookie("First", "on");
        console.log(" context in resetCookie 3");
    }
    console.log(" context in resetCookie 4");
    console.log(" context in resetCookie 5");
    refresh(context);
    return false;
}
<td>
    <span id="firstview" style="display:none;">
        <a href="javascript:void(0)" onclick=" resetCookie('<%= request.getContextPath()%>')">secondview</a>
    </span>
    <span id="secondview" style="display:none;">
        <a href="javascript:void(0)" onclick="resetCookie('<%= request.getContextPath()%>')">firstview</a>
    </span>
</td>

Этот фрагмент кода отлично работает в IE. Но в chrome и firefox, как только я нажимаю на тег, каким-то образом сначала вызывается window.location.href, поэтому обновление страницы происходит без выполнения кода внутри функции . Я проверил это, удалив location.href строку, и я вижу, что все строки выполняются последовательно, также я проверил номер строки, с которой происходит обновление вызова, на вкладке сети - показывает именно этот номер строки внутри обновленияфункция, даже не печатает console.log («в режиме обновления»);оператор внутри функции обновления .

В идеале все внутри resetCookie должно произойти, и тогда должно произойти window.location.href внутри обновления.

Это spring tags jsp.

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Мне не очень нравятся spring и jsp, но я могу догадаться, что методы clearCookies(); или / и setCookie(); выполняют асинхронные операции. Из-за однопоточной архитектуры javascript вы вызываете refresh() до завершения предыдущих методов.

0 голосов
/ 10 октября 2019

Возможно, эта версия 21-го века поможет

var context = "<%= request.getContextPath()%>";

window.addEventListener("load",function() {
  [...document.querySelectorAll("reset")].forEach(lnk => {
    lnk.addEventListener("click",function(e) {
      const id = this.id;
      clearCookies();
      setCookie(id, "on");
      this.href = context + '/abc.do';
    });
  });
});
.hidden { display:none }
<a id="First" class="reset"  href="#">secondview</a></span>
<a id="Second" class="reset" href="#">firstview</a></span>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...