Я столкнулся с той же проблемой. Очень расстраивает. Я изменил файл jquery.jqGrid.js, чтобы настроить фокусировку на ячейке, по которой щелкнули.
В моей функции editRow я добавил следующий код:
function editRow(id, row, col, z)
{
grid.jqGrid("editRow", id, true, function ()
{
var f = $("input, select", z.target).focus();
return f;
});
}
Это создаст переменную f, которая в конечном итоге будет передана "oneditfunc" в $ .jgrid.extend
Проблема в функции setTimeout.
$("td:eq("+focus+") input",ind).focus();
, поскольку это выполняется с фокусом, установленным на первое редактируемое поле из функции .each выше. Это было бы отличным местом для передачи индекса фокуса, но это невозможно.
// End compatible
return this.each(function ()
{
var $t = this, nm, tmp, editable, cnt = 0, focus = null, svr = {}, ind, cm, bfer;
...
Затем я добавил следующий код. (Строка с >>> неизменна. Она только там, чтобы помочь вам найти точку вставки в коде.)
>>> $($t).triggerHandler("jqGridInlineEditRow", [rowid, o]);
if ($.isFunction(o.oneditfunc))
{
// modified to allow for setting focus on the
// field clicked on
// sets a return value. this was added to the original code. if using
// legacy code, should see no change as r will be undefined
var r = o.oneditfunc.call($t, rowid);
// if get a return value, this indicates you want to set focus
if (r && r[0])
{
var focusIndex = focus;
var i = 0;
// look for the field name that was clicked on
// cm, which is built above, has no index value associated
// with it, so we must keep track of
var focusField = $.grep(cm, function(c)
{
// find the field name which was clicked on
if (c.name == r[0].name)
focusIndex = i;
i++;
return c.name == r[0].name;
});
// if the field is editable, then update focus index
// which is defined above
if (focusField[0].editable)
{
focus = focusIndex;
}
}
}
Самое элегантное решение? Вероятно, нет, но он позволяет всему унаследованному коду работать и выяснять, на каком поле щелкнули, поэтому можно установить фокус