JavaScript运行时错误:无法获取未定义或空引用的属性"forEach"

use*_*962 5 asp.net jquery master-pages drop-down-menu

我有一个aspx母版页应用程序,我在子aspx页面的asp:content部分有两个下拉列表控件.其中一个控件是从SQL数据库填充的.另一个是根据从第一个下拉列表中选择的项目填充的.我试图在我的代码中使用此解决方案,但是我收到一个错误:

JavaScript运行时错误:无法获取未定义或空引用的属性"forEach"

如何根据所选的州显示城市名称?
我的代码块是:

  <link rel="stylesheet" href="//code.jquery.com/ui/1.11.1/themes/smoothness/jquery-ui.css">
  <script src="//code.jquery.com/jquery-1.10.2.js"></script>
  <script src="//code.jquery.com/ui/1.11.1/jquery-ui.js"></script>

    <script type="text/javascript">
        AL = new Array('Birmingham', 'Montgomery', 'Tuscaloosa');
        FL = new Array('Miami', 'FtLauderdale', 'Jacksonville');
        GA = new Array('Atlanta', 'Macon', 'Athens');

        populateSelect();

        $(function () {

            $('#ddlState').change(function () {
                populateSelect();
            });

        });

        function populateSelect() {
            category = $('#ddlState').val();
            $('#ddlCity').html('');

            eval(category).forEach(function (t) {
                $('#ddlCity').append('<option>' + t + '</option>');
            });
        }
    </script>  

<asp:DropDownList ID="ddlCity" runat="server" CssClass="stdFldWidth" onchange="setFDFlag()">
</asp:DropDownList>    

<asp:DropDownList ID="ddlState" runat="server" CssClass="stdFldWidth" DataSourceID="dsUSState"
    DataTextField="US_State" DataValueField="State_ID" AutoPostBack="true" > 
</asp:DropDownList>  
Run Code Online (Sandbox Code Playgroud)

更新:

Protected Sub ddlState_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlType.SelectedIndexChanged
If ddlState.SelectedValue = "FL" Then
    DisplayRegulation(FL)
End If
Run Code Online (Sandbox Code Playgroud)

mel*_*cia 3

页面的常见问题ASP.NET,特别是如果您使用MasterPages.

生成的页面的元素将发生IDs变化。

解决您问题的一种解决方案是为这些元素赋予唯一性class,并在选择器中使用它而不是它们的IDs

<asp:DropDownList ID="ddlCity" runat="server" CssClass="stdFldWidth ddlCity" onchange="setFDFlag()">
</asp:DropDownList>    

<asp:DropDownList ID="ddlState" runat="server" CssClass="stdFldWidth ddlState" DataSourceID="dsUSState"
    DataTextField="US_State" DataValueField="State_ID" AutoPostBack="true" > 
</asp:DropDownList>
Run Code Online (Sandbox Code Playgroud)

...

$(function () {
    var states = {
        AL: ['Birmingham', 'Montgomery', 'Tuscaloosa'],
        FL: ['Miami', 'FtLauderdale', 'Jacksonville'],
        GA: ['Atlanta', 'Macon', 'Athens']
    };

    function populateSelect() {
        $('.ddlCity').empty();

        var stateSelected = $('.ddlState').val();

        if (stateSelected) {
            states[stateSelected].forEach(function (sel) {
                $('<option>').val(sel).text(sel).appendTo($('.ddlCity'));
            });
        }
    }

    populateSelect();

    $('.ddlState').on('change', function() { 
        populateSelect();

        return true;
    });
});
Run Code Online (Sandbox Code Playgroud)

使用 @sebnukem 建议进行编辑,将数据保存在 中object,这样您就可以摆脱eval().

通过将整个代码放置在jQuery文档就绪事件处理程序中进行更新。

jQuery通过在的 onchange 事件处理程序中返回 true 进行更新DropDownList,以继续PostBack.

演示