如果更改语言,请更改缓存

时间:2016-08-16 23:00:25

标签: javascript c# cookies local-storage

我有填充菜单的方法,如:

function MenuPopulate(url, listname, target) {
    var lang = "Espanol";
    if ((window.location.href.indexOf("lang=en") > 0)) {
        lang = "English";
    } 


       $(function () {
                    $.ajax({                       
                        url: "https://myapi.company.com/api/myapi/getmenu?idioma=" + lang ,
                         async: false,
                        type: 'GET',
                        dataType: "json",
                        success: function (data) {
                           console.log(data);
                           completeMenu(data, target)
                           //localStorage.setItem('data', JSON.stringify(data))                                                   
                           },
                        error: function (response) {
                          failureMenu(response, target)
                        }
                    });

                });

}    

function completeMenu(data, target) {
    var prefix = "<ul class='nav navbar-nav navbar-right'>";
    var sufix = "</ul>";
    var items = data;
    var menu = "";
    for (item in items) {
        if(items[item].Titile == "JOIN US"  ){

       menu += "<li><a href='#mymodal' data-toggle='modal' data-target='#mymodal'>" + items[item].Titile + "</a></li><li class='divider-vertical'></li>"
        }
        else if(items[item].Titile == "CONTACT US"){
        menu += "<li><a href='#mymodal2' data-toggle='modal' data-target='#mymodal2'>" + items[item].Titile + "</a></li><li class='divider-vertical'></li>"
        }

        else{
            menu += "<li><a href=" + items[item].Enlace + ">" + items[item].Titile + "</a></li><li class='divider-vertical'></li>";
        }
    }
    $(target).html(prefix + menu + sufix);
}

function failureMenu(data, target) {
    console.log(data);
    $(target).text("Ocurrió un error en la carga del menú. Por favor revise la consola para más información");
}

除了加载页面的时间之外它运行得很好,所以现在我用localStorage将方法存储在缓存中,所以我创建了这个类:

$(document).ready(function() {


    GetGlobal();

});

    function GetGlobal() {


        var lang = "Espanol";
        if ((window.location.href.indexOf("lang=en") > 0)) {
            lang = "English";

        } 

        var page = window.location.pathname.replace("/SitePages/", "");

        if (localStorage.getItem("Menu") == null) {
            $.ajax({
                url: "https://myapi.company.com/api/myapi/getglobalresources?idioma=" + lang + "&pagina=" + page,
                async: false,
                type: 'GET',
                dataType: "json",
                success: function(data) {
                    CompleteGlobal(data);
                    //alert("Cargo con exito");
                },
                error: function(data) {
                    //failureGlobal(data);
                    alert("No cargo");
                }
            })
        } else {
          //  alert("la cookie esta cargada");
             CargaGlobal();

            //localStorage.getItem("Menu")
        }
    }


    function CargaMenu() {
        $.ajax({
            url: "https://myapi.company.com/api/myapi/getmenu?idioma=" + lang,
            async: false,
            cache:true,
            type: 'GET',
            dataType: "json",
            success: function(data) {
                console.log(data);
                completeMenu(data, target)
            },
            error: function(response) {
                failureMenu(response, target)
            }
        });
    }


    function CompleteGlobal(data) {

        data.Menu //lista de menus
        data.Pie // lista pie de pagina
        data.Mapa
        data.Ligas

        localStorage.setItem("Menu", JSON.stringify(data.Menu));
        localStorage.setItem("Pie", JSON.stringify(data.Pie));
        localStorage.setItem("Mapa", JSON.stringify(data.Mapa));
        localStorage.setItem("Ligas", JSON.stringify(data.Ligas));
        localStorage.setItem("Enlace", JSON.stringify(data.Enlace));


        CargaGlobal();



    }



    function CargaGlobal() {

        completeMenu(JSON.parse(localStorage.getItem("Menu")), "#BarraNavegacion");

        completeSiteMap(JSON.parse(localStorage.getItem("Mapa")), "#MapaSitio");

         completeImgLinks(JSON.parse(localStorage.getItem("Enlace")), "#EnlacesImagen");

         completeFooter(JSON.parse(localStorage.getItem("Pie")), "#Footer");




    }




    function completeBanner3(target) {
        var items = localStorage.getItem("Menu");
        var menu = "";
        for (var item in items) {
            menu += "<div class='col-md-4 text-center'><div><a href='" + items[item].Enlace + "'><img src='" + items[item].Imagen + "' class='img-responsive img-center' /></a></div><div class='t02 text-center'>" + items[item].Titulo + "</div><div class='t03 text-center'>" + items[item].Descripcion + "</div></div>";
        }
        $(target).html(menu);
    }

