una tablas tabla obtener editar dinamicas datos con attribute agregar javascript jquery internet-explorer google-chrome jqgrid

obtener - tablas dinamicas html javascript



jqGrid Toma mucho tiempo para grandes registros (2)

Estoy usando jgGrid. Funciona perfectamente pero cuando paso unos 90,000 registros y abro la página en google chrome, toma alrededor de 8 segundos crear una cuadrícula que en mi caso debería ser de 3-4 segundos. y, además, cuando ejecuto la misma página en IE, deja de responder.

¿Alguna sugerencia de cómo puedo reducir el tiempo?

mi guion

function GetCommodityGrid(array) { array = array.rows; // assign rows array to array object totalRows = array.length; jQuery(document).ready(function () { jQuery("#list").jqGrid({ datatype: ''local'', data: array, colNames: [''COM_NAME'', ''COM_CODE'', ''DELV_UNITS'', ''LOT_SIZE'', ''TICK_SIZE'', ''TICK_VALUE''], colModel: [ { name: ''COM_NAME'', index: ''COM_NAME'', width: 90, editable: true }, { name: ''COM_CODE'', index: ''COM_CODE'', width: 100, editable: true }, { name: ''DELV_UNITS'', index: ''DELV_UNITS'', width: 80, align: "right", editable: true }, { name: ''LOT_SIZE'', index: ''LOT_SIZE'', width: 80, align: "right", editable: true }, { name: ''TICK_SIZE'', index: ''TICK_SIZE'', width: 80, align: "right", editable: true }, { name: ''TICK_VALUE'', index: ''TICK_VALUE'', width: 150, sortable: false, editable: true } ], rowList: [50,100,200], rownumbers: true, // show the numbers on rows loadonce: true, pager: ''#pager'', sortname: ''COM_NAME'', viewrecords: true, // show the total records on the end of the page editurl: "TestGrid/EditRecord", caption: "JSON Example", //new option gridview: true, autoencode: true, }); $("#list").jqGrid("navGrid", "#pager", { add: false }, { //the Edit options closeAfterEdit: true, afterSubmit: function (response) { // you should return from server OK in sucess, any other message on error alert("after Submit"); if (response.responseText == "OKK") { alert("Update is succefully") return [true, "", ""] } else { alert("Update failed") $("#cData").click(); return [false, "", ""] } } }); }); }


Analicé el proceso de carga de la red local con 90,000 filas sin clasificar y encontré un cuello de botella muy gracioso que uno puede superar fácilmente. En primer lugar, aquí está la demostración que funciona rápidamente y aquí está casi la misma demo que funciona muy lentamente, especialmente en IE.

La mayor parte del tiempo de carga de jqGrid obtiene la línea del código jqGrid directamente en el inicio:

var p = $.extend(true,{ // there are here different default values of jqGrid parameters }, $.jgrid.defaults, pin || {});

Como uno usa true como el primer parámetro, jQuery hace una copia completa de los datos y funciona lentamente (¿por qué? Es otra pregunta pura de jQuery).

Como solución, sugiero que no se establezca ningún parámetro de data durante la creación de la grilla. En el caso, se usarán los data: [] parámetros predeterminados data: [] . En lugar de eso, uno puede establecer data dentro de la devolución de llamada onInitGrid :

$("#list").jqGrid({ //data: gridData, datatype: "local", .... onInitGrid: function () { // get reference to parameters var p = $(this).jqGrid("getGridParam"); // set data parameter p.data = gridData; } });

Como resultado, el rendimiento de la carga de la red será mucho mejor.

Posteriormente publicaré mis sugerencias para ver cómo hacer un pequeño cambio en el código de jqGrid para mejorar el rendimiento de jqGrid en el caso. Lo que sugiero es muy simple. Uno puede guardar data parámetro de data en una variable, luego llamar var p = $.extend(true,{...}); y luego establecer data parámetro de data directamente en p variable

// save local data array in temporary variable and remove from input parameters // to improve performance var localData; if (pin != null && pin.data !== undefined) { localData = pin.data; pin.data = []; } var p = $.extend(true,{ // there are here different default values of jqGrid parameters }, $.jgrid.defaults, pin || {}); if (localData !== undefined) { p.data = localData; }

La demostración usa el código fijo de jqGrid y funciona rápidamente.

ACTUALIZADO : La solicitud de extracción que publiqué en trirand ya está fusionada con el código principal de jqGrid en github (ver más en el informe de errores ). Entonces la próxima versión de jqGrid (versión más alta como 4.6.0) no tendrá el problema descrito.


Intente cargar JqGrid a pedido, es decir, cargue un fragmento de datos más pequeño a la vez en lugar de todos los datos y cargue los datos restantes en la paginación.

Aquí hay un código de muestra para referencia

PHP con MySQL

... $page = $_GET[''page'']; // get the requested page $limit = $_GET[''rows'']; // get how many rows we want to have into the grid $sidx = $_GET[''sidx'']; // get index row - i.e. user click to sort $sord = $_GET[''sord'']; // get the direction if(!$sidx) $sidx =1; // connect to the database $db = mysql_connect($dbhost, $dbuser, $dbpassword) or die("Connection Error: " . mysql_error()); mysql_select_db($database) or die("Error conecting to db."); $result = mysql_query("SELECT COUNT(*) AS count FROM invheader a, clients b WHERE a.client_id=b.client_id"); $row = mysql_fetch_array($result,MYSQL_ASSOC); $count = $row[''count'']; if( $count >0 ) { $total_pages = ceil($count/$limit); } else { $total_pages = 0; } if ($page > $total_pages) $page=$total_pages; $start = $limit*$page - $limit; // do not put $limit*($page - 1) if ($start<0) $start = 0; $SQL = "SELECT a.id, a.invdate, b.name, a.amount,a.tax,a.total,a.note FROM invheader a, clients b WHERE a.client_id=b.client_id ORDER BY $sidx $sord LIMIT $start , $limit"; $result = mysql_query( $SQL ) or die("Couldnt execute query.".mysql_error()); $responce->page = $page; $responce->total = $total_pages; $responce->records = $count; $i=0; while($row = mysql_fetch_array($result,MYSQL_ASSOC)) { $responce->rows[$i]=$responce->rows[$i][''cell'']=array($row[id],$row[invdate],$row[name],$row[amount],$row[tax],$row[total],$row[note]); $i++; } echo $json->encode($responce); // coment if php 5 //echo json_encode($responce); ...