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


    浏览器前进后退对下拉框数据的丢失的问题,典型的为省市下拉框联动时城市数据的丢失。省市联动一般的实现为城市在省份的选择后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);
                }
            }
    

    都搞定。

  • 相关阅读:
    COM 组件创建实例失败,原因是出现以下错误: c001f011 (Microsoft.SqlServer.ManagedDTS)
    df: `/root/.gvfs': Permission denied
    ora-03113 end-of-file on communication channel 故障处理
    ESXi克隆虚拟机时网卡需要重新设置的问题
    Spark重点难点知识总结
    Hive,Hive on Spark和SparkSQL区别
    Spark分区数、task数目、core数目、worker节点数目、executor数目梳理
    spark RDD中的partition和hdfs中的block的关系
    Spark容错机制
    【干货】大数据框架整理
  • 原文地址:https://www.cnblogs.com/jinzhao/p/3184462.html
Copyright © 2020-2023  润新知