Как я могу заставить javascript немедленно остановить выполнение скрипта и перейти на другую страницу. Учти это:
<html>
<head>
<script>
function onload()
{
alert('before');
window.location.href = 'http://google.com';
alert('after redirect');
}
</script>
</head>
<body onload = "onload();">
Hello World!
</body>
</html>
Второе предупреждающее сообщение срабатывает всегда.
Отвечает ли это на ваш вопрос? Как мне перенаправить на другую веб-страницу?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Попробуйте вернуть значение из первой функции, и если пользователь вошел в систему, верните 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.
}
Я согласен с вами, что это было бы идеальным быстрым исправлением, но, как упоминалось в моем вопросе, я не могу засорять свой код if (checkIfLoggedIn ()) ~ мой фактический код намного сложнее, чем приведенный выше упрощенный пример, вместо этого я нужно, чтобы страница перестала выполняться, мой вопрос был: есть ли версия перенаправления, которая делает это?
Можно ли использовать мета-обновление? Это немедленно перенаправит страницу и остановит выполнение дальнейшего кода. Это не решение для JavaScript, будет ли оно работать? Поместите это в заголовок своей HTML-страницы: <meta http-equiv = "refresh" content = "5;url=http://newUrl.com/" />
@KyleB, я понимаю вашу точку зрения, но я считаю, что код немедленно вызывает вторую функцию, чтобы получить данные профиля пользователя, поэтому должно быть условие, когда проверять информацию профиля.
Вы вызываете getUserInfo() без каких-либо условных обозначений. Таким образом, эта функция будет вызываться при загрузке страницы, поскольку вы не наложили ограничений на этот вызов функции. Следовательно, код все еще работает.
Возможно, именно это и предполагается в первом блоке вашего фрагмента:
if (checkIfLoggedIn()) {
getUserInfo();
}
Таким образом, getUserInfo будет вызываться только в том случае, если checkIfLoggedIn вернет true. Как вы это написали, getUserInfo также запускается при загрузке страницы.
Если вы не хотите засорять свой код, вы можете нарушить все правила и использовать исключение:
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();Вызванное исключение предотвратит выполнение всего остального кода.
OK. It is ugly and breaks so many best practice rules. But it should work.
Или вы можете использовать обработку исключений для другого кода:
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";
}
function getUserInfo()
{
try {
var username = getUsername();
var email = getEmail();
// etc. etc.
}
catch(ex) {
// Don't do anything here unless you really need to
}
}
function loggedIn() {
return false;
}
init();Я нашел ответ сегодня, когда искал что-то еще:
Несмотря на то, что window.location.href установлен и окно находится в середине перенаправления, выполнение кода продолжается в большинстве браузеров:
function onload()
{
console.info('before');
window.location.href = 'newpage.html';
console.info('after redirect 1');
console.info('after redirect 2');
console.info('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()">
...
ну вы называете это onload, поэтому загружается вся страница ....