3

見積もりフォームを改善するのに役立つアドバイスとおそらくコード例、リンクを探しています。現在のシナリオはそのようなものです:-

価格と数量の空の入力ボックスとともに、項目 (mysql データベースから) の動的 (選択コンボ) 行が生成されます。ユーザーは no に基づいて行を追加または削除します。アイテムが必要な場合は、価格、数量などを入力し、計算されたすべての値などを含む2番目のフォームに移動して、同じものを印刷したり、電子メールで送信したりできます.

現在、アイテム数は約 3500 であるため、ユーザーが 5 番目または 6 番目の行に到達すると、新しい行を追加するのが非常に遅くなり始めます。データベースからmysqlアイテムをプルする必要があります.mysqlアイテムは時々増加し続けるからです.

どんな助けでも大歓迎です。前もって感謝します。

以下は、私が現在使用している動的行の JavaScript コードです:-

<SCRIPT language="javascript">
    function addRow(tableID) {
        var table = document.getElementById(tableID);
        var rowCount = table.rows.length;
        var row = table.insertRow(rowCount);
        var colCount = table.rows[0].cells.length;
        for(var i=0; i<colCount; i++) {
            var newcell = row.insertCell(i);
            newcell.innerHTML = table.rows[0].cells[i].innerHTML;
            //alert(newcell.childNodes);
            switch(newcell.childNodes[0].type) {
                case "text":
                        newcell.childNodes[0].value = "";
                        break;
                case "checkbox":
                        newcell.childNodes[0].checked = false;
                        break;
                case "select-one":
                        newcell.childNodes[0].selectedIndex = 0;
                        break;
            }
        }
    }
    function deleteRow(tableID) {
        try {
        var table = document.getElementById(tableID);
        var rowCount = table.rows.length;
        for(var i=0; i<rowCount; i++) {
            var row = table.rows[i];
            var chkbox = row.cells[0].childNodes[0];
            if(null != chkbox && true == chkbox.checked) {
                if(rowCount <= 1) {
                    alert("Cannot delete all the rows.");
                    break;
                }
                table.deleteRow(i);
                rowCount--;
                i--;
            }
        }
        }catch(e) {
            alert(e);
        }
    }
</SCRIPT>

以下は、選択コンボボックスにmysqlアイテムをプルするために使用しているphpコードです

<?php
                $con = mysql_connect('connection details');
                if (!$con)  {
                die('Could not connect: ' . mysql_error());}
                $db=mysql_select_db('database',$con);
                $extract1=mysql_query("query")
                                    OR die(mysql_error());
                $numrows1=mysql_num_rows($extract1);
                echo "<select name='item[]' title='selectItemName'>";
                echo "
                        <option>Select Item Description</option>
                        ";
                while ($row1=mysql_fetch_assoc($extract1)) 
                {
                    $ic[]=$row1['ItemName'];
                }
                foreach ($ic as $i){
                echo "<option>".$i."</option>";
                }
                echo    "</select>";
                mysql_close($con);
                ?>

私はまた、かなりきれいなjqueryから次の例を試しました。しかし、私は新しく、選択ボックスと一緒に残りのボックスにデータを入力する方法がわかりません。ここにコードがあります

<script type="text/javascript"> 

    $(document).ready(function() {
        $("select[multiple]").asmSelect({
            addItemTarget: 'bottom',
            animate: true,
            highlight: true,
            sortable: true
        });

    }); 

</script> 
4

2 に答える 2

0

〜3500アイテムの選択コンボ?ああ。(行数の N 倍? 二重痛い)

実装を再考する時期かもしれないと考えてください。[閉じたときに]フォームフィールドにデータを入力するアイテムを選択するために、おそらくポップアップウィンドウまたは何かを行うでしょう。value+3500 (行数の倍数) ではなく、値のみを保持するフォームを保持します。

(私が与えることができる最も良い例は phpBB で、管理者コントロール パネルで管理したいユーザーを選択しているときに、[フィルター可能な] データベース全体がポップアップ表示され、値が親ウィンドウに戻されます。これは、ユーザーが 3500 エントリ内でアイテムを見つけるのにも有利であり、選択コンボをスクロールする必要はありません)

于 2011-06-04T18:05:08.577 に答える
0

addRowとがどこで呼び出されているかはわかりませんがdeleteRow、ここで、非効率性の一部が発生する可能性があると言います。

 1.  var table = document.getElementById(tableID);
 2.  var rowCount = table.rows.length;
 3.  var row = table.insertRow(rowCount);
 4.  var colCount = table.rows[0].cells.length;
  1. 行を追加するたびに、テーブルを求めてドキュメントを検索します。1 つのテーブルのみで作業している場合、これはコストがかかります。グローバル変数を考えて、次のようなことをしますvar table = glob_table || document.getElementById(..);

  2. これはプロパティであり、フェッチするのにそれほどコストはかかりませんが、別のグローバル変数をインクリメント/デクリメントできる場合、これはまだ退屈な場合があります。

  3. 行にセルを追加する前に、テーブルに行を追加するのが適切かどうかわかりません。私はこのアップデートを調べなければなりません:それはそうだと思います

  4. (#2と同じ)


ところで、あなたは一番下でjQueryを使用しています。個人的には、jQuery を使用するのは好きではありませんが、jQuery をロードする場合は、ページの速度を低下させるほとんどのダメージを既に受けているため、jQuery を使用することをお勧めします。実際には、要素の追加/削除がかなり得意なので、jQuery のチュートリアルを読むことをお勧めします。

また、データベースが増加している場合は、オプションを再作成する代わりに、まだロードされていない項目のみで更新する必要があります。したがって、データベース レコードでタイムスタンプを使用し、そのタイムスタンプを JavaScript/ページに保存して、「以降の更新」を行う必要があります ( where update_ts >= $last_update_param) 。

于 2011-06-04T18:40:15.363 に答える