【问题标题】:Setting the selected index after populating a dropdown list via ajax call通过ajax调用填充下拉列表后设置选定的索引
【发布时间】:2017-10-07 11:43:17
【问题描述】:

我正在通过 ajax 调用填充选择标签选项,然后我尝试使用 javascript 在下拉列表中设置所选项目。但它似乎不起作用。

在我的 Index.cshtml 页面中,我有这样的选择标签

<select id="ddlState">
</select>

在同一页面上,我使用 ajax 调用来填充选项列表。

$.ajax({
    url: "/api/vmsApi",
    success: function (data) {
        console.log(data)
        for (var i = 0; i < data.length; i++)
        {
            $("#ddlState").append('<option value="'+data[i]+'">' + data[i]+ '</option>')
        }
    }
});

然后作为测试,我尝试将 selectedIndex 设置为大于 0.. 的值,如下所示:

document.getElementById("ddlState").selectedIndex = 2;

无论我为所选索引赋予什么值.. 第一项总是被选中....

这是为什么?

我的下拉列表确实填充了所有值。只是 selectedIndex 不会改变。

【问题讨论】:

    标签: javascript jquery ajax


    【解决方案1】:

    您确定以下操作无效吗?

    $.ajax({
        url: "/api/vmsApi"
    })
    .then(
      (data) => {
            console.log(data);
            const select = $("#ddlState");
            data.forEach(
              data =>
                select.append(
                  '<option value="'+
                  data+
                  '">'
                  + data
                  + '</option>'
              )
            );
            select[0].selectedIndex = 2;
        }
    )
    .then(
      undefined
      ,reject => console.error(reject)
    );
    

    如果这不起作用,您能否在控制台选项卡中使用 chrome (F12) 中的开发工具按 control + shift + f 并查找 selectedIndex 可能您的页面上还有一些其他代码可以设置选定的索引。

    解决您的评论:如果控制台适合控制台,则控制台会按原样显示值。

    当您需要扩展一个值时,它会显示现在的值,而不是控制台记录它时的值。您可以在 devtools 控制台中运行以下代码并亲自查看:

    var i = 0;
    var arr = [];
    while(++i<300){
      arr.push({value:i});
    }
    console.log("shows new values when you expand even though the log was before the change:",arr)
    console.log("shows old value because no need to expand:",arr[0])
    arr.forEach(x => x.value += 10);
    console.log("shows new values because it is executed after change:",arr)
    

    【讨论】:

    • 实际上我在玩它更多,我更改了我的代码,以便我尝试在我的函数中设置选定的索引,该函数在 ajax 调用成功时调用,然后它就可以工作了。但如果它在 ajax 调用之外。设置所选索引不起作用...是因为尚未填充值吗?...
    • @psj01 正确,尚未填充这些值。这是因为 ajax 调用是异步的。这是一个高级主题,但这是一个好的开始:developer.mozilla.org/en-US/docs/Web/JavaScript/EventLoop
    • @psj01 是的,这就是为什么在我的示例中我使用 Promise。使阅读异步代码更容易。
    • @psj01 控制台按原样打印出对象,而不是原样。
    • @psj01 它与扩展有关,我在示例中添加了一个不需要扩展即可查看值的日志,该日志显示了您记录时的值。但是当需要扩展时,它会在您在控制台中扩展时计算值。
    猜你喜欢
    • 1970-01-01
    • 2017-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2010-11-21
    • 2012-10-04
    相关资源
    最近更新 更多