1

<< 参考这个话题>>

如何根据其行将从模态框中选择的值传递给每个文本框?您可以动态添加或删除文本框,为了填充文本框,您必须从模态框中选择值。

例如:

[Add Textbox] [Remove Textbox]
[TextBox1] [Link]
[TextBox2] [Link]
 ...
[TextBoxX] [Link]

单击链接时,它会显示一个模态框,供用户选择模态框上提供的表格上的列表,并将值返回到其行上的文本框。我创建了下面的代码,但它返回每个文本框的值。

请看下面的代码:

此 javascript 代码用于添加/删除文本框:

<script type="text/javascript">
       //Add
       $('#tblDetail tbody').on("click", "a", function() {
         $("#products_modal_box").data("target", $(this).siblings("input"));
         showProductsModalBox();
         return false;
       });

       $(document).ready(function() {
         $("#addRow").click(function() {
           $('#tblDetail tbody>tr:last').clone(true).insertAfter('#tblDetail tbody>tr:last');
           $('#tblDetail tbody>tr:last #field1').val(''); 
           $('#txtTotalRow').val(tblDetail.rows.length - 1);
         });
       });  

       function removeRowFromTable() {
         var tbl = document.getElementById('tblDetail');
         var lastRow = tbl.rows.length;
         if (lastRow > 2) tbl.deleteRow(lastRow - 1);
       }
</script>

这是添加/删除文本框和文本框本身的表单:

<form id="form1" action="#" method="post">
  <input type="button" id="addRow" value="ADD" />
  <input type="button" id="removeRow" value="REMOVE" onclick="removeRowFromTable(); $('#txtTotalRow').val(tblDetail.rows.length - 1);"/>
  <input type="hidden" name="txtTotalRow" id="txtTotalRow" value="1" />

  <table cellpadding='0' cellspacing='0' border='0' id='tblDetail' width='100%'>
    <tr>
  <th colspan="3">&nbsp;</th>
</tr>
<tr>
  <td>
    <input type="text" name="field1[]" id="ProductID" />
    <a href="#" ><!-- removed - onclick="showProductsModalBox(); return false;" /--> 
      Choose
    </a>
  </td>
</tr>
  </table>
</form>

并且模态框脚本被称为this thread。注入链接以将值传递给“field1”文本框的内联javascript,更改为:

<!-- Edited - <a href=\"javascript:;\" onclick=\"$('input[name=field1]').val('".$fetch[0]."');$('#products_modal_box').dialog('close')();\"> /-->
<a href=\"javascript:;\" onclick=\"$('#products_modal_box').data('target').val('".$fetch[0]."');$('#products_modal_box').dialog('close')();\">

该代码用于传递第一个文本框的值。但是,当我尝试添加一个文本框并从模式框中选择一个值时,该值被传递给每个文本框(第一个文本框和第二个文本框),依此类推。如何以不同方式传递每个文本框的值?谢谢。

--- 更新 1 ---

$('#tblDetail tbody').on("click", "a", function() {

    console.log($(this)); // This should be the link you just clicked
    console.log($(this).siblings("input")); // This should be the text box you want to save the value to

    $("#products_modal_box").data("target", $(this).siblings("input"));

    console.log($("#products_modal_box").data("target")); // To confirm it was saved correctly as data

    showProductsModalBox();
    return false;
});

用firebug检查控制台后,结果是:

