Thay đổi kích thước jqGrid khi trình duyệt được thay đổi kích thước?


81

Có cách nào để thay đổi kích thước jqGrid khi cửa sổ trình duyệt được thay đổi kích thước không? Tôi đã thử phương pháp được mô tả ở đây nhưng kỹ thuật đó không hoạt động trong IE7.

Câu trả lời:


69

Đã sử dụng tính năng này trong sản xuất được một thời gian mà không có bất kỳ phàn nàn nào (Có thể thực hiện một số điều chỉnh để giao diện phù hợp trên trang web của bạn .. ví dụ: trừ chiều rộng của thanh bên, v.v.)

$(window).bind('resize', function() {
    $("#jqgrid").setGridWidth($(window).width());
}).trigger('resize');

Cũng rất hữu ích trong trường hợp này: Tham số thứ hai cho setGridWidth là 'thu nhỏ'. stackoverflow.com/questions/7745009/…
Jim

Stephen, bạn có thấy giải pháp của jmav không? Đây có vẻ là cách tốt nhất nhưng tôi muốn xem bạn đối chiếu nó với cách tiếp cận này như thế nào
IcedDante

53

Như một sự theo dõi:

Mã trước đó được hiển thị trong bài đăng này cuối cùng đã bị bỏ qua vì nó không đáng tin cậy. Bây giờ tôi đang sử dụng hàm API sau để thay đổi kích thước lưới, theo đề xuất của tài liệu jqGrid:

jQuery("#targetGrid").setGridWidth(width);

Để thực hiện thay đổi kích thước thực tế, một hàm thực hiện logic sau được liên kết với sự kiện thay đổi kích thước của cửa sổ:

  • Tính chiều rộng của lưới bằng cách sử dụng clientWidth của cha mẹ của nó và (nếu không có) thuộc tính offsetWidth của nó.

  • Thực hiện kiểm tra độ tỉnh táo để đảm bảo chiều rộng đã thay đổi nhiều hơn x pixel (để khắc phục một số vấn đề dành riêng cho ứng dụng)

  • Cuối cùng, sử dụng setGridWidth () để thay đổi chiều rộng của lưới

Đây là mã ví dụ để xử lý việc thay đổi kích thước:

jQuery(window).bind('resize', function() {

    // Get width of parent container
    var width = jQuery(targetContainer).attr('clientWidth');
    if (width == null || width < 1){
        // For IE, revert to offsetWidth if necessary
        width = jQuery(targetContainer).attr('offsetWidth');
    }
    width = width - 2; // Fudge factor to prevent horizontal scrollbars
    if (width > 0 &&
        // Only resize if new width exceeds a minimal threshold
        // Fixes IE issue with in-place resizing when mousing-over frame bars
        Math.abs(width - jQuery(targetGrid).width()) > 5)
    {
        jQuery(targetGrid).setGridWidth(width);
    }

}).trigger('resize');

Và ví dụ đánh dấu:

<div id="grid_container">
    <table id="grid"></table>
    <div id="grid_pgr"></div>
</div>

2
Nếu bạn cần hỗ trợ IE, bạn có thể muốn điều chỉnh tần suất thay đổi kích thước thông qua bộ hẹn giờ.
fforw

Chăm sóc công phu? Tôi đã gặp sự cố trên IE khi sự kiện thay đổi kích thước được gọi mà không có chiều rộng thay đổi lưới, dẫn đến hành vi lạ trên chính lưới. Đó là lý do tại sao mã sẽ đưa vào tài khoản một ngưỡng ở bước 2.
Justin Ethier

Điều gì xảy ra nếu tôi muốn thay đổi css cho dạng thêm / sửa của jqgrid?
Bhavik Ambani

36

Tự động thay đổi kích thước:

Đối với jQgrid 3.5+

        if (grid = $('.ui-jqgrid-btable:visible')) {
            grid.each(function(index) {
                gridId = $(this).attr('id');
                gridParentWidth = $('#gbox_' + gridId).parent().width();
                $('#' + gridId).setGridWidth(gridParentWidth);
            });
        }

Đối với jQgrid 3.4.x:

       if (typeof $('table.scroll').setGridWidth == 'function') {
            $('table.scroll').setGridWidth(100, true); //reset when grid is wider than container (div)
            if (gridObj) {

            } else {
                $('#contentBox_content .grid_bdiv:reallyvisible').each(function(index) {
                    grid = $(this).children('table.scroll');
                    gridParentWidth = $(this).parent().width() – origami.grid.gridFromRight;
                    grid.setGridWidth(gridParentWidth, true);
                });
            }
        }

Vâng, tôi có thể xác nhận rằng phiên bản 3.5+ ở trên hoạt động tốt với jqGrid 4.4.1 trên IE9, nhưng với FireFox 16 an 17, bảng tiếp tục rộng hơn một chút mỗi khi tôi điều chỉnh chiều rộng trình duyệt.
MattSlay

