Codeigniter填充下拉性能

时间:2014-04-08 14:11:26

标签: php codeigniter

我有一个函数,我在其中填充了一个包含大约10万个项目的下拉列表。

显然这会导致我的网页在渲染时暂停一段时间。

public function GetOrderDropDown($id){
    $CI =& get_instance();
    $CI->load->database();
    $qry = $CI->db->query("Select orderID, CONCAT('Order ID: ', orderID) As OrderName From vwSelectOrders Order By orderStarted Desc", FALSE);                    
    $res = $qry->result_array();
    if($res){
        $rCt = count($res);
        echo '<option value="0">- Please select an order -</option>';
        for($i = 0; $i < $rCt; ++$i){
            $sel = ($id == $res[$i]['orderID']) ? ' selected="selected"': null;
            echo '<option value="' . $res[$i]['orderID'] . '"' . $sel . '>' . $res[$i]['OrderName'] . '</option>';
            if($i % 50 === 0){
                ob_flush();
                flush();
            }
        }   
    }
}

在SQL MS中应用时,查询本身运行得非常快,实际上当我print_r返回的数组时,它仍然非常快。所以我认为通过在每50次迭代中添加一个响应的刷新就可以做到这一点......它看起来似乎挂得更少,但是......我想知道它是否会更好。

在ajaxed加载页面中调用此特定函数,该页面在页面加载时显示加载图形...也许我可以强制它等待页面完全准备好显示?

// Load in a page
function LoadPage($url, $where){
    var $loading = '<div class="pageLoader">Loading...<br /><img src="/assets/images/ajax-loader.gif" alt="loading..." height="11" width="16" /></div>';
    var $container = jQuery((typeof($where) !== 'undefined') ? $where : '#content-container');
    var $t = Math.round(new Date().getTime() / 1000);
    var options = {
            url: $url + '?_=' + $t,
            cache: false,
            type: 'POST',
            beforeSend: function(){
                    $container.slideUp('slow', function(){
                        $container.slideDown('fast').html($loading);    
                    });
                },
            success: function(data, status, jqXhr){
                $container.slideUp('fast', function(){
                    $container.slideDown('fast').html(data);    
                });
            },
            complete: function(jqXhr, status){},
            error: function(jqXhr, status, error){
                $container.slideUp('fast', function(){
                    $container.slideDown('fast').html('<div class="alert alert-danger alert-dismissable"><button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button><i class="fa fa-exclamation-triangle fa-4x pull-left"></i><p><strong>Danger Will Robinson!</strong><br />There was an issue pulling in this page. Our support team has been notified, please check back later.</p></div>');    
                });
            }
        };
    jQuery.ajax(options);
}

我还能做些什么,Firefox在加载时实际上变得没有响应......?

1 个答案:

答案 0 :(得分:3)

实际上,您不应该将<select>用于100k项目。这不是用户友好的。尝试搜索自动完成解决方案。

关于您的问题:不,您不能在不重载浏览器的情况下添加具有100k子节点的元素。