[a#]
[]
[]

更新 2 - 实际问题

产品 ID 文本框的标记:

<table cellpadding="5px" id="tblDetail" class="tblDetail" width="100%">
  <tr>
    <th colspan="2" width="15%">Product ID</th>
    <th>Problem</th>
  </tr>
  <tr>
    <td><input type="text" name="productid[]" id="productid" size="7"/></td>
    <td><a href="#">Choose</a></td> <!-- THE PROBLEM WAS HERE /-->
    <td><input type="text" name="problem[]" id="problem" /></td>
  </tr>
</table>

<input type="button" id="addRow" value="ADD" />
<input type="button" id="removeRow" value="REMOVE" onclick="removeRowFromTable();"/>

模态框的标记:

<div id="IDBarang_dialog" title="Ambil ID Barang" style="display: none;">
  <div class="in">
    <div class="grid-12-12">
      <form ID="IDBarang_dialog_form" action="#" method="post">
        <table>
          <thead>
            <tr>
              <th>&nbsp;</th>
              <th>Product</th>
            </tr>
          </thead>
          <!-- Query for read mysql goes here (I skipped this line because it's not the main thing I'm gonna ask since it's run well) /-->
          <tbody>
          <?php
            //read the results
            while($fetch = mysqli_fetch_array($r)) {                
              print "<tr>";
              print "  <td><a href='#' onclick=\"$('#IDBarang_dialog').data('target').val('".$fetch[0]."');$('#IDBarang_dialog').dialog('close')();\">Choose</a></td>"; 
              print "  <td>" . $fetch[0] . "</td>"; //$fetch[0] == Product ID
              print "</tr>";
            }
          ?>
          </tbody>
        </table>
      </form>
    </div>
  </div>
</div>

Javascript:

<script>
  var grid_modal_options = {
    height: 'auto',
    width: '80%',
    modal: true
  };

  function showIDBarangModalPopup() {
    $("#IDBarang_dialog").dialog(grid_modal_options);
    $("#IDBarang_dialog").parent().appendTo('form:first');
  }
</script>  

<script type="text/javascript">
    //MODAL-BOX
    $('#tblDetail tbody').on("click", "a", function() {
      console.log($(this)); 
      console.log($(this).siblings("input")); 
      $("#IDBarang_dialog").data("target", $(this).siblings("input"));

      console.log($("#IDBarang_dialog").data("target")); 

      showIDBarangModalPopup();
      return false;
    });

    //ADD ROW
    $(document).ready(function() {
      $("#addRow").click(function() {
        $('#tblDetail tbody>tr:last').clone(true).insertAfter('#tblDetail tbody>tr:last');

        $('#tblDetail tbody>tr:last #productid').val('');
        $('#tblDetail tbody>tr:last #problem').val(''); 

        return false;
      });
    }); 

    //REMOVE ROW
    function removeRowFromTable() {
      var tbl = document.getElementById('tblDetail');
      var lastRow = tbl.rows.length;
      if (lastRow > 2) tbl.deleteRow(lastRow - 1);
    }

4

1 回答 1

2

要使此工作流程正常工作,您需要做两件事:

  1. 打开模态框时,将选择的目标保存在某处;
  2. 关闭模式框时,将所选值设置为该目标。

对于 (1),我建议首先取出showProductsModalBox()属性onclick(您无权访问当前元素的位置)并将其移动到 jQuery 处理程序(您可以访问的位置)。

<a href="#"> <!-- Removed: onclick="showProductsModalBox(); return false;" -->
  Choose
</a>

我正在使用$.on,因此处理程序将适用于当前和未来的行:

$('#tblDetail tbody').on("click", "a", function() {
    $("#products_modal_box").data("target", $(this).siblings("input"));
    showProductsModalBox();
    return false;
});

我建议将目标保存为data您的值,#products_modal_box以便您可以全局访问它。目标是您单击的链接的input元素(也可以)。siblingthisprev

现在对于 (2),您只需要检索目标并将选择的值设置为它:

<a href=\"javascript:;\" onclick=\"$('#products_modal_box').data('target').val('".$fetch[0]."');$('#products_modal_box').dialog('close')();\">

就是这样!作为旁注,恕我直言,您应该避免使用 PHP 生成 JavaScript(或为此使用内联 JS),它作为一种快速的“hack”很好,但它并非没有缺点。请参阅链接问题中qeremy 的答案,以了解完成同一件事的另一种方法。随着项目的进展,如果您没有清楚地将数据与代码分开,可能会出现越来越多的复杂情况。


更新:我很确定上面的代码是正确的。如果它不适合您,那么您的标记不应该像您描述的那样。在 jsFiddle检查这个工作示例。打印到控制台的值是预期值。

Reiterating, calling siblings on you link will return elements under the same parent of it. If the structure is different, you should use other means to navigate to the right element. Like parent (one step up), children (one step down), closest (many steps up) or find (many steps down). If you need further help, please update the question with the actual markup you're using.

于 2012-08-26T16:07:31.130 回答