但是当我更改我的网站的语言时,它只是没有加载其他语言菜单,我想如果语言与“Espanol”不同,那么再次加载cookie,所以我想我可以做类似的事情

  if (localStorage.getItem("Menu") == null && lang == "Espanol") {
                $.ajax({
                    url: "https://myapi.company.com/api/myapi/getglobalresources?idioma=" + lang + "&pagina=" + page,
                    async: false,
                    type: 'GET',
                    dataType: "json",
                    success: function(data) {
                        CompleteGlobal(data);
                        //alert("Cargo con exito");
                    }else if(localStorage.getItem("Menu") == null && lang == "English"){
         $.ajax({
                    url:  "https://myapi.company.com/api/myapi/getglobalresources?idioma=" + lang + "&pagina=" + page,
                    async: false,
                    type: 'GET',
                    dataType: "json",
                    success: function(data) {
                        CompleteGlobal(data);
},
                    error: function(data) {
                        alert("No cargo");
                    }
                })
            } else {
                 CargaGlobal();
            }
        }

但它不起作用,任何想法在这种情况下我需要做什么?此致

1 个答案:

答案 0 :(得分:0)

有时,使用JSON.parseJSON.stringify来获取和获取对象更容易,而不是将单个部分保存到localStorage。

这是一个相当长的例子,但我对它的评论很多,试图让它更容易理解。它是各种概念的例证,因此它并没有完全解决您的问题,但我相信它会让您更接近解决方案。

编辑:StackOverflow脚本运行器不喜欢localStorage。这是一个JSFiddle,可以看到它的实际应用:https://jsfiddle.net/subterrane/9prr5ks6/

编辑,编辑:此外,我不会说西班牙语,因此将谷歌翻译归咎于愚蠢的菜单按钮标签。

var lang = "Espanol";
if ((window.location.href.indexOf("lang=en") > 0)) {
  lang = "English";
}

// function to getMenuData
function getMenuData() {
  // get the saved data from localStorage
  var menuData = JSON.parse(localStorage.getItem('menuData'));

  // if it doesn't exist, or if our language is missing, fetch the data from the server
  if (menuData == null || menuData[lang] == null) {
    // this is a stub function. Pretend it's doing an ajax request
    // the second argument here is a callback function. It would be
    // the ajax success function.
    fetchMenuData(lang, function(data) {
      // if we did have some of the data, use it, or start with an empty object
      menuData = menuData || {};
      // set the server response to the menuData object
      menuData[lang] = data;
      // stringify the object and stash it in localStorage
      localStorage.setItem('menuData', JSON.stringify(menuData));
      // display the menu
      displayMenu(menuData);
    });
  } else {
    // we go the data from the cache, so display the menu
    displayMenu(menuData);
  }
}

// this is a fake function that pretends to get menuData from a server
function fetchMenuData(lang, callback) {
  // wait 2 seconds, then call the response function
  setTimeout(response, 2000);

  // response function sends some data back to the callback depending on the requested language
  function response() {
    callback(lang == "Espanol" ? [{
      name: 'Casa',
      link: 'something.html'
    }, {
      name: 'Lejos',
      link: 'somethingelse.html'
    }] : [{
      name: 'Home',
      link: 'something.html'
    }, {
      name: 'Away',
      link: 'somethingelse.html'
    }]);
  }
}

// function to display the menu
function displayMenu(data) {
  // update the text in some of the buttons
  document.getElementById('home').innerHTML = data[lang][0].name;
  document.getElementById('away').innerHTML = data[lang][1].name;
  // looks kinda funny, but this just puts the opposite of the current language
  // on the button to make it feel like a toggle button
  document.getElementById('toggle').innerHTML = lang == "Espanol" ? "English" : "Espanol";
  // show the menu now that it's filled in
  document.getElementById('menu').classList.remove('hide');
}

// set up a click handler on the language toggle button
document.getElementById('toggle').addEventListener('click', function() {
  // hide the menu while we mess with it. Could take a while to get the menu
  // data back from our 'server'
  document.getElementById('menu').classList.add('hide');
  // set the language to the opposite of whatever it was before
  lang = lang == "Espanol" ? "English" : "Espanol";
  // get the menu data from the cache or server
  getMenuData();
});

// kick it all off by getting the menu data from the server
getMenuData();
.hide {
  display: none;
}
<link href="//cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css" rel="stylesheet" />
<div class="container">
  <div id="menu" class="hide">
    <button id="home"></button>
    <button id="away"></button>
    <button id="toggle"></button>
  </div>
</div>