Почему JQuery Modal Dialog и JQGrid Modal Dialog выглядят по-разному? - PullRequest
5 голосов
/ 14 июля 2011

Я создал модальное диалоговое окно JQGrid с Jquery для удаления. Jqgrid со встроенным редактированием и одним полем обязателен, если я оставлю это поле пустым, а пресса отправит всплывающее сообщение. Введите имя, но проблема в том, что всплывающее сообщение встроено, и мой модальный диалог jquery выглядит слишком по-другому.

Встроенный модальный диалог JQGrid:
enter image description here

JQuery Modal Dialog
enter image description here

КОД:

function createGrid() {
        jQuery("#list").jqGrid({
            url: '@Url.Action("JQGridGetGridData", "TabMaster")',
            datatype: 'json',
            mtype: 'GET',
            colNames: ['col ID', 'First Name', 'Last Name', ''],
            colModel: [{ name: 'colID', index: 'colID', width: 100, align: 'left', searchoptions: { sopt: ['eq', 'ne', 'cn']} },
                      { name: 'FirstName', index: 'FirstName', width: 150, align: 'left', editable: true, editrules: { required: true} },
                      { name: 'LastName', index: 'LastName', width: 150, align: 'left', editable: true, editrules: { required: true} },
                      { name: 'act', index: 'act', width: 60, sortable: false}],
            pager: jQuery('#pager'),
            hidegrid: false,
            rowNum: 100,
            rowList: [10, 50, 100, 150],
            sortname: 'colID',
            sortorder: "asc",
            viewrecords: true,
            multiselect: false,
            width: 500,
            height: "250px",
            imgpath: '@Url.Content("~/Scripts/themes/steel/images")',
            caption: 'Tab Master Information',
            editurl: '@Url.Action("JQGridEdit", "TabMaster")',
            gridComplete: function () {
                var ids = jQuery("#list").getDataIDs();
                for (var i = 0; i < ids.length; i++) {
                    var id = ids[i];
                    be = "<a href='#'><div title='Edit' id='action_edit_" + id + "' class='actionEdit' onclick='inlineEdit(" + id + ");'></div></a>";
                    de = "<a href='#'><div title='Delete' id='action_delete_" + id + "' class='actionDelete' onclick='inlineDelete(" + id + ");'></div></a>";
                    se = "<a href='#'><div title='Save' style='display:none' id='action_save_" + id + "' class='actionSave' onclick='inlineSave(" + id + ");'></div></a>";
                    ce = "<a href='#'><div title='Cancel' style='display:none' id='action_cancel_" + id + "' class='actionCancel' onclick='inlineCancel(" + id + ");'></div></a>";
                    jQuery("#list").setRowData(ids[i], { act: be + de + se + ce })
                }
            }
        }).navGrid('#pager', { edit: false, add: false, del: false, search: false, refresh: false });
    }

Как я могу применить Jquery Modal Dialog для встроенной оболочки диалогов JQGrid?

Спасибо, Imdadhusen

Ответы [ 3 ]

2 голосов
/ 15 июля 2011

jqGrid - это плагин jQuery, а не виджет пользовательского интерфейса jQuery.Так что используйте не JQuery UI диалог.Вместо этого он использует $. Jgrid.createModal , $. Jgrid.viewModal и $. Jgrid.hideModal .В некоторых ситуациях используется упрощенная версия $. Jgrid.info_dialog .Многие люди (включая меня) хотят, чтобы jqGrid в одной из следующих версий использовал внутри себя больше элементов управления jQuery UI и, вероятно, будет виджетом jQuery UI, но теперь, если вы хотите создать диалог в стиле jqGrid, вы должны использовать методы, которые яперечисленные выше.

В качестве примера использования функций я предлагаю следующий пример , который создает тот же диалог, что и jqGrid с методом delGridRow .Я включил в демо кнопку навигации «Удалить», чтобы показать, что если вы сначала используете кнопку «Удалить выбранную строку», которая создает диалог, а затем используете кнопку навигации «Удалить», jqGrid не создаст никакого нового диалога.Вместо этого будет использоваться наш пользовательский диалог.

