2012-06-15 72 views
0

我想下一个选择元素(因为将有多个具有相同ID),这里是代码获得一个最接近的选择元素与jQuery

function fillProds(catid) { 
    $.get("http://localhost/crops/?module=from-receipt&action=getproducts&format=json&catid="+catid , null,function(d){ 
     CC = eval(d); 
     t = $(this).find('select'); 
     alert(t); 
     t.options.length=0; 
     t.options[0]=new Option("",""); 
     for(i=0;i<CC.length;i++) { 
      t.options[i+1]=new Option(CC[i].name,CC[i].id); 
     } 
    }); 
} 

和HTML部分

<tr> 
       <td class="first" width="172"> 
        <select onchange="fillProds(this.value)" id="catid"> 
         <option></option> 
         <?php foreach ($cats as $v => $r) { ?> 
          <option value="<?=$r['id']?>"><?=$r['name']?></option>'; 
         <?php } ?> 
        </select> 
       <td> 
        <input type="hidden" name="transindetid[]" value="" /> 
        <select name="transindet[prodid][]" id="prods" class="validate-not-first"> 
         <option></option> 
        </select> 
       </td> 
       <td class="last"> 
        <input type="text" name="transindet[qty][]" class="required" value=""> &nbsp; 
        <a href="#" class="delRow" style="color:red">x</a> 
       </td> 
</tr> 

所以问题是我得到错误,如设置未定义的长度,可能是因为我没有正确地获取select元素。 上述任何更正,以便我可以使其正确工作,并选择下一个选择元素?

谢谢。

+1

'因为会有与相同的身份证号码是多重的,恕我直言,id应该/必须是唯一的。 – xyz

+0

@Ajinkya不在您的意见。 Id的**必须是唯一的。 – Th0rndike

+0

你是否认为catid?好吧,我发送它作为参数,但仍然给我同样的问题。有一个jquery复制/克隆这个行(tr),所以它必须复制id,所以我删除了#catid作为选择器。 – Shakir

回答

0

好,我得到了一个解决方案

function fillProds(catid,obj) { 
    $.get("http://localhost/crops/?module=from-receipt&action=getproducts&format=json&catid="+catid , null,function(d){ 
     CC = eval(d); 
     trs = $(obj).closest('tr'); 
     t = trs.find('#prods').get(0); 
     t.options.length = 0; 
     t.options[0]=new Option("",""); 
     for(i=0;i<CC.length;i++) { 
      t.options[i+1]=new Option(CC[i].name,CC[i].id); 
     } 
    }); 
} 

<tr> 
       <td class="first" width="172"> 
        <select onchange="fillProds(this.value,this)" id="catid"> 
         <option></option> 
         <?php foreach ($cats as $v => $r) { ?> 
          <option value="<?=$r['id']?>"><?=$r['name']?></option>'; 
         <?php } ?> 
        </select> 
       <td id="select"> 
        <input type="hidden" name="transindetid[]" value="" /> 
        <select name="transindet[prodid][]" id="prods" class="validate-not-first"> 
         <option></option> 
        </select> 
       </td> 
       <td class="last"> 
        <input type="text" name="transindet[qty][]" class="required" value=""> &nbsp; 
        <a href="#" class="delRow" style="color:red">x</a> 
       </td> 
</tr> 

所以在其寻找最近的TR和获得的第一个元素(我认为)的时刻,具有ID电棒

1

这是你的意思吗?

http://api.jquery.com/eq-selector/

在jQuery中您可以使用选择像$("select").next()$("select:eq(1)")

+0

仍然出现错误“Uncaught TypeError:无法为两个选项设置未定义的属性'长度'”。 你能帮我写一个孩子的代码吗 – Shakir

+0

请详细说明一下,你是否只想选择第一个下一个'select'元素?你从哪一点开始搜索? – akalucas

+0

有两行说, 左侧有一个选择框,信息添加到同一行中的下一个选择框。 另一行有两个选择框跟在相同的场景下(左边的选择框填充右边的选择框在同一行) – Shakir

0

尝试删除内嵌结合和的jQuery做。

<td class="first" width="172"> 
       <select class="s-parent" id="catid"> 
        <option></option> 
        <?php foreach ($cats as $v => $r) { ?> 
         <option value="<?=$r['id']?>"><?=$r['name']?></option>'; 
        <?php } ?> 
       </select> 
      <td> 
       <input type="hidden" name="transindetid[]" value="" /> 
       <select name="transindet[prodid][]" id="prods" class="validate-not-first"> 
        <option></option> 
       </select> 
      </td> 
      <td class="last"> 
       <input type="text" name="transindet[qty][]" class="required" value=""> &nbsp; 
       <a href="#" class="delRow" style="color:red">x</a> 
      </td> 

这是你的新的JS:

$('.s-parent').on('change',function() { 
    var $el =$(this), 
    catid = $el.val(); 

    $.get("http://localhost/crops/?module=from-receipt&action=getproducts&format=json&catid="+catid , null,function(d){ 
     CC = eval(d); 
     t = $('select',$el.closest('tr')).eq(1); //the second select in the same tr 
     alert(t); 
     t.options.length=0; 
     t.options[0]=new Option("",""); 
     for(i=0;i<CC.length;i++) { 
      t.options[i+1]=new Option(CC[i].name,CC[i].id); 
     } 
    }); 
}); 

最后,那些都是主要变化

var $el =$(this), 
     catid = $el.val(); 

t = $('select',$el.closest('tr')).eq(1); //the second select in the same tr 

另外,我强烈建议你避免的eval(d )。 insted的使用jquery.getJson

+0

它给了我意想不到的令牌错误 – Shakir

+0

现在好了,我忘了复制最后的“); –