Có thể bạn gặp vấn đề với đường viền, được định nghĩa trong css - tôi đã làm.
jmav 27/12/12

Có thể bạn sẽ muốn chuyển true làm tham số thứ hai trong lệnh gọi setGridWidth () của mình trong các phiên bản jqGrid gần đây. Nếu bạn không, các cột trong bảng của bạn không được thay đổi kích thước khi bảng thay đổi kích thước. tức là$(this).setGridWidth(gridParentWidth, true);
Josh Schumacher

8

điều này dường như đang hoạt động tốt đối với tôi

$(window).bind('resize', function() {
    jQuery("#grid").setGridWidth($('#parentDiv').width()-30, true);
}).trigger('resize');

Cảm ơn giải pháp, nhưng nó không hoạt động bình thường, giống như nó thay đổi toàn bộ div, nhưng không áp dụng cho tiêu đề. :(
Vikas Gupta

Tại sao lại có -30 trong ví dụ của bạn?
Vasil Popov

tôi không chắc. Đó là 5 năm trước :(
Darren Cato

7

Tôi đang sử dụng 960.gs cho bố cục nên giải pháp của tôi như sau:

    $(window).bind(
        'resize',
        function() {
                    //  Grid ids we are using
            $("#demogr, #allergygr, #problemsgr, #diagnosesgr, #medicalhisgr").setGridWidth(
                    $(".grid_5").width());
            $("#clinteamgr, #procedgr").setGridWidth(
                    $(".grid_10").width());
        }).trigger('resize');
// Here we set a global options

jQuery.extend(jQuery.jgrid.defaults, {
    // altRows:true,
    autowidth : true,
    beforeSelectRow : function(rowid, e) { // disable row highlighting onclick
        return false;
    },
    datatype : "jsonstring",
    datastr : grdata,  //  JSON object generated by another function
    gridview : false,
    height : '100%',
    hoverrows : false,
    loadonce : true,
    sortable : false,
    jsonReader : {
        repeatitems : false
    }
});

// Demographics Grid

$("#demogr").jqGrid( {
    caption : "Demographics",
    colNames : [ 'Info', 'Data' ],
    colModel : [ {
        name : 'Info',
        width : "30%",
        sortable : false,
        jsonmap : 'ITEM'
    }, {
        name : 'Description',
        width : "70%",
        sortable : false,
        jsonmap : 'DESCRIPTION'
    } ],
    jsonReader : {
        root : "DEMOGRAPHICS",
        id : "DEMOID"
    }
});

// Các lưới khác được xác định bên dưới ...


5

Nếu bạn:

  • shrinkToFit: false(nghĩa là cột có chiều rộng cố định)
  • autowidth: true
  • không quan tâm đến chiều cao chất lỏng
  • có thanh cuộn ngang

Bạn có thể tạo lưới với chiều rộng linh hoạt với các kiểu sau:

.ui-jqgrid {
  max-width: 100% !important;
  width: auto !important;
}

.ui-jqgrid-view,
.ui-jqgrid-hdiv,
.ui-jqgrid-bdiv {
   width: auto !important;
}

Đây là một bản demo


4

Mượn từ mã tại liên kết của bạn, bạn có thể thử một cái gì đó như sau:

$(window).bind('resize', function() { 
    // resize the datagrid to fit the page properly:
    $('div.subject').children('div').each(function() {
        $(this).width('auto');
        $(this).find('table').width('100%');
    });
});

Bằng cách này, bạn đang liên kết trực tiếp với sự kiện window.onresize, sự kiện này thực sự giống như những gì bạn muốn từ câu hỏi của mình.

Nếu lưới của bạn được đặt thành 100% chiều rộng, mặc dù lưới sẽ tự động mở rộng khi vùng chứa của nó mở rộng, trừ khi có một số phức tạp đối với plugin bạn đang sử dụng mà tôi không biết.


Cảm ơn vì tiền hỗ trợ! Hóa ra là tôi đang gọi mã thay đổi kích thước từ sự kiện GridComplete - vì bất kỳ lý do gì mà mã này không hoạt động trong IE. Dù sao, tôi đã trích xuất mã thay đổi kích thước thành một hàm riêng biệt và gọi nó cả trong hàm thay đổi kích thước và sau khi lưới được tạo. Cảm ơn một lần nữa!
Justin Ethier

Tôi tin rằng điều này không hoạt động khi thay đổi kích thước cửa sổ trong IE 8. Nó thực hiện khi bạn làm mới trang.
SoftwareSavant

3

Câu trả lời chính phù hợp với tôi nhưng làm cho ứng dụng không phản hồi trong IE, vì vậy tôi đã sử dụng bộ hẹn giờ theo đề xuất. Mã trông giống như sau ( $(#contentColumn)là div mà JQGrid nằm trong đó):

  function resizeGrids() {
    var reportObjectsGrid = $("#ReportObjectsGrid");
    reportObjectsGrid.setGridWidth($("#contentColumn").width());
};

var resizeTimer;

$(window).bind('resize', function () {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(resizeGrids, 60);
});

Có vẻ như sẽ rất khó để làm cho bộ đếm thời gian hoạt động bình thường. Bạn có thể vui lòng xem câu trả lời cập nhật của tôi và xem liệu bạn có còn cần bộ đếm thời gian không?
Justin Ethier

1
Chỉ cần so sánh cả 3 trong số họ. Yours chắc chắn là một cải tiến so với giải pháp Stephens nhưng việc thay đổi kích thước của cửa sổ vẫn còn khá giật. Với bộ hẹn giờ, việc thay đổi kích thước diễn ra suôn sẻ cho đến khi sự kiện kích hoạt, vì vậy cần phải loay hoay một chút để có đúng thời lượng kích hoạt thời gian. Bộ đếm thời gian hơi vụng về, nhưng tôi nghĩ rằng nó cho kết quả tốt nhất cuối cùng.
woggles

chỉnh sửa: Stephens sln hoạt động tốt trên một trang khác của tôi ... trang này chỉ bắt đầu gặp khó khăn khi tôi đã thêm một loạt các điều khiển jQueryUI khác vào nó.
woggles

Đây là một câu hỏi rất ngu ngốc. Nhưng tôi là một NOOB hoàn chỉnh tại Jquery, vì vậy xin rất nhiều thứ lỗi, nhưng chúng ta đang đặt tất cả các chức năng này ở đâu? ? Bên trong JQuery (document) .ready (function () {} hoặc chúng ta gắn bó nó ra Chỉ cần tự hỏi, cũng có, đâu là $ (window) và chiều rộng đến từ đâu?
SoftwareSavant

@DmainEvent, tôi đặt $ (window) .bind trong $ (Document) .ready, và hàm reszieTimer var và resizeGrids bên ngoài $ (Document) .ready. $ (window) là yếu tố cửa sổ được xây dựng vào jquery và .width () là một hàm jquery cho phép tính chiều rộng của một phần tử
woggles

3

Xin chào những người đam mê tràn Stack. Tôi thích hầu hết các câu trả lời, và tôi thậm chí đã bầu chọn một vài câu trả lời, nhưng không có câu trả lời nào phù hợp với tôi trên IE 8 vì một số lý do kỳ lạ ... Tuy nhiên, tôi đã gặp phải những liên kết này ... Anh chàng này đã viết một thư viện công việc. Đưa nó vào các dự án của bạn trong quảng cáo giao diện người dùng jquery, đưa vào tên bảng của bạn và div.

http://stevenharman.net/blog/archive/2009/08/21/creating-a-fluid-jquery-jqgrid.aspx

http://code.google.com/p/codeincubator/source/browse/#svn%2FSamples%2Fsteveharman%2FjQuery%2Fjquery.jqgrid.fluid%253Fstate%253Dclosed


Tôi cũng nhận được một số hành vi kỳ lạ trong IE8 có và không có cái nhìn tương thích: / lưới của tôi là thay đổi kích thước bằng nửa kích thước nó nên ... thanks for the link
woggles

1
autowidth: true

đã làm việc hoàn hảo cho tôi. học được từ đây .


2
autowidthhoạt động tốt khi lưới được tải lần đầu tiên, nhưng sẽ không thay đổi kích thước lưới khi trình duyệt được thay đổi kích thước. Bạn đã giải quyết vấn đề đó như thế nào, hay đó không phải là yêu cầu đối với bạn?
Justin Ethier

@Justin Ethier: bạn nói đúng. Tôi muốn nó đặt khi lưới được tải lần đầu tiên, không phải khi trình duyệt được thay đổi kích thước. Xin lỗi tôi đã đọc nhầm câu hỏi. Tôi hiểu xuống bỏ phiếu.
understack

1

Những công việc này..

var $targetGrid = $("#myGridId");
$(window).resize(function () {
    var jqGridWrapperId = "#gbox_" + $targetGrid.attr('id') //here be dragons, this is     generated by jqGrid.
    $targetGrid.setGridWidth($(jqGridWrapperId).parent().width()); //perhaps add padding calculation here?
});

0
<script>
$(document).ready(function(){    
$(window).on('resize', function() {
    jQuery("#grid").setGridWidth($('#fill').width(), false); 
    jQuery("#grid").setGridHeight($('#fill').height(),true); 
}).trigger('resize');      
});
</script>
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.