2009-05-17 7 views

ответ

53

В последующих:

предыдущий код, показанный на этом посту был в конечном итоге отказались, потому что она была ненадежной. Я теперь с помощью следующей функции API, чтобы изменить размер сетки, как это рекомендовано в документации jqGrid:

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

Чтобы сделать фактическое изменение размера, функция реализации следующей логики связано с событием изменения размера окна:

  • Рассчитайте ширину сетки с помощью clientWidth своего родителя и (если это невозможно) ее атрибут offsetWidth.

  • Выполните проверку вменяемости, чтобы убедиться, что ширина изменилась более чем х пикселей (для работы вокруг некоторых конкретных прикладных задач)

  • Наконец, используйте setGridWidth() для изменения ширины GRID в

Вот пример кода для обработки изменения размера:

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

+0

Ухаживать за разработкой? У меня были проблемы с IE, когда событие изменения размера было вызвано без изменения ширины сетки, что привело к странному поведению в самой сетке. Вот почему код принимает во внимание порог на шаге 2. –

+0

можете ли вы поделиться своим кодом, который вы использовали, пожалуйста? – leora

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% ширину, хотя она должна автоматически расширяться, когда ее контейнер расширяется, если только не используются некоторые тонкости плагина, который вы используете, о котором я не знаю.

+0

Спасибо за отзыв! Оказывается, я вызывал код изменения размера из события GridComplete - по какой-то причине это не работает в IE. Во всяком случае, я извлек код изменения размера в отдельную функцию и вызываю его как в функции изменения размера, так и после создания сетки. Еще раз спасибо! –

+0

Это не работает при изменении размера окна в IE 8. Это происходит, когда вы обновляете страницу. – SoftwareSavant

35

Авторазмер:

Для 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); 
       }); 
      } 
     } 
+1

+1 блестящее решение. – Peymankh

+0

Ну, я могу подтвердить, что версия 3.5+ выше отлично работает с jqGrid 4.4.1 на IE9, но с FireFox 16 и 17, таблица постоянно увеличивается немного каждый раз, когда я настраиваю ширину браузера. – MattSlay

+0

Возможно, у вас проблемы с границами, определенными в css - я сделал. – jmav

65

использовали это в производстве в течение некоторого времени без каких-либо жалоб (Возможно, вы немного подберете, чтобы посмотреть прямо на своем сайте .. например, вычитая ширину боковой панели и т. Д.)

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

Также очень полезно в этой ситуации: Второй параметр setGridWidth - это сокращение. http://stackoverflow.com/questions/7745009/in-jqgrid-is-it-possible-to-resize-columns-to-fit-the-table-width-original-wid – Jim

+0

Стивен, вы видели решение jmav? Это кажется лучшим, но я хотел посмотреть, как вы сравнили его с таким подходом. – IcedDante

8

это, кажется, работает хорошо для меня

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

Спасибо за решение, но оно не работает должным образом, как будто он меняет весь div, но не применяется для заголовка. :( –

+0

Почему есть -30 в вашем примере? –

+0

Я не уверен. Это было 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" 
    } 
}); 

// Другие сетки определены ниже. ..

+1

Прекрасный материал .... –

+0

Спасибо Fergal. –

+0

Отличное решение, спасибо! –

1
autowidth: true 

отлично работал для меня. из here.

+2

'autowidth' отлично работает при первой загрузке сетки, но не будет изменять размер сетки при изменении размера браузера. Как вы справлялись с этой проблемой, или это вам не обязательно? –

+0

@ Justin Ethier: you're Я хотел, чтобы он устанавливал, когда сетка загружается в первый раз, а не когда изменяется размер браузера. Извините, я неправильно понял вопрос. Я понимаю, что проголосовало. – understack

3

Главный ответ сработал для меня, но сделал приложение крайне невосприимчивым к IE, поэтому я использовал таймер, как было предложено. Код выглядит примерно так ($(#contentColumn) является ДИВ, что JQGrid сидит):

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

var resizeTimer; 

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

Кажется, было бы сложно сделать таймер работать правильно. посмотрите мой обновленный ответ и посмотрите, нужен ли вам таймер? –

+1

Просто сравните все 3 из них. безусловно, является улучшением по сравнению с решением Стивенса, но изменение размера окна все еще довольно рывкое. С таймером изменение размера будет плавным до тех пор, пока событие не загорится, поэтому потребуется немного времени, чтобы получить правильную синхронизацию. Таймер немного неуклюжий, но я думаю, что он дает лучшие результаты в конце. – woggles

+0

edit: Stephens sln отлично работает на другой странице моей ... эта страница только начала бороться, как только я добавил к ней несколько других элементов управления jQueryUI. – woggles

3

Привет Stack энтузиастов переполнения. Мне понравилось большинство ответов, и я даже проголосовал за пару, но ни один из них не работал для меня в IE 8 по какой-то странной причине ... Я все же столкнулся с этими ссылками ... Этот парень написал библиотеку, которая, кажется, Работа. Включите его в свои проекты в adittion для 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

+0

Я также получаю странное поведение в IE8 с представлением совместимости и без него:/Моя сетка имеет размер до половины размера, который он должен be ... спасибо за ссылки – woggles

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

Попробуйте это:

width: null 
shrinkToFit: true 
+0

Это только обрабатывает начальную загрузку сетки, а не изменение размера браузера. –

+0

@ Justin Ethier на самом деле справляется с изменением размера совершенно точно – Mindless

+0

Есть ли у вас демо, например jsfiddle, что onstrates он работает? –

3

Если вы:

  • имеет 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; 
} 

Here is a demo

Смежные вопросы