Größe von jqGrid ändern, wenn die Größe des Browsers geändert wird?

81

Gibt es eine Möglichkeit, die Größe eines jqGrid zu ändern, wenn die Größe des Browserfensters geändert wird? Ich habe die hier beschriebene Methode ausprobiert , aber diese Technik funktioniert in IE7 nicht.

Justin Ethier
quelle

Antworten:

69

Ich verwende dies seit einiger Zeit ohne Beschwerden in der Produktion (möglicherweise sind einige Anpassungen erforderlich, um auf Ihrer Website richtig auszusehen. Zum Beispiel das Abziehen der Breite einer Seitenleiste usw.)

$(window).bind('resize', function() {
    $("#jqgrid").setGridWidth($(window).width());
}).trigger('resize');
Stephen Fuhry
quelle
Auch in dieser Situation sehr nützlich: Der zweite Parameter für setGridWidth ist 'shrink'. stackoverflow.com/questions/7745009/…
Jim
Stephen, hast du die Lösung von jmav gesehen? Dies scheint die beste zu sein, aber ich wollte sehen, wie Sie es diesem Ansatz gegenübergestellt haben
IcedDante
53

Als Nachfolge:

Der vorherige Code in diesem Beitrag wurde schließlich aufgegeben, weil er unzuverlässig war. Ich verwende jetzt die folgende API-Funktion, um die Größe des Rasters zu ändern, wie in der jqGrid-Dokumentation empfohlen:

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

Um die eigentliche Größenänderung durchzuführen, ist eine Funktion, die die folgende Logik implementiert, an das Größenänderungsereignis des Fensters gebunden:

  • Berechnen Sie die Breite des Rasters mithilfe der clientWidth des übergeordneten Elements und (falls nicht verfügbar) des OffsetWidth-Attributs.

  • Führen Sie eine Überprüfung der Integrität durch, um sicherzustellen, dass sich die Breite um mehr als x Pixel geändert hat (um einige anwendungsspezifische Probleme zu umgehen).

  • Verwenden Sie abschließend setGridWidth (), um die Breite des Rasters zu ändern

Hier ist ein Beispielcode für die Größenänderung:

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

Und Beispiel Markup:

<div id="grid_container">
    <table id="grid"></table>
    <div id="grid_pgr"></div>
</div>
Justin Ethier
quelle
2
Wenn Sie IE unterstützen müssen, möchten Sie möglicherweise die Häufigkeit der Größenänderung über Timer drosseln.
Vor dem
Möchtest du das näher erläutern? Ich hatte Probleme im IE, als das Größenänderungsereignis aufgerufen wurde, ohne dass sich die Breite des Gitters änderte, was zu einem seltsamen Verhalten im Gitter selbst führte. Aus diesem Grund berücksichtigt der Code in Schritt 2 einen Schwellenwert.
Justin Ethier
Was ist, wenn ich das CSS für die Add / Edit-Form von jqgrid ändern möchte?
Bhavik Ambani
36

Automatische Größenänderung:

Für 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);
            });
        }

Für 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);
                });
            }
        }
jmav
quelle
Nun, ich kann bestätigen, dass die obige Version 3.5+ mit jqGrid 4.4.1 unter IE9 hervorragend funktioniert, aber mit FireFox 16 und 17 wird die Tabelle jedes Mal etwas breiter, wenn ich die Browserbreite anpasse.
MattSlay
Vielleicht haben Sie Probleme mit Grenzen, die in CSS definiert sind - ich habe es getan.
jmav
In neueren Versionen von jqGrid möchten Sie wahrscheinlich true als zweiten Parameter in Ihrem Aufruf von setGridWidth () übergeben. Wenn Sie dies nicht tun, wird die Größe der Spalten in Ihrer Tabelle nicht geändert, wenn die Größe der Tabelle geändert wird. dh$(this).setGridWidth(gridParentWidth, true);
Josh Schumacher
8

Das scheint gut für mich zu funktionieren

