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

Posted

技术标签:

【中文标题】如何在不更改 javascript 中的 URL 的情况下重新加载当前页面一次?【英文标题】:How to reload the current page once without changing the URL in javascript? 【发布时间】:2020-09-18 06:24:06 【问题描述】:

当用户访问我的网站时,我正在使用以下 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 的情况下重新加载一次当前页面(不添加哈希 #、参数...)。

我尝试设置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);

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

请告诉我解决这个问题的方法。非常感谢您提供的解决方案!

【问题讨论】:

可能是因为您没有删除needreload cookie或将其设置为false?每次它的现在和每次它得到刷新。想过吗? @Supercool。我已经更新了帖子中的cookie名称,fc_reloadneedreload,我在发布问题之前没有编辑它。我已经更新了! 【参考方案1】:

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

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);

【讨论】:

【参考方案2】:

尝试将needreload cookie 的值设置为"no",然后再进行location.reload()

if(getCookie('needreload') == 'yes') 
        setCookie('needreload', 'no');
        location.reload();
        delCookie('fc_reload');
      //im not sure delCookie fc_reload will be executed 
      //as page will pe refreshed and control goes off
 

【讨论】:

我已经更新了帖子中的cookie名称,fc_reloadneedreload,我在发布问题之前没有编辑它。 在这种情况下,在 location.reload 之前删除 cookie 我写了如下代码,但是循环的现象还在发生! delCookie('needreload');location.reload(); 在重新加载前尝试将needreload cookie设置为no 我尝试将needreload cookie 设置为no,然后是location.reload,最后是delCookie('needreload'),但它仍然不断地重新加载页面!

以上是关于如何在不更改 javascript 中的 URL 的情况下重新加载当前页面一次?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不更改 Vue 中的 url 的情况下返回 404 错误?

如何允许客户端在不更改应用代码的情况下更改 iOS 应用中的 API 基本 URL?

如何在不更改浏览器中的 URL 的情况下使用 htaccess 进行重定向

Facebook 如何在不重新加载页面或使用 # 或的情况下更改浏览器地址栏中的 URL?

如何在不更改web.config文件中的URL的情况下重定向域?

在不使用重定向或链接的情况下更改 react-router v4 中的 URL [重复]