【问题标题】:jQuery-Ajax created Checkboxlist does not respond to clickjQuery-Ajax 创建的 Checkboxlist 不响应点击
【发布时间】:2019-02-18 06:34:38
【问题描述】:

我有一个单选按钮列表(rblcategories),更改选定值时,我使用ajax创建一个复选框列表并填充它。当任何复选框被选中/取消选中时,我需要更新我的数据表,但我无法让它响应状态变化。

这就是我所拥有和尝试过的(我删除了所有不必要的东西,如样式等)

<div class="row">
    <div class="col-sm-2">
        <label for="ddlYear">Select Year</label>
        <asp:DropDownList runat="server" ID="ddlYear" ClientIDMode="Static">
        </asp:DropDownList>
    </div>
    <div class="col-sm-4">
        <label for="rblCategories">Categories</label>
        <asp:RadioButtonList runat="server"
            ID="rblCategories" 
            ClientIDMode="Static" 
            DataTextField="Name" 
            DataValueField="TypeID" 
            AppendDataBoundItems="true">
        </asp:RadioButtonList>
    </div>
    <div class="col-sm-6" id="divSubCategory">
    </div>
</div>

//Using the selected values of ddlYear and rblCategories, populate table
function bindDataTable() {
    var year = $('#ddlYear').val();
    var selCategoryID = $('#rblCategories input:checked').val()
    var url = "";
    var params = "";

    // -1 refers to "All" categories
    if ('-1' == selCategoryID) {
        url = "../services/exp.asmx/GetExpenseByYear";
        params = JSON.stringify({ "Year": year });
    }
    else {
        url = "../services/exp.asmx/GetExpenseByYearByCategory";
        params = JSON.stringify({ "Year": year, "CategoryID": selCategoryID });
    }
    populteTable(url, params, tblExpenses);
}

//for testing
function bindDataTable(subCategories) {debugger
}

// create and populate sub-category checkbox list based on selected category
function updateSubTypes(typeID) {
    $.ajax({
        type: "POST",
        dataType: "json",
        contentType: "application/json; charset=utf-8",
        url: '<%=ResolveUrl("~/services/exp.asmx/GetExpenseSubTypeItems") %>',
        cache: false,
        data: "{ 'TypeID': '" + typeID + "' }",
        success: AjaxSucceeded,
        error: AjaxFailed
    });
}

function AjaxFailed(result) {
   alert('Failed to load checkbox list');
}

function AjaxSucceeded(result) {
    BindCheckBoxList(result);
}

function BindCheckBoxList(result) {
    $('#divSubCategory').empty();
    var items = JSON.parse(result.d);
    if (items.length > 0)
        CreateCheckBoxList(items);
}

function CreateCheckBoxList(checkboxlistItems) {
    var lbl = $('<label></label>').text('Sub-Categories');
    $('#divSubCategory').append(lbl);
    var table = $('<table></table>').attr({ id: 'cblSubCategory', class: 'form-control' });
    var row = table.append($('<tr></tr>'));
    var counter = 0;

    $(checkboxlistItems).each(function (i) {
        row.append($('<td></td>').append($('<input>').attr({
            type: 'checkbox', name: 'chklistitem', value: this.ExpenseSubTypeID, id: 'chklistitem' + counter
        })).append(
        $('<label>').attr({
            for: 'chklistitem' + counter++
        }).text(this.Name)));
    });
    $('#divSubCategory').append(table);
}

$(document).ready(function () {
    $('#rblCategories input').change(function () {
        var selCategoryID = $(this).val();
        if (selCategoryID != null) {
            updateSubTypes(selCategoryID)
        }
        bindDataTable();
    });

    // This never gets hit; I tried chklistitem instead of cblSubCategory too
    $('#cblSubCategory input').change(function () {debugger
        var selCategoryID = $('#rblCategories input:checked').val()
        var names = $('.parent input:checked').map(function () {
            return this.name;
        }).get();
        bindDataTable(names);
    });
})

【问题讨论】:

    标签: javascript jquery asp.net ajax


    【解决方案1】:

    $('#cblSubCategory input').change(function () {

    $('#cblSubCategory').on('change','input', function () {

    动态加载元素时使用 jQuerys .on() 方法,该方法将查找添加到 DOM 中与该选择器匹配的任何新元素。否则 jQuery 只会在初始执行时解析一次 DOM。

    $(document).ready(function () {
        $('#rblCategories').on('change','input', (function () {
            var selCategoryID = $(this).val();
            if (selCategoryID != null) {
                updateSubTypes(selCategoryID)
            }
            bindDataTable();
        });
    
        // This never gets hit; I tried chklistitem instead of cblSubCategory too
        $('#cblSubCategory').on('change','input', function () {debugger
            var selCategoryID = $('#rblCategories input:checked').val()
            var names = $('.parent input:checked').map(function () {
                return this.name;
            }).get();
            bindDataTable(names);
        });
    })
    

    【讨论】:

    • 感谢您的回复。我按照 rblCategories 和 cblSubCategory 的建议进行了更改。 rblCategories 运行良好,即使在我进行更改之前它可以正常工作,但 cblSubCategory 仍然无法正常工作。不确定是否正常,但是当复选框列表显示在浏览器中时,响应 rblCategories 选择的更改,并且我执行“查看源代码”,我没有看到任何 id 为“cblSubCategory”的控件;我只看到应该在其中的空 div。
    • 我做了一些更改,可能会对问题有所了解,但不确定是否应该使用“更新”或其他方式更新我的原始帖子。基本上,在将生成的表附加到 div 之后,我将复选框列表的 onchange 事件移至 CreateCheckBoxList 函数。现在,当我进行选择时,该功能被点击,但它没有显示任何检查。我还修改了代码并向 divSubCategory 添加了“onchange”属性,这也有效; onchange 的功能被击中,但再次显示未选择任何内容。也许是我检查选定复选框的方式?
    【解决方案2】:

    以下更改解决了该问题;但是,我将 cantucket 的回复标记为答案,因为他让我朝着正确的方向前进。

    我在“createCheckBoxList”函数中添加了一条 attr 行;在我将结果表附加到 div 之后:

    function createCheckBoxList(checkboxlistItems) {
        var lbl = $('<label></label>').text('Sub-Categories');
        $('#divSubCategory').append(lbl);
        var table = $('<table></table>').attr({ id: 'cblSubCategory', class: 'form-control' });
        var row = table.append($('<tr></tr>'));
        var counter = 0;
    
        $(checkboxlistItems).each(function (i) {
            row.append($('<td></td>').append($('<input>').attr({
                type: 'checkbox', name: 'cblSubCategory', value: this.ExpenseSubTypeID, id: 'cblSubCategory' + counter
            })).append(
            $('<label>').attr({
                for: 'cblSubCategory' + counter++
            }).text(this.Name)));
        });
        $('#divSubCategory').append(table);
    
        // added this line
        $('#divSubCategory').attr({ onclick: "onSubCatChange()" });
    }
    

    我添加了“onSubCatChange()”函数:

    function onSubCatChange() {
        // Both following methods work to get list o checked items
        var names = [];
        $('#cblSubCategory input:checked').each(function() {
            names.push(this.value);
        });
    
        var names2 = $('#cblSubCategory input:checked').map(function () {
            return this.value;
        }).get();
    
        bindDataTable(names);
    }
    

    并且我在 document.ready() 函数中删除了复选框列表的更改处理程序。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2021-02-21
      • 2020-02-05
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多