jqGrid: как потерять фокус, когда я нажимаю вне сетки или где-либо еще, если на то пошло

в настоящее время я делаю редактирование с помощью встроенного редактирования, и когда я нажимаю вне сетки, он все еще находится под редактированием. какие обработчики событий я должен использовать, чтобы вызвать функцию restore row, так что единственный способ фактически отправить данные на сервер-это нажать enter.

заранее спасибо

6 ответов


Я точно не знаю, как вы запускаете встроенное издание. Я использую ondblClickRow событие jqGrid, а также искал способ восстановить строку, когда пользователь оставил input или select (редактировать) элемента.

Я считаю громоздким отслеживать последний выбранный элемент и проверять его при каждом щелчке по другим элементам. Итак, я думаю, что более удобный способ-прикрепить restoreRow триггер на blur событие input или select элемент в настоящее время редактируется следующим образом:

ondblClickRow: function(rowid, iRow, iCol, e) {
  grid.jqGrid('editRow', rowid, true);
  $("input, select", e.target).focus().blur(function() {
    grid.jqGrid('restoreRow', rowid);
  });
  return;
}

таким образом, строка восстанавливается всякий раз, когда пользователь покидает поле edition, не нажимая enter.

этот подход отлично работает для меня, надеюсь, что он поможет кому-то еще.


в любом случае, я уже понял, как это сделать. Просто подумал, что было бы неплохо оставить его где-нибудь в интернете, так как я потратил довольно много времени, выясняя, как это сделать. Надеюсь, это поможет =)

$(document).click(function(e){
    if(e.target.id != lastSelectRoot+"_FieldName"){
        jQuery('#grid').jqGrid('restoreRow',lastSelectRoot);
        lastSelectRoot = null;
    }
});

просто добавьте этот фрагмент кода где-нибудь и измените соответствующие части, такие как FieldName и lastSelectRoot и #grid, на то, что вы уже используете.


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

$(document).click(function(e) {
    e.preventDefault();
    //gets the element where the click event happened
    var clickedElement = e.target;      
    //if the click event happened outside the grid 
    if($("#myGridId").has(clickedElement).size() < 1){
        //unselect the grid row
        $("#myGridId").jqGrid("editCell", 0, 0, false);
    }
});

Это решение работает для меня и выглядит проще, чем другие варианты. Является общим и не нуждается в какой-либо глобальной переменной.

$(document).on('focusout', '[role="gridcell"] *', function() {
    $("#mygrid").jqGrid('editCell', 0, 0, false);
});

решения на основе $(document).on ('click') имеют потенциальный недостаток. Некоторые компоненты, такие как select2, не распространяют событие click в документ, поэтому оно завершится неудачей, если вы его на своей странице и щелкнули (это был мой случай).


даже я столкнулся с той же проблемой при работе со встроенным редактированием.Я пошел на обходной путь.Я до сих пор не знаю, является ли это правильным решением.

когда я редактировал строку, я использовал какую-то вещь такого рода

var lastSel;

// In grid I am using some thing like this for editing
    ondblClickRow: function(rowId, iRow, iCol, e){
//initially I am saving my prev row selected for editing and then editing the selected row.

        if(rowId && rowId!==lastSel){ //lastSel is a global variable
            jQuery(this).saveRow(lastSel); 
            lastSel=rowId; 
         }        
        $(this).jqGrid('resetSelection');   
        $(this).jqGrid('editRow', rowId, true, null, null, 'clientArray');


    }

когда я хотел отправить данные на сервер для обновления, я использую следующий оператор в моей первой строке и отправляю, а затем отправляю данные на сервер.

$(gridId).saveRow(lastSel);//where lastSel is the global variable I have selected.

надеюсь, это даст вам представление о том, как решить вашу проблема. Кстати, я сделал только одну строку для редактирования в любой момент времени.


Я попробовал несколько разных вариантов. На основе Маурисио рейса код я написал свой собственный.

var lastSel = -1;

$("#mygrid").jqGrid({
    ...
    beforeSelectRow: function(rowid) {
        if (rowid !== lastSel) {
            lastSel = rowid;
            $("#mygrid").jqGrid('restoreRow',lastSel); // cancel edit
        }
        return true;
    },
    onCellSelect: function(rowId,iCol,cellcontent,e) {
        if(iCol == 1 || iCol == 2) // editable columns
            sgrid.jqGrid('editRow', rowId, true);
    },
    ...
});
...
$(document).click(function(e) {
    if(sgrid.has(e.target).size() < 1)
        $("#mygrid").jqGrid('restoreRow',lastSel); // cancel edit
});

Если вы хотите сохранить строку вместо отмены редактирования просто поставить

$("#mygrid").jqGrid('saveRow', lastSel); // save row

вместо

$("#mygrid").jqGrid('restoreRow',lastSel); // cancel edit