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

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

    都搞定。

  • 相关阅读:
    POJ 3710 Christmas Game#经典图SG博弈
    POJ 2599 A funny game#树形SG(DFS实现)
    POJ 2425 A Chess Game#树形SG
    LeetCode Array Easy 122. Best Time to Buy and Sell Stock II
    LeetCode Array Easy121. Best Time to Buy and Sell Stock
    LeetCode Array Easy 119. Pascal's Triangle II
    LeetCode Array Easy 118. Pascal's Triangle
    LeetCode Array Easy 88. Merge Sorted Array
    ASP.NET MVC 学习笔记之 MVC + EF中的EO DTO ViewModel
    ASP.NET MVC 学习笔记之面向切面编程与过滤器
  • 原文地址:https://www.cnblogs.com/jinzhao/p/3184462.html
Copyright © 2011-2022 走看看