$(window).bind('resize', function() {
    jQuery("#grid").setGridWidth($('#parentDiv').width()-30, true);
}).trigger('resize');
Darren Cato
quelle
Vielen Dank für die Lösung, aber sie hat nicht richtig funktioniert, da sie den gesamten Div ändert, aber keinen Header beantragt. :(
Vikas Gupta
Warum gibt es in Ihrem Beispiel -30?
Vasil Popov
ich bin mir nicht sicher. Es war vor 5 Jahren :(
Darren Cato
7

Ich verwende 960.gs für das Layout, daher lautet meine Lösung wie folgt:

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

// Andere unten definierte Gitter ...

Sultan Shakir
quelle
5

Wenn du:

  • haben shrinkToFit: false(mittlere Spalten mit fester Breite)
  • haben autowidth: true
  • Kümmere dich nicht um die Flüssigkeitshöhe
  • haben horizontale Bildlaufleiste

Sie können Raster mit flüssiger Breite mit folgenden Stilen erstellen:

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

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

Hier ist eine Demo

Chintsu
quelle
4

Wenn Sie sich den Code unter Ihrem Link ausleihen, können Sie Folgendes ausprobieren:

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

Auf diese Weise binden Sie direkt an das window.onresize-Ereignis, das tatsächlich so aussieht, wie Sie es von Ihrer Frage erwarten.

Wenn Ihr Raster auf 100% Breite eingestellt ist, sollte es sich automatisch erweitern, wenn sich sein Container erweitert, es sei denn, das verwendete Plugin weist einige Komplikationen auf, die ich nicht kenne.

Dave L.
quelle
Danke für den Tipp! Es stellt sich heraus, dass ich den Größenänderungscode vom GridComplete-Ereignis aufgerufen habe - aus irgendeinem Grund funktioniert dies im IE nicht. Wie auch immer, ich habe den Größenänderungscode in eine separate Funktion extrahiert und ihn sowohl in der Größenänderungsfunktion als auch nach dem Erstellen des Rasters aufgerufen. Danke noch einmal!
Justin Ethier
Dies funktioniert meiner Meinung nach nicht, wenn die Größe eines Fensters in IE 8 geändert wird. Dies geschieht jedoch, wenn Sie die Seite aktualisieren.
SoftwareSavant
3

Die Hauptantwort funktionierte für mich, machte die App jedoch im IE extrem unempfindlich, sodass ich wie vorgeschlagen einen Timer verwendete. Code sieht $(#contentColumn)ungefähr so aus ( ist das Div, in dem sich das JQGrid befindet):

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

var resizeTimer;

$(window).bind('resize', function () {
    clearTimeout(resizeTimer);
    resizeTimer = setTimeout(resizeGrids, 60);
});
Woggles
quelle
Es scheint schwierig zu sein, den Timer richtig funktionieren zu lassen. Können Sie sich bitte meine aktualisierte Antwort ansehen und sehen, ob Sie den Timer noch benötigen?
Justin Ethier
1
Ich habe gerade alle drei verglichen. Ihre ist definitiv eine Verbesserung gegenüber Stephens Lösung, aber die Größenänderung des Fensters ist immer noch ziemlich ruckelig. Mit dem Timer ist die Größenänderung reibungslos, bis das Ereignis ausgelöst wird, sodass ein wenig Fummeln erforderlich ist, um die richtige Triggerdauer für das Timing zu erreichen. Der Timer ist etwas ungeschickt, aber ich denke, er liefert am Ende die besten Ergebnisse.
Woggles
edit: Stephens sln funktioniert gut auf einer anderen Seite von mir ... diese Seite begann erst zu kämpfen, als ich eine Reihe anderer jQueryUI-Steuerelemente hinzugefügt hatte.
Woggles
Dies ist eine sehr dumme Frage. Aber ich bin ein absoluter NOOB bei Jquery, also bitte sehr verzeihen, aber wo platzieren wir all diese Funktionen? In der Jquery (Dokument) .ready (function () {} oder strecken wir es aus? Ich frage mich auch, woher $ (Fenster) und Breite kommen?
SoftwareSavant
@DmainEvent, ich habe die $ (window) .bind in $ (Document) .ready eingefügt und die Funktionen reszieTimer var und resizeGrids außerhalb von $ (Document) .ready. $ (Fenster) ist das Fensterelement, das in jquery integriert ist, und .width () ist eine jquery-Funktion, die die Breite eines Elements berechnet
woggles
3

Hallo Stack-Überlauf-Enthusiasten. Ich habe die meisten Antworten genossen und sogar ein paar Stimmen hochgestimmt, aber keiner von ihnen hat aus irgendeinem seltsamen Grund für mich im IE 8 funktioniert ... Ich bin jedoch auf diese Links gestoßen ... Dieser Typ hat eine Bibliothek geschrieben, die zu sein scheint Arbeit. Nehmen Sie es in Ihre Projekte auf, und fügen Sie den Namen Ihrer Tabelle und das div hinzu.

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

SoftwareSavant
quelle
Ich bekomme auch ein seltsames Verhalten in IE8 mit und ohne Kompatibilitätsansicht: / Mein Raster ändert die Größe auf die Hälfte der Größe, die es sein sollte ... danke für die Links
Woggles
1
autowidth: true

hat perfekt für mich funktioniert. von hier gelernt .

Understack
quelle
2
autowidthfunktioniert einwandfrei, wenn das Raster zum ersten Mal geladen wird, ändert jedoch nicht die Größe des Rasters, wenn die Größe des Browsers geändert wird. Wie sind Sie mit diesem Problem umgegangen oder ist das für Sie keine Voraussetzung?
Justin Ethier
@ Justin Ethier: Du hast recht. Ich wollte, dass es festgelegt wird, wenn das Raster zum ersten Mal geladen wird, und nicht, wenn die Größe des Browsers geändert wird. Entschuldigung, ich habe die Frage falsch verstanden. Ich verstehe Abstimmungen.
Understack
1

Das funktioniert..

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?
});
Erik
quelle
0
<script>
$(document).ready(function(){    
$(window).on('resize', function() {
    jQuery("#grid").setGridWidth($('#fill').width(), false); 
    jQuery("#grid").setGridHeight($('#fill').height(),true); 
}).trigger('resize');      
});
</script>
Minimax
quelle