2012-08-08 65 views
3

目前我有一个功能正常的代码,用于在我的页面上动态添加和删除表单输入。我有多个表单需要包含在页面中,因此我做了一个事件操作,他们可以按下按钮,并隐藏除相关表单之外的所有表单。这工作得很好,但它创建了与我的jQuery/JavaScript代码冲突,因为代码使用类名来动态添加或删除输入字段。这两种形式都必须在同一个类名下才能使用jQuery函数,但这会产生冲突,并且该函数将停止工作。我可以只写两个版本的函数(每个类都有一个版本),但我试图找到一种方法来概括这个,这样我就不必有太多的函数。我在想这样做这样的事情:推广jQuery动态添加/删除多个表单的表单输入

$('.ccinput').addClass('dinput').removeClass('ccinput'); 

在那里我会相应地改变每个窗体的类名,这样他们将与jQuery函数传递唯一的。这种方法似乎非常容易出错,尤其是对于2个以上的表格(我计划总共有4个表格)。你们知道另一种我可以做到的方式吗?这里是我的HTML代码作为参考:

编辑:我已经对代码进行了重大更改,所以这里是新版本。我删除了表单输入中的所有ID值,并更改了jQuery函数,以便它不使用ID值作为选择器。这消除了一些冲突。我正在尝试使用attr('class','newclass'),以便jQuery函数适用于这两种代码。它似乎对第一种形式完美地起作用,但它拒绝为第二种形式发挥作用。我不知道为什么。

<html> 

<head> 
<title></title> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script> 
<script src="jquery.maskedinput.js" type="text/javascript"></script> 

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#table1").hide(); 
     $("#table2").hide(); 
     $("#cc_button").click(function(){ 
      $("#table1").show(); 
      $("#table2").hide(); 
      $("#cctable tr").attr('class', 'dinput'); 
      $("#dbtable tr").attr('class', 'dbinput'); 
     }); 
     $("#db_button").click(function(){ 
      $("#table2").show(); 
      $("#table1").hide(); 
      $("#dbtable tr").attr('class', 'dinput'); 
      $("#cctable tr").attr('class', 'ccinput'); 
     }); 
     $('#btnAdd').click(function() { 
      var num  = $('.dinput').length; // how many "duplicatable" input fields we currently have 
      var newNum = new Number(num + 1);  // the numeric ID of the new input field being added 

      // create the new element via clone(), and manipulate it's ID using newNum value 
      var newElem = $('.dinput:last').clone(); 

      // insert the new element after the last "duplicatable" input field 
      $('.dinput:last').after(newElem); 
      $(".dinput:last td:first").replaceWith("<td>" + newNum + "</td>"); 

      // enable the "remove" button 
      $('#btnDel').attr('disabled',''); 

      $(".date").mask("99/99/9999"); 

      // business rule: you can only add 20 names 
      if (newNum == 20) 
       $('#btnAdd').attr('disabled','disabled'); 
     }); 

     $('#btnDel').click(function() { 
      var num = $('.dinput').length; // how many "duplicatable" input fields we currently have 
      $('.dinput:last').remove();  // remove the last element 

      // enable the "add" button 
      $('#btnAdd').attr('disabled',''); 

      // if only one element remains, disable the "remove" button 
      if (num-1 == 1) 
       $('#btnDel').attr('disabled','disabled'); 
     }); 

     $(".date").mask("99/99/9999"); 
    }); 
</script> 
</head> 
<body> 
<div id="tablebuttons"> 
<button type="button" id="cc_button">CC</button> <button type="button" id="db_button">DB</button> 
</div> 
<div id="table1"> 

<form id="ccards" method="post" action="<?php echo htmlentities($PHP_SELF); ?>"> 
<table border="1" cellspacing="0"> 
<tr> 
<th></th> 
<th># (last four digits)</th> 
<th>Amount</th> 
<th>Approval</th> 
<th>Date Received</th> 
</tr> 
<tbody id ="cctable" > 
<tr class="ccinput"> 
    <td> 1 </td> 
    <td> <input type="text" name="cc_num[]" maxlength="4" /> </td> 
    <td> <input type="int" name="cc_amnt[]" /> </td> 
    <td> <input type="text" name="cc_app[]" maxlength="10" /> </td> 
    <td> <input class="date" type="text" name="cc_date[]" /> </td> 
</tr> 
</tbody> 
</table> 
<div> 
    <input type="button" id="btnAdd" value="Add CC" /> 
    <input type="button" id="btnDel" value="Remove CC" /> 
</div> 
<input type="submit" value="Submit" name="submit" /> 
</form> 
</div> 
<div id="table2"> 

<form id="db" method="post" action="<?php echo htmlentities($PHP_SELF); ?>"> 
<table border="1" cellspacing="0"> 
<tr> 
<th></th> 
<th>DB #</th> 
<th>Amount</th> 
<th>Date</th> 
</tr> 
<tbody id="dbtable"> 
<tr class="dbinput"> 
    <td> 1 </td> 
    <td> <input type="text" name="db_num[]" /> </td> 
    <td> <input type="int" name="db_amnt[]" /> </td> 
    <td> <input class="date" type="text" name="db_date[]" /> </td> 
</tr> 
</tbody> 
</table> 
<div> 
    <input type="button" id="btnAdd" value="Add DB" /> 
    <input type="button" id="btnDel" value="Remove DB" /> 
</div> 
<input type="submit" value="Submit" name="submit" /> 
</form> 
</div> 
</body> 

</html> 
+1

