ブラウザのサイズが変更されたときにjqGridのサイズを変更しますか?


回答:


69

これを本番環境でしばらくの間、文句なしに使用しています(たとえば、サイドバーの幅を差し引くなど、サイトを正しく表示するために微調整が必​​要な場合があります)

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

この状況でも非常に便利です。setGridWidthの2番目のパラメーターは「shrink」です。 stackoverflow.com/questions/7745009/…–
ジム

スティーブン、jmavの解決策を見ましたか?これは最良の方法のようですが、このアプローチとどのように対比されているかを確認したかった
IcedD​​ante 2015年

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 2009年

気になりますか?グリッドの幅を変更せずにサイズ変更イベントを呼び出すと、IEで問題が発生し、グリッド自体で奇妙な動作が発生しました。コードは、ステップ2で考慮にしきい値を取る理由です
ジャスティン・エティエ

jqgridの追加/編集フォームのCSSを変更したい場合はどうなりますか?
Bhavik Ambani 2012

36

自動サイズ変更:

jQgrid3.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のjqGrid4.4.1でうまく機能することを確認できますが、FireFox 16と17では、ブラウザーの幅を調整するたびにテーブルが少し広くなり続けます。
MattSlay 2012

たぶん、cssで定義されている境界線に問題があります-私はそうしました。
jmav 2012

最近のバージョンのjqGridでは、setGridWidth()呼び出しの2番目のパラメーターとして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年前でした:(
ダレンケイトー

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%の幅に設定されている場合、コンテナが拡張すると自動的に拡張するはずですが、使用しているプラ​​グインに複雑な点がない限り、私にはわかりません。


ヒントをありがとう!GridCompleteイベントからサイズ変更コードを呼び出していたことが判明しました-何らかの理由で、これはIEでは機能しません。とにかく、サイズ変更コードを別の関数に抽出し、サイズ変更関数とグリッドの作成後の両方で呼び出しました。再度、感謝します!
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つすべてを比較しただけです。あなたのものは間違いなくスティーブンスのソリューションよりも改善されていますが、ウィンドウのサイズ変更はまだかなりぎくしゃくしています。タイマーを使用すると、イベントが発生するまでサイズ変更がスムーズになるため、タイミングトリガーの期間を正しく取得するには少し手間がかかります。タイマーは少し不器用ですが、最終的には最高の結果が得られると思います。
woggles 2011

編集:Stephens slnは私の別のページで正常に動作します...このページは、他のjQueryUIコントロールをたくさん追加した後で初めて苦労し始めました。
woggles 2011

これは非常にばかげた質問です。しかし、私はJqueryの完全なNOOBなので、非常に寛容にしてください。しかし、これらすべての関数をどこに配置するのでしょうか。Jquery(document).ready(function(){}の内部ですか、それとも突き出ていますか?また、$(window)と幅はどこから来ているのでしょうか?
SoftwareSavant

@DmainEvent、$(window).bindを$(Document).readyに配置し、reszieTimer varおよびresizeGrids関数を$(Document).readyの外に配置します。$(window)はjqueryに組み込まれているウィンドウ要素であり、.width()は要素の幅を計算するjquery関数です
woggles 2011

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で奇妙な動作が発生しています:/グリッドのサイズが
本来の

1
autowidth: true

私のために完璧に働いた。ここから学んだ。


2
autowidthグリッドが最初にロードされたときは正常に機能しますが、ブラウザーのサイズが変更されたときにグリッドのサイズは変更されません。その問題にどのように対処しましたか、それともそれはあなたの要件ではありませんか?
Justin Ethier 2010

@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.