如何使用JavaScript立即重定向

时间:2018-03-19 18:31:04

标签: javascript window.location

今天我注意到了......

window.location.href = "https://mypage.com/login.html"

...在Internet Explorer中 立即 将页面重定向到新网址(并停止所有脚本执行)。

*是否有通话会阻止整个页面继续加载和重定向? * 我不能使用if(notRedirecting()=== true)语句丢弃我的onload函数,因为我必须将它们放在任何地方。

编辑:我删除了该示例,因为它让人感到困惑。

我的问题是:

是否有不同类型的重定向或导航可以让JavaScript停止正在执行的操作并重定向而不是继续执行代码,直到浏览器最终重定向? < /强>

编辑:我想要的更好的例子..

<html>
<head>
  <script>
    function init()
    {
      checkIfLoggedIn();
      getUserInfo(); // I would expect this to not run after a redirect

      // ! more code gets called after this and keeps executing...
    }

    function checkIfLoggedIn()
    {
      if(loggedIn() === false)
        window.location.href = "/login.html";
    }

    function getUserInfo()
    {
      var username = getUsername(); // throws exception if not logged in
      var email = getEmail(); // throws exception if not logged in
      // etc. etc.
    }
    ...
  </script>
</head>
<body onload="init()">
  ...

4 个答案:

答案 0 :(得分:2)

尝试从第一个函数返回值,如果用户登录返回true,希望这会对您有所帮助

function init()
{
  if(checkIfLoggedIn())
  getUserInfo(); // I would expect this to not run if the user was not logged in
}

function checkIfLoggedIn()
{
  if(loggedIn() === false)
    window.location.href = "/login.html";
else
    return true;
}

function getUserInfo()
{
  var username = getUsername(); // throws exception if not logged in
  var email = getEmail(); // throws exception if not logged in
  // etc. etc.
}

答案 1 :(得分:1)

您正在呼叫getUserInfo()并且没有任何条件。因此,当页面加载时将调用此函数,因为您对此函数调用没有任何限制。因此,代码仍在运行。

也许这就是您的代码段的第一个块中的内容:

if(checkIfLoggedIn()) {
    getUserInfo();
}

这样,只有在getUserInfo返回checkIfLoggedIn时才会调用true。您编写它的方式,getUserInfo也在页面加载时运行。

答案 2 :(得分:0)

如果您不想丢弃代码,可以违反所有规则并使用例外:

&#13;
&#13;
async processResult(result) {
  const packet = {
    id: result.id,
    title: result.title,
  };

  const subResponse1 = await getSubThing1();
  packet.thing1 = subResponse1.body.thing1;

  const subResponse2 = await getSubThing2();
  packet.thing2 = subResponse2.body.thing2;
}

(async () => {
  for (let page = START_PAGE; page < MAX_PAGES; page += 1) {
    console.log(`Processing page ${page}...`);
    getList(page)
      .then(response => Promise.all(response.body.list.map(processResult)))
      .then(data => console.log('DATA DONE', data));
    console.log(`Page ${page} done!`);
  }
})();
&#13;
&#13;
&#13;

抛出的异常将阻止所有其余代码执行。

  

行。这很丑陋,打破了很多最佳实践规则。但它应该有用。

或者您可以围绕其他代码使用异常处理:

&#13;
&#13;
function init()
{
  checkIfLoggedIn();
  getUserInfo(); // I would expect this to not run if the user was not logged in
}

function checkIfLoggedIn()
{
  if(loggedIn() === false) {
    window.location.href = "/login.html";
    throw new Error('Kill all code running after me');
  }
}

function getUserInfo()
{
  var username = getUsername(); // throws exception if not logged in
  var email = getEmail(); // throws exception if not logged in
  // etc. etc.
}

function loggedIn() {
  return false;
}


init();
&#13;
&#13;
&#13;

答案 3 :(得分:0)

我今天在寻找其他东西时遇到了答案:

即使设置了window.location.href,并且窗口处于重定向的中间,大多数浏览器仍继续执行代码:

function onload()
{
    console.log('before');
    window.location.href = 'newpage.html';
    console.log('after redirect 1');
    console.log('after redirect 2');
    console.log('after redirect 3');
}
即使页面被重定向,

after redirect 1after redirect 2after redirect 3仍会登录到控制台。但是,由于init()是顶级函数,因此我可以从函数中return;停止继续执行代码。

  <script>
    function init()
    {
      if(checkIfLoggedIn() === false)
          return; // <-- stops following code from executing and allows return to proceed

      getUserInfo();
    }

    function checkIfLoggedIn()
    {
      var loggedIn = loggedIn();
      if(loggedIn === false)
        window.location.href = "/login.html";
      return loggedIn;
    }

    ...
  </script>
</head>
<body onload="init()">
  ...