브라우저 크기를 조정할 때 jqGrid 크기를 조정합니까?


답변:


69

지금은 불만없이 프로덕션에서이 기능을 사용하고 있습니다 (예 : 사이드 바의 너비 빼기 등).

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

이 상황에서도 매우 유용합니다. setGridWidth의 두 번째 매개 변수는 'shrink'입니다. stackoverflow.com/questions/7745009/…
Jim

Stephen, jmav의 해결책을 보았습니까? 이것은 최선의 일처럼 보인다하지만 난 당신이이 방법으로 대조하는 방법을보고 싶어
IcedDante

53

후속 조치 :

이 게시물에 표시된 이전 코드는 신뢰할 수 없기 때문에 결국 포기되었습니다. 이제 jqGrid 설명서에서 권장하는대로 다음 API 함수를 사용하여 그리드 크기를 조정하고 있습니다.

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

실제 크기 조정을 수행하기 위해 다음 논리를 구현하는 함수가 창의 크기 조정 이벤트에 바인딩됩니다.

  • 부모의 clientWidth 및 해당 offsetWidth 속성 (사용할 수없는 경우)을 사용하여 그리드의 너비를 계산합니다.

  • 온 전성 검사를 수행하여 너비가 x 픽셀 이상 변경되었는지 확인합니다 (일부 응용 프로그램 관련 문제를 해결하기 위해).

  • 마지막으로 setGridWidth ()를 사용하여 그리드의 너비를 변경합니다.

다음은 크기 조정을 처리하는 예제 코드입니다.

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');

그리고 마크 업 예 :

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

2
IE를 지원해야하는 경우 타이머를 통해 크기 조정 빈도를 조절할 수 있습니다.
fforw

자세히 설명 하시겠습니까? 그리드 폭을 변경하지 않고 resize 이벤트가 호출되었을 때 IE에서 문제가 발생하여 그리드 자체에서 이상한 동작이 발생했습니다. 코드가 2 단계에서 고려 임계 값을 취 이유입니다
저스틴 이디어

jqgrid의 추가 / 편집 양식에 대한 CSS를 변경하려면 어떻게해야합니까?
Bhavik Ambani

36

자동 크기 조정 :

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);
            });
        }

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);
                });
            }
        }

위의 3.5+ 버전이 IE9의 jqGrid 4.4.1에서 잘 작동한다는 것을 확인할 수 있지만 FireFox 16 및 17에서는 브라우저 너비를 조정할 때마다 테이블이 계속 약간 더 넓어집니다.
MattSlay

CSS에 정의 된 테두리에 문제가있을 수 있습니다.
jmav

최신 버전의 jqGrid에서 setGridWidth () 호출에서 두 번째 매개 변수로 true를 전달하고 싶을 것입니다. 그렇지 않으면 테이블의 크기가 조정될 때 테이블의 열 크기가 조정되지 않습니다. 즉$(this).setGridWidth(gridParentWidth, true);
Josh Schumacher

8

이것은 나를 위해 잘 작동하는 것 같습니다

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

해결책을 주셔서 감사하지만 전체 div가 변경되는 것처럼 제대로 작동하지 않았지만 헤더에는 적용하지 않습니다. :(
Vikas Gupta

귀하의 예에 -30이있는 이유는 무엇입니까?
Vasil Popov 2015 년

잘 모르겠습니다. 그것은 5 년 전이었다 :(
Darren Cato

7

레이아웃에 960.gs를 사용하고 있으므로 솔루션은 다음과 같습니다.

    $(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"
    }
});

// 아래에 정의 된 기타 그리드 ...


5

만약 너라면:

  • 있다 shrinkToFit: false (열 고정 폭을 의미)
  • 있다 autowidth: true
  • 유체 높이는 신경 쓰지 마세요
  • 수평 스크롤바 있음

다음 스타일을 사용하여 유동 폭으로 그리드를 만들 수 있습니다.

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

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

다음은 데모입니다.


4

링크의 코드에서 빌리면 다음과 같이 시도 할 수 있습니다.

$(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%');
    });
});

이런 식으로 실제로 질문에서 원하는 것처럼 보이는 window.onresize 이벤트에 직접 바인딩합니다.

