Jquery不在父循环内循环

Posted

技术标签:

【中文标题】Jquery不在父循环内循环【英文标题】:Jquery not looping inside parent loop 【发布时间】:2020-10-16 20:06:54 【问题描述】:

我有一个克隆“选择器”的 jquery 代码,其中它是许多其他元素的父级。

EDIT:我添加了调用“cloneMore”的函数。它应该在用户单击行内的按钮并在其下方创建另一行时调用。

EDIT 2:我添加了<tr> 所属的表。我试图在没有<tr> <td> 标签的情况下运行它,并且该功能有效!但遗憾的是它从 html 表中删除了它。为什么会这样?

jquery sn-p

$(document).on('click', '.add-form-row', function(e)
        alert("Button Click!");
        e.preventDefault();
        cloneMore('.form-row.spacer:last', 'form');
        return false;

function cloneMore(selector, prefix) 
        var newElement = $(selector).clone(true);

        newElement.find('input[type=text]').each(function()  //loops through the textfields
            console.log("print1");
        );
        
        newElement.each(function () 
            console.log("print2");
        );

html代码

    <div class="display_table">
    <table class="table table-hover table-striped">
        <thead class="thead-dark">
            <tr class="tablerow">
                <th scope="col">Item</th>
                <th scope="col">Item Description</th>
                <th scope="col">Quantity</th>
                <th scope="col">Delete</th>
            </tr>
        </thead>
        <tbody>
             formset.management_form 
            % for form in formset %
            <div class="row form-row spacer">
                <tr scope="row">
                    <div class="input-group">
                        <td><input type="text" name="form-0-item" class="form-control" id="id_form-0-item" value="" readonly="readonly"></td>
                        <td><input type="text" name="form-0-description" class="form-control" id="id_form-0-description" value="" readonly="readonly"></td>
                        <td><input type="text" name="form-0-quantity" class="form-control" id="id_form-0-quantity" value="" readonly="readonly"></td>
                        <div class="input-group-append"><td><button class="btn btn-success add-form-row">+</button></td></div>
                    </div>
                </tr>
            </div>
            % endfor %
        </tbody>
    </table>
</div>

但是,它甚至一次都没有通过循环,而且我在控制台中也没有得到“打印”。我确定父项中有一个文本字段。在这种情况下,它的 div 具有类“行形式-行间隔”

我的语法有问题吗?我在某处看到他们通过选择器获取父级,但在我的情况下,我将它放在一个变量中。有什么问题或解决方法吗?

【问题讨论】:

你是如何调用函数的,如果你执行 cloneMore('.input-group') 或 cloneMore('.form-row.spacer') 它将遍历该 html 内的输入-元素。 请添加一个sn-p(编辑并单击[&lt;&gt;]),请参阅minimal reproducible example。您的问题提到“在父循环内”,但只有一个循环。您的代码显示 cloneMore 但似乎没有被调用。这是一个小提琴(但您应该在问题中提供一个 sn-p),它显示 您的代码可以正常工作 按照呈现方式:jsfiddle.net/tqLywmh9 "在这种情况下,它的 div 类为“row form-row spacer” - 这让我怀疑您正在调用 cloneMore(".row .form-row .spacer") 而不是 cloneMore(".row.form-row.spacer") @ 987654323@ aahh 对不起,我忘了包含调用它的函数!! 我尝试运行它并添加了cloneMore('.form-row.spacer:last', 'form');,并有一个单独的each() 循环newElement.each(function () console.log(this); );,它只经过一次并打印&lt;div class="row form-row spacer"&gt;&lt;/div&gt;,其中没有元素。我希望它打印 4 次,因为它里面有 4 个元素。怎么了? 【参考方案1】:

我想我有点想通了。即使没有引用&lt;td&gt;&lt;tr&gt; 标签,我也试图选择&lt;input&gt; 标签。所以 jquery 不知道我要选择什么。因此,在我对整个表和 jquery 脚本进行了一些更改之后,它就像我预期的那样工作。但是,任何有关如何改进此代码的建议都将不胜感激!我把它贴出来以防有人需要。

另外,我忘了把这个Stack Overflow answer 归功于 sn-ps。

html代码

<table class="table table-hover table-striped" id="part_table">
        <thead class="thead-dark">
            <tr class="tablehead">
                <th scope="col">Item</th>
                <th scope="col">Item Description</th>
                <th scope="col">Quantity</th>
                <th scope="col">Delete</th>
            </tr>
        </thead>
        <tbody>
             formset.management_form 
            % for form in formset %
            <div class="row form-row">
                <tr class="tablerow">
                    <td><input type="text" name="form-0-item" class="form-control" id="id_form-0-item" value="" readonly="readonly"></td>
                    <td><input type="text" name="form-0-description" class="form-control" id="id_form-0-description" value="" readonly="readonly"></td>
                    <td><input type="text" name="form-0-quantity" class="form-control" id="id_form-0-quantity" value="" readonly="readonly"></td>
                    <td><button class="btn btn-success add-form-row">+</button></td>
                </tr>
            </div>
            % endfor %
        </tbody>
    </table>

jquery sn-p

<script type="text/javascript">
    function cloneMore(prefix)  
        var lastrowtbl = $('#part_table tr.tablerow:last').clone(true); 

        var total = $('#id_' + prefix + '-TOTAL_FORMS').val();
        var currentnum = total - 1

        lastrowtbl.find('input[type=text]').each(function (i, el) 
            console.log(this);
            var name = $(this).attr('name');
            if(name) 
                name = name.replace('-' + currentnum + '-', '-' + total + '-');
                var id = 'id_' + name;
                $(this).attr('name' : name, 'id' : id).val('').removeAttr('checked');
            
        );

        total++;
        $('#id_' + prefix + '_TOTAL_FORMS').val(total);
        $('#part_table tr.tablerow:last').after(lastrowtbl);

        var conditionRow = $('#part_table tr.tablerow:not(:last)');
        conditionRow.find('.btn.add-form-row')
        .removeClass('btn-success').addClass('btn-danger')
        .removeClass('add-form-row').addClass('remove-form-row')
        .html('-');
        return false;
    

    $(document).on('click', '.add-form-row', function(e)
        alert("Button Click!");
        e.preventDefault();
        cloneMore('form');
        return false;
    );
    
</script>

【讨论】:

以上是关于Jquery不在父循环内循环的主要内容,如果未能解决你的问题,请参考以下文章

不在 for 循环内的顺序函数的 OpenMP 并行化

jQuery循环并隐藏多个父元素的子元素

使用jquery在循环内获取选择标签的值

在一个for循环体内执行n次的fork()函数创建n个子进程, 那么这些子进程的父进程是哪些 ?

JQuery操作Json循环插入到Table,求助!

Jquery 循环内间隔执行 异步执行