Соответствующий код ниже:

var grid = $("#list"),
    gID = grid[0].id, //grid[0].p.id,
    IDs = {
        themodal:'delmod'+gID,
        modalhead:'delhd'+gID,
        modalcontent:'delcnt'+gID,
        scrollelm:'DelTbl_'+gID
    },
    hideDialog = function() {
        $.jgrid.hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:true, onClose: null});
    },
    rowId,
    createDeleteDialog = function() {
        var dlgContent =
            "<div id='"+IDs.scrollelm+"' class='formdata' style='width: 100%; overflow: auto; position: relative; height: auto;'>"+
                "<table class='DelTable'>"+
                    "<tbody>"+
                        "<tr id='DelError' style='display: none'>"+
                            "<td class='ui-state-error'></td>"+
                        "</tr>"+
                        "<tr id='DelData' style='display: none'>"+
                            "<td>"+rowId+"</td>"+ // it has not so much sense
                        "</tr>"+
                        "<tr>"+
                            "<td class='delmsg' style='white-space: pre;'>"+$.jgrid.del.msg+"</td>"+
                        "</tr>"+
                        "<tr>"+
                            "<td>&#160;</td>"+
                        "</tr>"+
                    "</tbody>"+
                "</table>"+
            "</div>"+
            "<table cellspacing='0' cellpadding='0' border='0' class='EditTable' id='"+IDs.scrollelm+"_2'>"+
                "<tbody>"+
                    "<tr>"+
                        "<td>"+
                            "<hr class='ui-widget-content' style='margin: 1px' />"+
                        "</td>"+
                    "</tr>"+
                    "<tr>"+
                        "<td class='DelButton EditButton'>"+
                            "<a href='javascript:void(0)' id='dData' class='fm-button ui-state-default ui-corner-all'>Delete</a>"+
                            "&#160;<a href='javascript:void(0)' id='eData' class='fm-button ui-state-default ui-corner-all'>Cancel</a>"+
                        "</td>"+
                    "</tr>"+
                "</tbody>"+
            "</table>";

        if ($('#'+IDs.themodal).length===0) {
            // dialog not yet exist. we need create it.
            $.jgrid.createModal(
                IDs,
                dlgContent,
                {
                    gbox: "#gbox_"+gID,
                    caption: $.jgrid.del.caption,
                    jqModal: true,
                    left: 12,
                    top: 44,
                    overlay: 10,
                    width: 240,
                    height: 'auto',
                    zIndex: 950,
                    drag: true,
                    resize: true,
                    closeOnEscape: true,
                    onClose: null
                },
                "#gview_"+gID,
                $("#gview_"+gID)[0]);
            $("#dData","#"+IDs.scrollelm+"_2").click(function(){
                // "Delete" button is clicked
                var rowId = grid.jqGrid('getGridParam', 'selrow');
                grid.jqGrid('delRowData',rowId);
                //$.jgrid.hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:true, onClose: null});
                hideDialog();
            });
            $("#eData", "#"+IDs.scrollelm+"_2").click(function(){
                // "Cancel" button is clicked
                //$.jgrid.hideModal("#"+IDs.themodal,{gb:"#gbox_"+gID,jqm:true, onClose: null});
                hideDialog();
                //return false;
            });
        }

        $.jgrid.viewModal("#"+IDs.themodal,{gbox:"#gbox_"+gID,jqm:true, overlay: 10, modal:false});
    };

grid.jqGrid({/*jqGrid options*/});

$("#delgridrow").click(function() {
    rowId = grid.jqGrid('getGridParam', 'selrow');
    if (rowId === null) {
        $.jgrid.viewModal("#alertmod",{gbox:"#gbox_"+grid[0].p.id,jqm:true});
        $("#jqg_alrt").focus();
    } else {
        createDeleteDialog();
    }

    return false;
});
1 голос
/ 20 июня 2012

Обновление до моего предыдущего поста ...

