浏览器前进后退对下拉框数据的丢失(省市联动实现和例子)

浏览器前进后退对下拉框数据的丢失的问题,典型的为省市下拉框联动时城市数据的丢失。省市联动一般的实现为城市在省份的选择后js加载。

那么每次城市的改变只需要重新加载新的城市数据并更新下拉框即可:

下拉函数

function ReloadCities() {
    var $ddlCity = $("#CityId");
    var selec = $("#ProvinceId").val();
    if (selec) {
        $ddlCity.find("option").remove();
        var url = "@(Url.Action("CityListByProvinceId", "Common", new { area = "Default" }))";
        $.post(url, { 'id': selec }, function (data) {
            $.each(data, function (i, item) {
                $("<option></option>").val(item.AddressId).text(item.AddressName).appendTo($ddlCity);
            });
        }, "json");
    }
    else {
        $ddlCity.find("option").remove();
        $("<option></option>").val("").text("--请选择--").appendTo($ddlCity);
    }
}

 正常使用没有问题,但是当用户跳转到其它页面再回退时选中丢失。关于回退普及下面几个关键的知识点:

  1. 一般都会自动使用缓存的数据,除非禁用缓存才会重新从服务端获取数据。
  2. 大部分浏览器在默认设置下都会保存每个元素的value,也就是用户输入的数据。
  3. 具体的知识可以查看widnow对象的history。

知道了以上几点后,首先,为什么城市列表会丢失,因为它是js操作dom的结果,所以增加触发代码:

触发代码

$(document).ready(function () {
            if (!$("#CityId").val()) {
                ReloadCities();
            }});

城市是加载出来了,但是选中的状态丢了。怎么办呢,抱着绕开这个复杂的城市元素的思路,直接放个隐藏的input来保存前后的value,那么解决方案就出来了。

同步隐藏input的代码

$("#CityId").change(function () {
                $("#cityIdHidden").val($("#CityId").val());
            });

 在重新加载城市列表时从隐藏input中获取value值,新代码为红色段

function ReloadCities() {
           var $ddlCity = $("#CityId");
           var selec = $("#ProvinceId").val();
           if (selec) {
               $ddlCity.find("option").remove();
               var url = "@(Url.Action("CityListByProvinceId", "Common", new { area = "Default" }))";
               $.post(url, { 'id': selec }, function (data) {
                   $.each(data, function (i, item) {
                       $("<option></option>").val(item.AddressId).text(item.AddressName).appendTo($ddlCity);
                   });
                   if ($("#cityIdHidden").val()) {
                       $("#CityId").val($("#cityIdHidden").val());
                   }
               }, "json");
           }
           else {
               $ddlCity.find("option").remove();
               $("<option></option>").val("").text("--请选择--").appendTo($ddlCity);
           }
       }

都搞定。

 

 

posted @   today4king  阅读(1936)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示
主题色彩