【问题标题】:How can I change the index of input element dynamically based on parent and inner parent in jquery如何根据jquery中的父级和内部父级动态更改输入元素的索引
【发布时间】:2015-04-30 04:48:40
【问题描述】:

如何根据 jQuery 中的父级和内部父级计数动态更改输入元素的索引。 在以下代码中如何更改表单元素的索引

<div id='parent_container0'>
    <div id='parent_inner_container0'>
      <label> Name </label>
        <input type='text' name='name[]'/>
        <div id='child_container0'>
            <div id='child_inner_container0'>
                <label> Email </label>
                <input type='text' name='email[]'/>
                <label> Phone </label>
                <input type='text' name='phone[]'/>
            </div>
        </div>
    </div>
</div>
<div id='parent_container1'>
<div id='parent_inner_container1'>
    <label> Name </label>
    <input type='text' name='name[]'/>
    <div id='child_container1'>
        <div id='child_inner_container1'>
            <label> Email </label>
            <input type='text' name='email[]'/>
            <label> Phone </label>
            <input type='text' name='phone[]'/>
        </div>
    </div>
</div>
</div>

我需要更改表单元素的名称为

name[0]
email[0][0]
phone[0][0]
name[1]
email[1][0]
phone[1][0]

基于 jQuery 中这些元素的父级索引。 我怎样才能做到这一点? 任何帮助表示赞赏。 谢谢,

注意:要求是使用嵌套表单添加更多的父表单和子表单,每个表单都有嵌套表单字段我使用以下代码更改索引。

$('.parent_container').each(function(i) { 
    var pindex = $(this).index(); 
    var mainfrm=$(this); 
    var orgname=""; 
    mainfrm.find('.parent_container_inner').each(function(j) {  
        $(this).find('input, select, textarea').each(function(k){ 
            orgname = $(this).attr('name'); 
            orgname = orgname.replace(/[[]\d]+/g,""); 
            $(this).attr('name', orgname+"["+pindex+"]["+j+"]["+k+"]"); 
        }); 
    }); 
});

【问题讨论】:

  • 请展示您尝试过的内容。也很好奇为什么你需要这样做
  • 我正在使用嵌套表单克隆。提交表单后,我必须将子表单值一个接一个地映射到父子表单值
  • 不太明白为什么在服务器上映射数据与在客户端重新映射名称有什么不同
  • 您的要求很不明确。首先,与@charlietfl 相同的问题,为什么需要在客户端重新映射名称?其次,您是否要考虑重新映射 'child_inner_container1' 中的 '1' 之类的 id 索引,或者它们是否无关紧要(如您在示例中所说)?第三也是最后,当你提到“表格”时,你指的是form吗?

标签: javascript jquery html css indexing


【解决方案1】:

首先,您应该选择您的父“容器”:

$("div[id^=parent_container]").each(function(){
    console.log(this);
});

它将打印您的两个parent_containerparent_container0parent_container1)。在这里查看如何将选择器属性与Starts With一起使用

然后您需要找到并替换所有name[]email[]phone[]。 所以,你应该使用Ends With,找到每个input你需要替换name

$("div[id^=parent_container]").each(function(){
    var parentContainerId = this.id.replace('parent_container', '');
    $(this).find("input[name$='[]']").each(function(){
        var newName = this.name.replace('[]', '[' + parentContainerId + ']');
        this.name = newName;
    })
});

这里是Fiddle

另外,关于你的问题,你一定要好好看看JQuery Selectors

【讨论】:

  • 注意 - 将工作一次,但如果需要再次进行索引(例如删除一行)将无法工作
  • @charlietfl 是的,但是您可以轻松地将它放在一个函数中,并在需要再次进行索引时调用它。
  • 如果你这样做,选择器会失败,名称中将不再有[]。根据用例,可能不是问题......只是提到它
  • 感谢您的回复。我有 n 级内部形式,如上述形式。我必须检查每个级别并根据这些表单元素的级别父索引更改表单元素的名称。我怎样才能做到这一点。你能给出所有内部形式通用的任何可能的示例代码吗?
  • @charlietfl true,尽管您可以将其更改为更通用的选择器,例如 "input",然后替换全名字符串而不是仅使用“[]”。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 2012-11-07
  • 1970-01-01
相关资源
最近更新 更多