今天我注意到了......
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()">
...
答案 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)
如果您不想丢弃代码,可以违反所有规则并使用例外:
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;
抛出的异常将阻止所有其余代码执行。
行。这很丑陋,打破了很多最佳实践规则。但它应该有用。
或者您可以围绕其他代码使用异常处理:
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;
答案 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 1
,after redirect 2
和after 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()">
...