3

我正在寻求建议和可能的示例代码,链接将帮助我改进我的报价单。目前的情况是这样的: -

为项目(来自 mysql 数据库)生成动态(选择组合)行以及用于价格和数量的空输入框。用户根据 no 添加或删除行。如果需要物品并填写价格、数量等,然后将其带到包含所有计算值等的第二张表格中,以便他可以打印相同的表格或通过电子邮件发送。

现在项目数约为 3500,因此当用户到达第 5 或第 6 行时,添加新行开始变得非常缓慢。我需要从数据库中提取 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?Double Ouch。)

认为现在可能是重新考虑实施的时候了。我可能会做一个弹出窗口或其他东西来选择[关闭时]填充表单字段的项目。保持表单只保存值,而不是值+3500(乘以行数)。

(我可以给出的最佳示例是 phpBB,当您在管理控制面板中选择要管理的用户时。他们会弹出整个 [filterable] 数据库,然后将值带回父窗口。我可以看到这也有利于用户在 3500 个条目中找到一个项目,而不是滚动选择组合)

于 2011-06-04T18:05:08.577 回答
0

我不知道在哪里被调用,但我会说这里是你的一些低效率可能出现的地方addRowdeleteRow

 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. 每次添加一行时,您都会在文档中搜索表格,如果您只在一个表格上工作,这会很昂贵;考虑一个全局变量并做类似的事情var table = glob_table || document.getElementById(..);

  2. 即使它是一个属性并且获取起来并不昂贵,但当您可以增加/减少另一个全局变量时,这仍然可能很乏味。

  3. 在将单元格添加到行之前,我不确定在表中添加一行是否合适。我得看看这个更新:我猜是

  4. (与#2 相同)


顺便说一句,您在底部使用 jQuery。就个人而言,我不喜欢使用 jQuery,但如果你要加载它,你已经在减慢页面速度方面造成了大部分损害,所以你不妨使用它。它实际上非常擅长添加/删除元素,所以我建议你阅读一些 jQuery 教程。

此外,如果您的数据库正在增加,那么您只需使用尚未加载的项目来更新它,而不是重新创建选项。因此,您需要在数据库记录上使用时间戳并将该时间戳存储在您的 JavaScript/页面中,以便“刷新”(where update_ts >= $last_update_param

于 2011-06-04T18:40:15.363 回答