【问题标题】:How to retain a value of dropdown using JS?如何使用 JS 保留下拉列表的值?
【发布时间】:2023-03-03 22:38:01
【问题描述】:

我有一个带有 1 个提交按钮的三个下拉菜单。现在,我试图在用户单击输入提交后保留每个下拉列表的值。但是我拥有的 Jquery 无法正常工作。当用户单击它时,我使用 PHP 来显示下拉列表的输出。

注意:当用户点击输入提交时页面会刷新。

如何解决这个问题?见plunker

JS:

$(document).ready(function(){
    $('#dropdown').change(function(){
        var option = $(this).find('option:selected').val();
        $('#dropdown').val(option);
    });

});

【问题讨论】:

  • 所做的只是将选择的值设置为用户刚刚选择的值。您是否尝试在页面刷新期间保留该值?
  • @Actorclavilis,是的。当用户点击输入提交时,页面将重新加载,并且下拉列表的值不保留
  • 您的按钮点击事件中是否编写了任何代码?
  • @NikhilNanjappa,从那以后我就没有了,我使用 <input type="submit"> 并使用 PHP 显示了提交表单的输出
  • 好的,然后在下面查看我的答案。但是,您可以根据您的应用程序调用该函数。

标签: javascript jquery html form-submit cascadingdropdown


【解决方案1】:

使用所有选项的本地存储;

$("#dropdown").change(function(){

      var html=$("#dropdown").html();
      localStorage.setItem("myapp-selectval",html);

      localStorage.setItem("myapp-selectvalselected",$("#dropdown").val());              //to retain selected value
})

现在正在加载文档;

window.onload=function()
{
    if(localStorage.getItem("myapp-selectval")!="" && localStorage.getItem("myapp-selectval")!=undefined)
    {
        $("#dropdown").html(localStorage.getItem("myapp-selectval"));

        $("#dropdown").val(localStorage.getItem("myapp-selectvalselected"));                 //to get previously selected value
    }
}

正如我在评论中所说,这不是一个好的解决方案。

【讨论】:

  • 缺少第一个下拉值
  • 现在有什么问题?您必须在 window.onload 中保留 "$("#dropdown").change(function(){" 代码。
【解决方案2】:

您可以使用select 元素中的model 属性轻松获取值。

首先像这样添加一个onclick函数

<input type="submit" name="submit" value="Submit" onclick="getValues()"/>

然后获取按钮提交时的值(完整代码Plunkr

我查看了您的代码,设置选择框渲染的方式我们必须显式调用 updateSelect() 函数才能使选项正常工作。此功能使您的选择框“动态”。

var first = localStorage.getItem("firstDropDown");
var second = localStorage.getItem("secondDropDown");
var third = localStorage.getItem("thirdDropDown");

if(first !== null && second !== null && third !== null) {
  setValues(); //this should come after getting  the values above
}

function getValues() {
  var first = document.getElementsByTagName("SELECT")[0].getAttribute("model");
  var second = document.getElementsByTagName("SELECT")[1].getAttribute("model");
  var third = document.getElementsByTagName("SELECT")[2].getAttribute("model");

  localStorage.setItem("firstDropDown", first);
  localStorage.setItem("secondDropDown", second);
  localStorage.setItem("thirdDropDown", third);
}

//on load when this function is called globally, the values from the localStorage will be set to the dropdown values.
function setValues() {
  //for first dropdown
  document.getElementsByTagName("SELECT")[0].setAttribute("model", first); 
  document.getElementsByTagName("SELECT")[0].value = first;
  updateSelect(document.getElementsByTagName("SELECT")[0]);
  //for second dropdown
  document.getElementsByTagName("SELECT")[1].setAttribute("model", second);
  document.getElementsByTagName("SELECT")[1].value = second;
  updateSelect(document.getElementsByTagName("SELECT")[1]);
  //for third dropdown
  document.getElementsByTagName("SELECT")[2].setAttribute("model", third);
  document.getElementsByTagName("SELECT")[2].value = third;
  updateSelect(document.getElementsByTagName("SELECT")[1]);
}

要保留价值,您别无选择,只能像这样使用window.localStorage -

localStorage.setItem("firstDropDown", first);
localStorage.setItem("secondDropDown", second);
localStorage.setItem("thirdDropDown", third);

然后取值

var first = localStorage.getItem("firstDropDown");
var second = localStorage.getItem("secondDropDown");
var third = localStorage.getItem("thirdDropDown");

【讨论】:

  • 我试过你的建议,但价值仍然没有保留
  • 你要页面刷新后吗?
  • 是的,用户点击输入后提交(提交后页面自动刷新)
  • 检查我更新的答案。这应该符合您的预期。
  • firstDropDown,我应该改变吗?我应该放置选择的ID吗?如果是这样,我在 3 个选择框中只有 1 个 id。
【解决方案3】:

如果用户要刷新页面,最好的办法是让服务器发送用户刚刚在新页面加载时提交的值。

如果由于某种原因无法做到这一点,您可以使用localStorage

$(document).ready(function(){
    var prevVal = localStorage.getItem('selectValue');
    prevVal && $('#dropdown').val(prevVal);

    $('#dropdown').change(function(){
        var option = $(this).val();
        localStorage.setItem('selectValue', option);
    });

});

请记住,并非所有浏览器都支持此 API。

编辑:如果不需要浏览器刷新,可以使用Ajax:

// ...
$('#myForm').submit(function (event) {
    event.preventDefault();
    var option = $('#dropdown').val();
    var fd = new FormData();
    fd.append('dropdown', option);
    $.ajax('/path/to/form/target/', {
        method: 'POST',
        formData: fd
    });
    // ...
});
//...

【讨论】:

  • 用户不是手动刷新浏览器而是当用户点击input type="submit时,页面会自动刷新
  • 不管他们如何刷新浏览器。
  • 看起来selectValue只是localStorage中的一个键。它基本上是键值数据库。您可以使用任何您想要的密钥,但如果您有更多密钥,最好为它们制定一个命名约定。
  • 您也可以使用 sessionStorage。但是使用这些并不是一个好方法,因为可能有另一个 Web 应用程序使用相同的键(selectValue)来存储任何值。在这种情况下,该值将覆盖。因此,如果您想以某种方式使用它,请选择一个唯一的键,例如 yourAppName-selectval 或类似的东西。
  • @KOUSIKMANDAL:我很确定localStorage/sessionStorage 的范围是域。也就是说,你说得对,它比其他解决方案不太干净。
【解决方案4】:

虽然我认为 OP 的问题要求 JS 解决方案,但我确实想提出其他问题,因为我也在寻找解决相同问题的方法。然而,我最终以我认为令人满意的方式解决了它。

在我的情况下,我使用 Flask 作为后端,但我相信解决方案至少应该与其他用例类似。

在下拉列表所在的 HTML 中,我从后端传递了一个变量,该变量最初设置为我选择的某个默认值。我们称这个变量为 default_var_set_in_backend。这最终将被提供给 HTML,如下所示:

<select name="some_name_you_want" onchange="this.form.submit()">
    <option selected="selected">{{ default_var_set_in_backend }}</option>

一旦用户对下拉列表值进行了更改(在我的情况下是 GET 请求),我将变量 default_var_set_in_backend 更新为等于这个新选择。现在,一旦页面刷新,HTML 将反映用户所做的最新选择。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-10
    相关资源
    最近更新 更多