В конце я добавил модальный интерфейс, который убрал необходимость проверять мой #clonePopoup.В конце я также убираю модал.Я использую, найденный после #alertmod в Chrome, чтобы создать модал.Однако в IE по какой-то причине этого не происходит.Я создаю его, если он еще не существует.

Надеюсь, это более полное решение.

var popup = function (msg, title) {
    var modalcss = { position: 'fixed', top: 0, left: 0, width: '100%', height: '100%', display: 'block', opacity: 0.4, filter: 'alpha(opacity=40)', 'background-color': '#000', 'text-align': 'center', 'z-index': 101 };
    var popupClose = $('.ui-icon-closethick');
    popupClose.clone().attr('id', 'clonePopup').insertAfter(popupClose);
    popupClose.hide();
  $('#alertcnt>div').html(msg);
    $('#alerthd>span').html(title);
    if ($('#tc_container').length) {
        $('#tc_container').css(modalcss);
    } else {
        $('<div>', { 'id': 'tc_container' }).css(modalcss).insertAfter($('#alertmod'));
    }

$('#clonePopup').click(function (e) {
    $('#alertmod').hide();
    $('#alertcnt>div').html(' אנא, בחר שורה');
    $('#alerthd>span').html('אזהרה');
    popupClose.removeAttr('style');
    $('#alertmod').css('display', '');
    $('#tc_container').attr('style', 'display:none;'); 
    $('#clonePopup').remove();
   });
   $('#alertmod').show();
};

popup('Row saved successfully','Success');
1 голос
/ 18 июня 2012

Мне также было трудно реализовать встроенный модальный диалог jqGrid.Попытка вызова createModal () со всеми его параметрами была слишком сложной.Обходные пути, которые я видел опубликованными, также были очень сложными.Я решил покончить с проблемой, переписав HTML, а затем отобразив его.

jqGrid уже записывает HTML для своего модального всплывающего окна при загрузке.Я угнал его, написал свой собственный слушатель для закрывающей ссылки «X» и, о чудо, у меня был полностью очищенный диалог.Мой не модальный, но вы можете легко создать свой собственный, изменив CSS решения.Как только вы поймете, как манипулировать HTML, вы можете добавить любые элементы / атрибуты / классы, которые вы хотите.После закрытия вы просто удаляете то, что добавили.

var popup = function (msg, title) {
  if ($('#clonePopup').length == 0) {
    var popupClose = $('.ui-icon-closethick');
    popupClose.clone().attr('id', 'clonePopup').insertAfter(popupClose);
    popupClose.hide();
    $('#alertcnt>div').html(msg);
    $('#alerthd>span').html(title);
    $('#clonePopup').click(function (e) {
        $('#alertmod').hide();
        $('#clonePopup').remove();
        $('#alertcnt>div').html(' אנא, בחר שורה');
        $('#alerthd>span').html('אזהרה');
        popupClose.removeAttr('style');
    });
    $('#alertmod').show();
  }  
}};

popup('Row saved successfully','Success');

Сначала я проверяю, отображается ли окно сообщения, проверяя, существует ли уже мой идентификатор #clonePopup.Затем я беру ручку на закрывающую ссылку X, потому что собираюсь ее клонировать и скрыть оригинал.Если я использую оригинал, он не будет работать, потому что jqGrid прислушивается к нему, и я не установил необходимые параметры.Я создаю клон и присваиваю ему идентификатор «clonePopup».Я тогда прячу оригинал.

$('#alertcnt>div') gets me the container for the title.
$('#alerthd>span') gets me the container for the message.
$('#alertmod') is then shown.

$('#clonePopup').click()  then resets the HTML to its original state to not interfere with jqGrid's normal operation. 

Возможно, это не идеальное решение, но может быть для некоторых.Работает для меня.Спасает меня от попыток выяснить, как работает createModal ()!

Суть этого поста не в том, работает ли это конкретное решение как есть (надеюсь, оно работает), а в том, что вы можете переопределить ограниченияjqGrid переписав свой HTML.

...