0

我尝试创建具有 4000 > 行和 18 列的表。此表显示我网站的已解析页面。我真的需要在一页上显示它,因为:

  1. 我需要在表格中使用过滤器
  2. 我需要在超过 5 列的表格中使用排序

表格中的每个单元格都有一个<a href元素,因为我使用Bootstrap x editable。Bootstrap x editable 允许编辑表格中的每个单元格。是的,我需要编辑表格而不重新加载页面。

我的问题 - 页面加载速度真的很慢。如何优化加载?我的意思是浏览器加载表真的很慢。(火狐Ubuntu)

<link href="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.4.5/bootstrap-editable/css/bootstrap-editable.css" rel="stylesheet"/>
<script src="//cdnjs.cloudflare.com/ajax/libs/x-editable/1.4.5/bootstrap-editable/js/bootstrap-editable.min.js"></script>



<div style="padding-left: 100px; padding-right: 60px">
<?php echo $menu; ?>
<table id="rows" class="table table-bordered table-condensed table-hover">
    <thead>
        <td colspan="18" style="padding: 10px">
            Filter:&nbsp;&nbsp;&nbsp;&nbsp;
            <form method="get" action="">
                <input style="margin-top: 10px;" type="text" id="url" name="url" value="<?php echo $filter; ?>" placeholder="http://yourdomain.com"/>
                <input class="btn" type="submit" name="filter" value="Filter it"/>
            </form>
        </td>
    </thead>
    <thead>
        <tr>
            <th></th>
            <th id="sortme">
                <a href="wordstat/index?field=query&type=up<?php if($filter):?>&url=<?php echo $filter; ?><?php endif; ?>">
                    Query
                    <i class="icon-chevron-up"></i>
                </a>
            </th>
            <th>
                <a href="wordstat/index?field=query&type=up<?php if($filter):?>&url=<?php echo $filter; ?><?php endif; ?>">
                    Snippet
                    <i class="icon-chevron-up"></i>
                </a>
            </th>
            <th>
                <a href="wordstat/index?field=query&type=up<?php if($filter):?>&url=<?php echo $filter; ?><?php endif; ?>">
                    Ancor
                    <i class="icon-chevron-up"></i>
                </a>
            </th>

            <!-- AND MORE THAN 15 ALSO -->

        </tr>
    </thead>
    <?php foreach($wordstat as $stat): ?>
        <tr class="data">
            <td class="editable">
                <a href="#" data-pk="<?php echo $stat['id']; ?>" id="query" class="query">
                    <?php echo $stat['query']; ?>
                </a>
            </td>
            <td class="editable">
                <a href="#" data-pk="<?php echo $stat['id']; ?>" id="snippet">
                    <?php echo $stat['snippet']; ?>
                </a>
            </td>
            <td class="editable">
                <a href="#" data-pk="<?php echo $stat['id']; ?>" id="ancor">
                    <?php echo $stat['ancor']; ?>
                </a>
            </td>

            <!-- AND MORE THAN 15 ALSO -->

        </tr>
    <?php endforeach; ?>
</table>
<script type="text/javascript">
    $(document).ready(function(){

        $('.editable [id]').editable({
            mode: 'inline',
            type: 'text',
            placement: 'top',
            url: 'wordstat/update_cell',
            title: 'Редактирование поля',
            params: {token: get_token()}
        });


        $("#detect_rel").click(function(){
            $('.data').each(function(i, el) {

                var query   = $(el).children('.editable').children('.query').text();
                var page    = $(el).children('.editable').children('.page_prodvigaemaya').text();
                var id      = $(el).children('td').children('a').attr('item_id');

                $.ajax({
                    //async: false,
                    //async blockin browser...
                    url: 'wordstat/ajax?query='+query+'&page='+page+'&id='+id,
                    beforeSend: function(){
                        $(el).css('background','lavender')
                        $(el).children('.editable').children('.relevantnost').html("Ожидает данные. . .")
                    },
                    success: function(data){
                        $(el).css('background','none')
                        $(el).children('.editable').children('.relevantnost').html(data)
                    }
                });

            });
        });
    });
</script>
</div>
4

2 回答 2

1

我会推荐像 Backbone.js 这样的东西作为 UI 的 MVC。它将处理数据并允许您进行排序。

于 2013-07-12T05:10:32.837 回答
1

超过 4000 行的表格不适合用户屏幕,需要滚动才能查看所有数据。因此,在这种情况下,可以使用可滚动分页(如 Facebook 帖子)增量加载数据。但在您的情况下,您不必等待用户执行滚动然后加载数据。相反,您可以触发递归 AJAX GET 调用以获取表行并继续附加到表中。如果您使用异步 AJAX GET,用户将不会被阻止,并且可以在加载下一个数据时继续使用加载的单元格数据。您可以显示一些进度指示器,直到所有数据都加载完毕。

IE 8/9 浏览器有一些限制,如果它有这些行数,它甚至不会呈现表格(IE 呈现的行数也取决于客户端硬件配置。我的观察是使用 2GB RAM 它能够呈现大约 5K行,但之后它会随机破坏表格布局,然后呈现行)

因此,使用 AJAX GET 调用也将解决这些浏览器特定问题。

有很多开源 jquery 插件可供您使用。我喜欢的插件之一是Here。如果您使用 google 进行滚动分页,您将获得有关其他可用插件的信息。

于 2013-07-12T05:11:33.190 回答