0

わかりました、それは傲慢なタイトルです - それはには複雑です.

概要: (スクリーンショットと下部の更新を参照してください。
) $(document).readyで、jQuery/AJAX は行ごとに 1 つの連絡先を含むテーブルを作成しますb
. 各テーブル行、3 番目のセルは次のとおりです。<a id="edit_83">edit</a>タグ -- 「83」は例であり、db からの contact_id を表します。したがって、各タグには、手順 (d)
c で使用される一意の ID 番号があります。構築中のテーブルとして、AJAX コールバックで連絡先ごとに jqueryui ダイアログ (autoOpen=false) を構築します
。編集アンカーがクリックされると、jquery は contact_id を分割し、それを使用して適切な jQueryUI ダイアログを表示します。

目的:テーブル行の編集リンクをクリックすると、その連絡先の編集フォームを含む jqueryui ダイアログが開きます。

問題:フォームは開きますが、中にフォーム フィールドがありません。実際、DOM では、注入されたフォーム/div が各テーブル行にありません。???


HTML:

<div id="contact_table"></div>

Javascript/jQuery - AJAX 呼び出し:

$(document).ready(function() {
$.ajax({
    type: "POST",
    url: "ax_all_ajax_fns.php",
    data: 'request=index_list_contacts_for_client&user_id=' + user_id,
    success: function(data) {
        $('#contact_table').html(data);
        var tbl = $('#injected_table_of_contacts');
        tbl.find("div").each(function() {
            $(this).dialog({
                autoOpen: false,
                height: 400,
                width: 600,
                modal: true,
                buttons: 
                    {
                        Okay: function() {
                            $( this ).dialog( "close" );
                        },
                        Cancel: function() {
                            $( this ).dialog( "close" );
                        }
                    }
            })
        });
    }
});
});

AJAX/PHP 1 - ax_all_ajax_fns.php:

}else if ($_POST['request'] == 'index_list_contacts_for_client') {
    $user_id = $_POST['user_id'];
    $r = build_contact_table_for_client($user_id);
    echo $r;
}

AJAX/PHP 2: - functions.php

function build_contact_table_for_client($user_id) {
    $aContact_info = get_contact_data_ARRAY_user_id($user_id, 'first_name','last_name','email1','cell_phone', 'contact_id');
    $r = '<table id="injected_table_of_contacts">
            <tr>
                <th width="120">Name</th>
                <th width="200">Email Address</th>
                <th width="100">Cell Phone</th>
                <th>Action</th>
            </tr>
        ';
    while ($rrow = mysql_fetch_array($aContact_info)) {
        $r .= '
            <tr>
                <td>'.$rrow['first_name'].' '.$rrow['last_name'].'</td>
                <td>'.$rrow['email1'].'</td>
                <td>'.$rrow['cell_phone'].'</td>
                <td>
                    <a class="editcontact" id="edit_'.$rrow['contact_id'].'" href="#">edit</a>
                     / 
                    <a class="delcontact" id="del_'.$rrow['contact_id'].'" href="#">del</a>
                    <div id="editThisContact_'.$rrow['contact_id'].'" style="display:none">
                        <form name="editForm" onsubmit="return false;">
                            <p class="instructions">Edit contact information:</p>
                            First Name:<span style="padding:0 20px;">Last Name:</span><br />
                            <input type="hidden" id="fn_'.$rrow['contact_id'].'" value="'.$rrow['first_name'].'">
                            <input type="hidden" id="ln_'.$rrow['contact_id'].'" value="'.$rrow['last_name'].'">
                            Email:<span style="padding:0 20px;">Cell Phone:</span><br />
                            <input type="hidden" id="em_'.$rrow['contact_id'].'" value="'.$rrow['email1'].'">
                            <input type="hidden" id="cp_'.$rrow['contact_id'].'" value="'.$rrow['cell_phone'].'">
                        </form>
                    </div>
                </td>
            </tr>
        ';
    }

    $r .= '</table>';
    return $r;
}

jQuery - document.click イベント - 挿入されたコードが欠落している場合、どうすればセレクターを見つけることができますか??

$(document).on('click', '.editcontact', function(event) {
    var contact_id = this.id.split( 'edit_' )[1];
    var etc = $( '#editThisContact_' + contact_id );
    etc.dialog("open");
});

更新 - 部分的な解決策:

ダイアログが表示されるようになりました -この投稿によると、キャンセル ボタンは適切ではありませんでした。ただし、挿入されたコードは消失しています。他に変更はありません。キャンセル ボタンの配置の構文エラーを修正することで、ダイアログ コードが機能するようになりました。

4

2 に答える 2

2

元の投稿に対する私のコメントに対する質問への回答: JSON はすでにご存知でしょう。JavaScript Object Notation の略です。これは JSON オブジェクトです。

{"a":1,"b":2,"c":3}

見覚えがあります?JSON は、私たちが長い間使用してきたものの単なる派手な名前です (100% 真実ではないかもしれませんが、私はそう見ています)。

アイデアは、サーバーに JSON オブジェクトを返させ、JavaScript がそれらに基づいて HTML を作成/更新するようにすることです。あなたのシナリオでは、PHP に複数の HTML ダイアログを作成させていました。代わりに、次のように、それぞれがテーブルの 1 つの行を表すオブジェクトの配列を PHP に返すようにします。

{
  "records": 
  [
    { 
      "field a":"value a",
      "field b":"value b"
    },
    // record 2
    { 
      "field a":"value a",
      "field b":"value b"
    }
  ]
}

.getJSON() を使用してサーバーから要求した場合、jQuery は自動的にそれを読み取り、オブジェクトの配列である .records プロパティを持つオブジェクトを提供します! 対応するレコードの 1 つをクリックすると、JavaScript を使用して、画面上の単一のダイアログ/フォームを更新できるようになりました。

注: オブジェクトの配列だけを PHP に返すようにすることもできますが、上記のオブジェクトでラップすることをお勧めします。多くの場合、他の情報も必要になります。たとえば、ページ分割された検索結果を実行している場合、レコードの総数、現在のページ、および他のデータ ポイントを知る必要があります。

これの追加の利点は、サーバーがはるかに高速に実行されることです。すべての表示ロジックをクライアントのコンピューターにプッシュするため、同じサーバーからより多くのページをサーバーできます。

それは本当に簡単な説明です。ウェブ全体にチュートリアルと例があります。オンラインで使用する優れた Ajax アプリ (GMail など) は、HTML の巨大なブロックを渡す代わりに JSON オブジェクトを使用します。ここにいくつかのリンクがありますが、Google にはさらに多くのリンクがあります。

このプロセスを支援するための非常に優れたフレームワークもいくつかあります。私はbackbone.jsspin.jsの両方の大ファンです。どちらも jQuery を使用し、アプリを構築する際のベスト プラクティス (MVC など) を使用するのに役立ちます。

于 2012-10-12T00:17:08.377 に答える
0

自分の問題を解決するときはいいですね。答えが ID-ten-T エラーの場合はあまり良くありません。

挿入された HTMLで、入力フィールドのタイプに注意してください(スクリーンショット 1)。type をtype="text"に変更すると、すべてが希望どおりに機能します。

概念が新しいとき、Occam's Razor はほとんど手の届かないところに移動します。

注入されたマークアップが表示されない理由はまだわかりません..!

于 2012-10-11T19:19:23.177 に答える