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>

modal-box スクリプトは、このスレッドで参照されます。「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')();\">

そのコードは、最初のテキストボックスの値を渡すために機能します。しかし、テキストボックスを追加してモーダルボックスから値を選択しようとしている間、値は各テキストボックス (最初のテキストボックスと 2 番目のテキストボックス) に渡されます。各テキストボックスの値を異なる方法で渡す方法は? ありがとう。

--- 更新 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();"/>

Modal-box のマークアップ:

<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

このワークフローを機能させるには、次の 2 つのことを行う必要があります。

  1. モーダル ボックスを開くときに、選択対象をどこかに保存します。
  2. モーダル ボックスを閉じるときに、選択した値をそのターゲットに設定します。

(1) については、最初に属性 (現在の要素にアクセスできない場所) をshowProductsModalBox()取り出し、それを jQuery ハンドラー (アクセスできる場所) に移動することをお勧めします。onclick

<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を your の値として保存することをお勧めします。#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 を使用する) ことは避けてください。簡単な「ハック」には適していますが、欠点がないわけではありません。同じことを達成する別の方法については、リンクされた質問の qeremy の回答を参照してください。プロジェクトが進行するにつれて、コードからデータを明確に分離しないと、ますます複雑になる可能性があります。


更新:上記のコードが正しいと確信しています。それがうまくいかない場合、あなたのマークアップはあなたが説明したようなものであってはなりません。jsFiddle でこの作業例を確認してください。コンソールに表示される値は、予想される値です。

繰り返し、リンクを呼び出すとsiblings、同じ親の下にある要素が返されます。構造が異なる場合は、他の手段を使用して正しい要素に移動する必要があります。parent(1 ステップ上)、children(1 ステップ下)、closest(多数ステップ上)、または(多数ステップ下) のようfindに。さらにサポートが必要な場合は、使用している実際のマークアップで質問を更新してください。

于 2012-08-26T16:07:31.130 に答える