Javascript jquery动态添加html字段遇到了一些神秘的问题

Javascript jquery动态添加html字段遇到了一些神秘的问题,javascript,jquery,html,Javascript,Jquery,Html,我使用jquery根据用户的选择复制几个html字段。然而,我遇到了一个有趣的问题。一般来说,我要求用户选择他们需要多少应用程序: 如果只有一个应用程序: A.需要选择应用方法(为简单起见,仅“天线”可用);B选择“天线”后,它将询问您有关化学应用方法(CAM)的更多信息 如果他们选择两个应用程序,jquery代码将为您克隆并重命名必要的问题 我的问题是,当我选择有两个应用程序时,子问题“CAM”不会出现。经过一些故障排除,我发现问题可能出在这个javascript中:$('.app_metho

我使用jquery根据用户的选择复制几个html字段。然而,我遇到了一个有趣的问题。一般来说,我要求用户选择他们需要多少应用程序:

  • 如果只有一个应用程序: A.需要选择应用方法(为简单起见,仅“天线”可用);B选择“天线”后,它将询问您有关化学应用方法(CAM)的更多信息

  • 如果他们选择两个应用程序,jquery代码将为您克隆并重命名必要的问题

  • 我的问题是,当我选择有两个应用程序时,子问题“CAM”不会出现。经过一些故障排除,我发现问题可能出在这个javascript中:
    $('.app_method:last')。find('select')。change(function()
    。该语句会自动将我的循环索引增加1(有人能告诉我为什么会发生这种情况吗?),这与代码不匹配

    以下是我的代码的示例:

    下面是我的html代码:

    <div class="articles">
            <table align="center">
    
            <tr><th><label for="id_NOA">Number of applications:</label></th><td><select name="NOA" id="id_NOA">
                <option value="1" selected="selected">1</option>
                <option value="2">2</option>
                <option value="3">3</option>
            </select></td></tr>
    
            <tr><th><label for="id_Ap_m">Application method 1</label></th><td><select name="Ap_m" id="id_Ap_m">
                <option value="" selected="selected">Select an application method</option>
                <option value="1">Aerial</option>
            </select></td></tr>
    
            <tr><th><label for="id_CAM_1">Chemical application Method (CAM) 1</label></th><td><select name="CAM_1" id="id_CAM_1">
                <option value="2">2-Interception based on crop canopy</option>
                <option value="9">9-Linear foliar based on crop canop</option>
            </select></td></tr>
            </table>
     </div>
    
    
    申请数目:
    1.
    2.
    3.
    应用方法1
    选择应用程序方法
    空中的
    化学应用方法(CAM)1
    2-基于作物冠层的拦截
    基于作物canop的9-线性叶片
    
    ​ jquery代码:

    $(document).ready(function() {
    
        //this part of code controls inputs when there is only one application
        $('#id_CAM_1').attr('id', 'id_1').closest('tr').addClass('method_options').hide();
        $('#id_Ap_m').change(function() {
            $('tr.method_options').hide();
            if ($(this).val() == "1") {
                $('#id_' + $(this).val()).closest('tr').show();
            }
        });
    
        i = 1;
        $('.articles').find('table').addClass('table');
        $('#id_Ap_m').closest('tr').addClass('app_method');
    
        $('#id_NOA').change(function() {
            var total = $(this).val();
    
            //remove all
            $('.app_method').each(function(index) {
                if (index != 0) $(this).remove()
            });
    
            //create new ones
            for (var i = 2; i <= total; i++) {
                alert('a=' + i);
    
                $('.app_method:first').clone().appendTo('.table').find('label').text('Application method ' + i);
                $('.app_method:last').find('select').attr('name', 'Ap_m' + i).attr('id', 'id_Ap_m' + i);
                alert('b=' + i);
    
                $('<tr class="method_options_1' + i + '" style="display: none;"><th><label for="id_CAM_1">Chemical application Method (CAM)' + i + '</label></th><td><select name="CAM_1_' + i + '" id="id_1_' + i + '"><option value="2">2-Interception based on crop canopy</option><option value="9">9-Linear foliar based on crop canop</option></select></td></tr>').appendTo('.table');
                alert('c=' + i);
    
    //The following statement increase the loop index by one, which causes me problems. Can    
    //anyone let me know why this could happen?
                $('.app_method:last').find('select').change(function() {
                    alert('d=' + i)
                    $('.method_options_1').hide();
                    alert('e=' + i);
    
                    if ($(this).val() == "1") {
                        alert('e=' + i);
                        $('.method_options_1' + i).show();
                    }
                })
            }
        })
    })​
    
    $(文档).ready(函数(){
    //当只有一个应用程序时,这部分代码控制输入
    $('id#CAM_1').attr('id','id_1').closest('tr').addClass('method_options').hide();
    $('#id_Ap_m')。更改(函数(){
    $('tr.method_options').hide();
    如果($(this.val()=“1”){
    $('#id'+$(this.val()).closest('tr').show();
    }
    });
    i=1;
    $('.articles').find('table').addClass('table');
    $('#id_Ap_m')。最近('tr')。addClass('app_method');
    $('#id_NOA')。更改(函数(){
    var total=$(this.val();
    //全部删除
    $('.app_method')。每个(函数(索引){
    if(index!=0)$(this.remove())
    });
    //创造新的
    
    对于(var i=2;i我认为这可以做得更简单:(fiddle:)


    {row:i}
    位使jQuery将此数据附加到传递给函数的事件对象。然后我在函数的范围内创建
    var I
    ,它将不受
    I
    外部的影响,并将此值分配给它。

    因为您没有重新分配给
    I
    total
    ,所以这似乎不起作用是这样的。是什么让你认为循环索引正在改变?循环中的代码块是否运行了所需的次数?这一点很容易通过将
    console.log()
    作为循环的第一行来确认。@Utkanos,我放置了一些警报来显示I的改变,并且在一个循环中发现了改变()函数会自动将i增加1。感谢您提供的解决方案。但是您能告诉我为什么我的代码不起作用吗?似乎在change()函数中发生了问题。每页只能有一个ID为的元素;
    $('#ID_Ap_m')。change()
    仅指ID为“ID_Ap_m”的第一个元素我只是注意到我的“解决方案”不符合您的要求…立即编辑。它不会增加您的循环索引。循环完成后,i等于total+1。此回调在循环完成运行后运行,i仍然等于total+1。无论现在多次运行回调,i=total+1这说明了为什么回呼中的循环索引为total+1:
    <!DOCTYPE html><html><head></head><body>
    
    <table align="center"><tbody>
        <tr><th></th><td><a href="#" id="add_application">Add Application</a></td></tr>
    </tbody></table>
    
    <table id="template" style="display:none"><tbody>
        <tr>
            <th><label for="id_Ap_m_{n}">Application method {n}</label></th>
            <td>
                <select class="Ap_m" name="Ap_m_{n}" id="id_Ap_m_{n}" data-application="{n}">
                    <option value="" selected="selected">Select an application method</option>
                    <option value="1">Aerial</option>
                </select>
            </td></tr>
        <tr style="display:none" class="app_{n} method_1"><th><label for="id_CAM_{n}">Chemical Application Method (CAM) {n}</label></th><td><select name="CAM_{n}" id="id_CAM_{n}">
            <option value="2">2-Interception based on crop canopy</option>
            <option value="9">9-Linear foliar based on crop canopy</option>
        </select></td></tr>
    </tbody></table>
    
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script>
    jQuery(function($) {
        var applications = 0;
        $('#add_application').click(function() {
            applications++;
            var last_row = $(this).closest('tr');
            last_row.before(jQuery('#template tbody').html().replace(/{n}/g, applications));
        });
        $(document).delegate('.Ap_m', 'change', function() {
            var app = $(this).data('application');
            $('.app_'+app).hide();
            $('.app_'+app+'.method_'+this.value).show();
        });
    });
    </script>
    </body></html>
    
    $('.app_method:last').find('select').bind('change', { row: i }, function(event) {
        var i = event.data.row;
        alert('d=' + i)
        // ...
    });