首页 > 解决方案 > 如何在不更改 javascript 中的 URL 的情况下重新加载当前页面一次?

问题描述

当用户访问我的网站时,我正在使用以下 javascript 代码为用户设置语言 cookie:

function setCookie(name, value, expires) {
    var expires = "";
    if(expires) {
        var date = new Date();
        date.setTime(date.getTime() + (expires * 24 * 60 * 60 * 1000));
        expires = "; expires=" + date.toUTCString();
    }
    document.cookie = name + "=" + (value || "")  + expires + "; path=/";
}
function getCookie(name) {
    var nameEQ = name + "=";
    var ca = document.cookie.split(';');
    for(var i = 0; i < ca.length; i++) {
        var c = ca[i];
        while(c.charAt(0) == ' ') {
            c = c.substring(1, c.length);
        }
        if(c.indexOf(nameEQ) == 0) {
            return c.substring(nameEQ.length, c.length);
        }
    }
    return null;
}
function delCookie(name) {
    document.cookie = name+'=; expires=Wed, 31 Dec 1969 23:59:59 GMT; path=/'; // expires=-1
}

// After the page has finished loading, check that the user already has a language cookie?
document.addEventListener('DOMContentLoaded', function() {
    var lang = navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage;
    lang = lang.slice(0, 2).toLowerCase();
    if(!getCookie('language')) { // If not, set language cookie
        if(lang == 'vi') {
            setCookie('language', 'vi');
        }
        else {
            setCookie('language', 'en');
        }
    }
    if(getCookie('language')) { // If the user already has a language cookie
        if(getCookie('language') != 'vi' || getCookie('language') != 'en') { // If the user's language cookie is not supported
            setCookie('language', 'en'); // Then use English as the default
        }
    }
}, false);

现在,我想在为用户设置语言 cookie 之后,在不更改 URL 的情况下重新加载当前页面一次(不添加 hash #、参数...)。

我尝试设置cookie,然后使用location.reload(),一旦重新加载将删除该cookie,如下所示:

// ... Skip Cookie Code ...
document.addEventListener('DOMContentLoaded', function() {
    var lang = navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage;
    lang = lang.slice(0, 2).toLowerCase();
    if(!getCookie('language')) {
        if(lang == 'vi') {
            setCookie('language', 'vi');
            setCookie('needreload', 'yes');
        }
        else {
            setCookie('language', 'en');
            setCookie('needreload', 'yes');
        }
    }
    if(getCookie('language')) {
        if(getCookie('language') != 'vi' || getCookie('language') != 'en') {
            setCookie('language', 'en');
            setCookie('needreload', 'yes');
        }
    }
    if(getCookie('needreload') == 'yes') {
        location.reload();
        delCookie('needreload');
    }
}, false);

但是,这使我的网站不断地重新加载,而不仅仅是一次。

请告诉我解决这个问题的方法。我将不胜感激您提供的解决方案!

标签: javascript

解决方案


我发现问题,是代码检查用户的语言cookie是否支持有问题。我必须使用&&而不是||那里。如果我使用||,那么true即使支持用户的语言 cookie 也总是如此,从而导致无限的页面重新加载循环。这是运行良好的代码:

document.addEventListener('DOMContentLoaded', function() {
    var lang = navigator.language || navigator.browserLanguage || navigator.userLanguage || navigator.systemLanguage;
    lang = lang.slice(0, 2).toLowerCase();
    if(!getCookie('language')) {
        if(lang == 'vi') {
            setCookie('language', 'vi');
        }
        else {
            setCookie('language', 'en');
        }
        setCookie('needreload', '1');
    }
    if(getCookie('language')) { // If it already exists
        if(getCookie('language') != 'vi' && getCookie('language') != 'en') { // Use && instead of || will make it work
            setCookie('language', 'en');
            setCookie('needreload', '1');
        }
    }
    if(getCookie('language') == '1') {
        location.reload();
        delCookie('needreload');
    }
}, false);

推荐阅读