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


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

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>

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

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

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


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


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.


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

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


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 .


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

0
<script>
$(document).ready(function(){    
$(window).on('resize', function() {
    jQuery("#grid").setGridWidth($('#fill').width(), false); 
    jQuery("#grid").setGridHeight($('#fill').height(),true); 
}).trigger('resize');      
});
</script>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.