그리드가 100 % 너비로 설정된 경우 컨테이너가 확장 될 때 자동으로 확장되어야하지만 사용중인 플러그인에 대해 제가 알지 못하는 복잡한 부분이없는 한.


팁 고마워! 어떤 이유로 든 IE에서 작동하지 않는 GridComplete 이벤트에서 크기 조정 코드를 호출 한 것으로 나타났습니다. 어쨌든 크기 조정 코드를 별도의 함수로 추출하고 크기 조정 기능과 그리드가 생성 된 후에 호출했습니다. 다시 한 번 감사드립니다!
Justin Ethier

IE 8에서 창 크기를 조정할 때 작동하지 않습니다. 그래도 페이지를 새로 고칠 때 수행됩니다.
SoftwareSavant

3

주요 답변은 저에게 효과적 이었지만 IE에서 앱이 매우 응답하지 않게 만들었으므로 제안 된대로 타이머를 사용했습니다. 코드는 다음과 같습니다 ( $(#contentColumn)JQGrid가있는 div).

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

var resizeTimer;

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

타이머가 제대로 작동하도록하는 것이 까다로울 것 같습니다. 업데이트 된 답변을 살펴보고 여전히 타이머가 필요한지 확인해 주시겠습니까?
Justin Ethier 2011

1
3 개를 모두 비교했습니다. 당신의 것은 확실히 Stephens 솔루션보다 개선되었지만 창의 크기 조정은 여전히 ​​매우 불안정합니다. 타이머를 사용하면 이벤트가 발생할 때까지 크기 조정이 부드럽기 때문에 타이밍 트리거 기간을 올바르게 잡으려면 약간의 조작이 필요합니다. 타이머는 조금 어색하지만 결국 최상의 결과를 제공한다고 생각합니다.
woggles

편집 : Stephens sln은 내 다른 페이지에서 잘 작동합니다 ...이 페이지는 다른 jQueryUI 컨트롤을 여러 개 추가 한 후에야 어려움을 겪기 시작했습니다.
woggles

이것은 매우 멍청한 질문입니다. 그러나 나는 Jquery에서 완전한 NOOB이므로 매우 용서하십시오. 그러나 이러한 모든 기능을 어디에 배치하고 있습니까? Jquery (document) .ready (function () {} 내부 또는 튀어 나와 있습니까? $ (window) 및 너비가 어디에서 오는지 궁금합니다.
SoftwareSavant

@DmainEvent, $ (window) .bind를 $ (Document) .ready에 넣고 reszieTimer var 및 resizeGrids 함수를 $ (Document) .ready 외부에 둡니다. $ (window)는 jquery에 내장 된 창 요소이고 .width ()는 요소의 너비를 계산하는 jquery 함수입니다.
woggles

3

스택 오버플로 애호가 여러분, 안녕하세요. 나는 대부분의 답변을 즐겼고 몇 가지를 찬성했지만 이상한 이유로 IE 8에서 나를 위해 일한 사람은 아무도 없었습니다.하지만이 링크를 만났습니다 ...이 사람은 다음과 같은 라이브러리를 작성했습니다. 작업. jquery UI에 추가하여 프로젝트에 포함하고 테이블 이름과 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


나는 또한 IE8에서 호환성보기를 사용하거나 사용하지 않고 이상한 동작을 얻고 있습니다. / 내 그리드가 크기가 절반으로 조정됩니다. 링크에 감사드립니다
woggles

1
autowidth: true

나를 위해 완벽하게 작동했습니다. 여기 에서 배웠습니다 .


2
autowidth그리드가 처음로드 될 때 제대로 작동하지만 브라우저 크기가 조정될 때 그리드 크기가 조정되지 않습니다. 그 문제를 어떻게 처리 했습니까? 아니면 요구 사항이 아닙니까?
Justin Ethier

@Justin Ethier : 당신 말이 맞아요. 브라우저 크기를 조정할 때가 아니라 그리드가 처음로드 될 때 설정하기를 원했습니다. 질문을 잘못 읽어서 죄송합니다. 나는 반대표를 이해합니다.
understack

1

작동합니다 ..

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.