做得好用于向DRY原则前进,但我可以问你一个演示张贴到[JS小提琴(http://jsfiddle.net/),或类似,所以我们可以很容易地看到发生了什么并进行更改? – 2012-08-08 23:16:56

+0

我从来没有使用JS小提琴,但我认为这应该是这样的: http://jsfiddle.net/Sz8JQ/1/ – user1562781 2012-08-08 23:25:53

回答

0

好的,我解决了它。有我的选择多问题,我不得不修复,但此后以下解决方案完美的作品:

$("#cc_button").click(function(){ 
    $("#table1").show(); 
    $("#table2").hide(); 
    $("#cctable tr").attr('class', 'dinput'); 
    $("#dbtable tr").attr('class', 'dbinput'); 
}); 
$("#db_button").click(function(){ 
    $("#table2").show(); 
    $("#table1").hide(); 
    $("#dbtable tr").attr('class', 'dinput'); 
    $("#cctable tr").attr('class', 'ccinput'); 
}); 

这基本上改变每个根据被按下按钮表的类属性。从理论上讲,这应该适用于4种形式,尽管我还没有尝试过。这对于那些希望看到我做了什么更新的代码(因为第一个代码,我改变了很多):

<html> 

<head> 
<title></title> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script> 
<script src="jquery.maskedinput.js" type="text/javascript"></script> 

<script type="text/javascript"> 
    $(document).ready(function() { 
     $("#table1").hide(); 
     $("#table2").hide(); 
     $("#cc_button").click(function(){ 
      $("#table1").show(); 
      $("#table2").hide(); 
      $("#cctable tr").attr('class', 'dinput'); 
      $("#dbtable tr").attr('class', 'dbinput'); 
     }); 
     $("#db_button").click(function(){ 
      $("#table2").show(); 
      $("#table1").hide(); 
      $("#dbtable tr").attr('class', 'dinput'); 
      $("#cctable tr").attr('class', 'ccinput'); 
     }); 
     $('.btnAdd').click(function() { 
      var num  = $('.dinput').length; // how many "duplicatable" input fields we currently have 
      var newNum = new Number(num + 1);  // the numeric ID of the new input field being added 

      // create the new element via clone(), and manipulate it's ID using newNum value 
      var newElem = $('.dinput:last').clone(); 

      // insert the new element after the last "duplicatable" input field 
      $('.dinput:last').after(newElem); 
      $(".dinput:last td:first").replaceWith("<td>" + newNum + "</td>"); 

      // enable the "remove" button 
      $('.btnDel').attr('disabled',''); 

      $(".date").mask("99/99/9999"); 

      // business rule: you can only add 20 names 
      if (newNum == 20) 
       $('.btnAdd').attr('disabled','disabled'); 
     }); 

     $('.btnDel').click(function() { 
      var num = $('.dinput').length; // how many "duplicatable" input fields we currently have 
      $('.dinput:last').remove();  // remove the last element 

      // enable the "add" button 
      $('.btnAdd').attr('disabled',''); 

      // if only one element remains, disable the "remove" button 
      if (num-1 == 1) 
       $('.btnDel').attr('disabled','disabled'); 
     }); 

     $(".date").mask("99/99/9999"); 
    }); 
</script> 
</head> 
<body> 
<div id="tablebuttons"> 
<button type="button" id="cc_button">CC</button> <button type="button" id="db_button">DB</button> 
</div> 
<div id="table1"> 

<form id="ccards" method="post" action="<?php echo htmlentities($PHP_SELF); ?>"> 
<table border="1" cellspacing="0"> 
<tr> 
<th></th> 
<th># (last four digits)</th> 
<th>Amount</th> 
<th>Approval</th> 
<th>Date Received</th> 
</tr> 
<tbody id ="cctable" > 
<tr class="ccinput"> 
    <td> 1 </td> 
    <td> <input type="text" name="cc_num[]" maxlength="4" /> </td> 
    <td> <input type="int" name="cc_amnt[]" /> </td> 
    <td> <input type="text" name="cc_app[]" maxlength="10" /> </td> 
    <td> <input class="date" type="text" name="cc_date[]" /> </td> 
</tr> 
</tbody> 
</table> 
<div> 
    <input type="button" class="btnAdd" value="Add" /> 
    <input type="button" class="btnDel" value="Remove" /> 
</div> 
<input type="submit" value="Submit" name="submit" /> 
</form> 
</div> 
<div id="table2"> 

<form id="db" method="post" action="<?php echo htmlentities($PHP_SELF); ?>"> 
<table border="1" cellspacing="0"> 
<tr> 
<th></th> 
<th>DB #</th> 
<th>Amount</th> 
<th>Date</th> 
</tr> 
<tbody id="dbtable"> 
<tr class="dbinput"> 
    <td> 1 </td> 
    <td> <input type="text" name="db_num[]" /> </td> 
    <td> <input type="int" name="db_amnt[]" /> </td> 
    <td> <input class="date" type="text" name="db_date[]" /> </td> 
</tr> 
</tbody> 
</table> 
<div> 
    <input type="button" class="btnAdd" value="Add" /> 
    <input type="button" class="btnDel" value="Remove" /> 
</div> 
<input type="submit" value="Submit" name="submit" /> 
</form> 
</div> 
</body> 

</html> 
0

您可以使用这样的事情。

//when the Add Field button is clicked 
$("#add").click(function (e) { 
//Append a new row of code to the "#items" div 
    $("#items").append('<div><input type="text" name="input[]"><button class="delete">Delete</button></div>'); 
}); 

的详细教程http://voidtricks.com/jquery-add-remove-input-fields/

相关问题