根据某些业务逻辑动态添加和删除复选框事件

Add and remove checkbox events dynamically depending on some business logic?

本文关键字:添加 删除 复选框 事件 动态 业务      更新时间:2023-09-26

场景:

我有一个带有复选框的结果表,当复选框被选中时,行的内容(实际上只有2列连接,被复制到一个新的div中,带有作业代码和作业名称(。这非常有效,我已经避免了重复。但是,在新的resultsdiv中,我创建了一个锚标记来删除div本身。删除div之后,我应该能够使用复选框再次添加所选作业。请注意,结果表中有许多作业,因此再次将标志设为false将不起作用。

如果你找到这个问题的更好标题,请告诉我

    //On every checkbow that is clicked
    var flag = false;
    $("#ctl00_PlaceHolderMain_myGrid input").change(function () {
        if (this.checked && flag === false) {
            flag = true;
            var jobCode = $(this).parent().parent().parent().find("td:eq(2)").text()
            var jobName = $(this).parent().parent().parent().find("td:eq(1)").text()
            var displayvalue = jobCode.toUpperCase() + " - " + jobName.toUpperCase();                      
            AddSelectedJob(jobCode, displayvalue);
            //$(this).unbind('change'); //Unbind the change event so that it doesnt fire again
            FillSelectedJobs();            
        }
    });

//Add selected job in the results div
function AddSelectedJob(id, display) {
    //create a div for every selected job
    $("[id$=ResultsDiv]").append('<div class="selectedjobs" id=' + id + '>' + display + '<a href="javascript:;" onclick="removeSelectedJob(this)">Remove selected job</a></div>');
}
//Removes the selected job from the resutls div
function removeSelectedJob(el) {
    $(el).parent().remove();
}

生成的html如下所示:

<div>
            <div style="height: 300px; overflow: auto; float: left">
                <div>
        <table cellspacing="0" cellpadding="4" id="ctl00_PlaceHolderMain_myGrid" style="color:#333333;width:100%;border-collapse:collapse;">
            <tr style="color:White;background-color:#5D7B9D;font-weight:bold;">
                <th scope="col">&nbsp;</th><th scope="col">JobCode</th><th scope="col">JobName</th><th scope="col">JobPartner</th><th scope="col">JobManager</th><th scope="col">ClientName</th>
            </tr><tr style="color:#333333;background-color:#F7F6F3;">
                <td>
                                <input id="ctl00_PlaceHolderMain_myGrid_ctl02_CheckBox1" type="checkbox" name="ctl00$PlaceHolderMain$myGrid$ctl02$CheckBox1" />
                            </td><td>jobcode01</td><td>jobname</td><td>xx</td><td>xx</td><td>xx</td>
            </tr>
        </table>
    </div>
            </div>
            <div style="margin-top: 0px; margin-left: 10px; float: left">
                <span>Selected :</span>
                <div id="ResultsDiv" style="margin-top: 0px">
                </div>
            </div>

首先,我建议对HTML进行一些更改。将样式从DOM中分离出来,并将它们放在类中。

这确保了问题的分离

HTML

<div>
    <div class="divMain">
        <div>
            <table cellspacing="0" cellpadding="4" 
                     id="ctl00_PlaceHolderMain_myGrid" class="table">
                <tr class="rowHead">
                    <th scope="col">&nbsp;</th>
                    <th scope="col">JobCode</th>
                    <th scope="col">JobName</th>
                    <th scope="col">JobPartner</th>
                    <th scope="col">JobManager</th>
                    <th scope="col">ClientName</th>
                </tr>
                <tr class="row">
                    <td>
                        <input id="ctl00_PlaceHolderMain_myGrid_ctl02_CheckBox1" 
                           type="checkbox" 
                          name="ctl00$PlaceHolderMain$myGrid$ctl02$CheckBox1"
                          data-flag="false" />
                    </td>
                    <td>column1</td>
                    <td>column2</td>
                    <td>column3</td>
                    <td>column4</td>
                    <td>column5</td>
                </tr>
            </table>
        </div>
    </div>
    <div class="m0 selected"> 
        <span>Selected :</span>
        <div id="ResultsDiv" class="m0"></div>
    </div>

CSS

.divMain{
    height: 300px;
    overflow: auto;
    float: left
}
.table{
    color:#333333;
    width:100%;
    border-collapse:collapse;
}
.rowHead{    
    color:White;
    background-color:#5D7B9D;
    font-weight:bold;
}
.row{
 color:#333333;
 background-color:#F7F6F3;   
}
.m0{
     margin-top: 0px;   
}
.selected{
    margin-left: 10px;
    float: left
}

Javascript

$("#ctl00_PlaceHolderMain_myGrid input").change(function () {
    // Next cache your selector
    // so that you need not crawl the DOM multiple times
    var $this = $(this),
        $row = $this.closest('.row'),
        currFlag = Boolean($this.data('flag'));
    // As there might be multiple jobs , a single flag variable  
    // will not work. So you can set a data-flag attribute on the 
    // input that stores the current value
    if (currFlag === false && this.checked) {
        // Set the corresponding flag to true
        $this.data('flag', true);
        var jobCode = $row.find("td:eq(2)").text(),
            jobName = $row.find("td:eq(1)").text(),
            displayvalue = jobCode.toUpperCase() + " - " 
                         + jobName.toUpperCase(),
            inputId =  $this.attr('id')
        // Pass the input name too as you need to set the value of
        // the corresponding flag value again as you can add it multiple times         
        AddSelectedJob(jobCode, displayvalue, inputId);
        FillSelectedJobs();
    }
});
//Add selected job in the results div
function AddSelectedJob(id, display, inputId) {
    //create a div for every selected job
    // Use the inputId to save it as a data-id attribute  
    // on anchor so that you can set the value of the flag after 
    // removing it
    var html = '<div class="selectedjobs" id=' + id + '>' + display ;
    html += '<a href="javascript" data-id="'+ inputId 
                                 +'">Remove selected job</a></div>';                   
    $('[id$=ResultsDiv]').append(html);
}
// Remove the inline click event for the anchor and delgate it to the 
// static parent container
$('[id$=ResultsDiv]').on('click', 'a', function(e) {
    var $this = $(this),
        $currentCheckbox = $this.data('id');
    // Set the flag value of the input back to false
    $('#'+ $currentCheckbox).data('flag', false);
    e.preventDefault(); // prevent the default action of the anchor
    $this.closest('.selectedjobs').remove();
});

function FillSelectedJobs() {
    //save values into the hidden field
    var selectedJobs = $("[id$=ResultsDiv]").find("[class$='selectedjobs']");
    var returnvalue = "";
    for (var i = 0; i < selectedJobs.length; i++)
        returnvalue += selectedJobs[i].id + ";";
    $("[id$=HiddenClientCode]").val(returnvalue);
}

检查Fiddle