Бесплатный jqGrid 4.9.0 - диалоговое окно расширенного поиска (поиск по нескольким параметрам) меняет местоположение до выхода из экрана

Эта ошибка возникает только на Free jqGrid 4.9.0 (когда я переключаюсь обратно на Free-jqGrid 4.8.0, все работает хорошо).

Я не смог воссоздать его на jFiddle, так что это может быть связано с тем, что у меня есть несколько сеток на одной странице (возможно).

Ошибка:

В диалоговом окне расширенного поиска их стиль «сверху» и «слева» по умолчанию равен 0px, так что они появляются по умолчанию в верхнем левом углу сетки, когда пользователь нажимает кнопку поиска.

Теперь, если вы закроете диалоговое окно и снова нажмете кнопку поиска, «верхний» и «левый» каким-то образом пересчитываются, и диалоговое окно увеличится на -228,1875 пикселей для «верхнего» и -5 пикселей для «левого». . в следующий раз, когда я повторю этот поток, диалоговое окно просто исчезнет с экрана (потому что оно получает -500 пикселей или что-то в этом роде).

Это происходит на всех моих 5 сетках. Такое же поведение. диалог продолжает пересчитывать свою позицию при каждом повторном открытии.

Я начал заниматься реверс-инжинирингом, чтобы выяснить, где те строки в 4.9.0, которые вызывают такое поведение, и выяснил, что это связано с функцией savePositionOnHide (строка 9896 в jquery.jqgrid.src.js) внутри блока: this.data(propName, {

если я заменю:

top: top,                 //parseFloat($w.css("top")),
left: left,               //parseFloat($w.css("left")),

с

top: getCssStyleOrFloat($w, "top"),             //parseFloat($w.css("top")),
left: getCssStyleOrFloat($w, "left"),               //parseFloat($w.css("left")),

То, что я скопировал из 4.8.0, все работает хорошо.

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

Спасибо,


person Tal    schedule 24.06.2015    source источник
comment
Не могли бы вы опубликовать демо, которое можно использовать для воспроизведения ошибки? Я не могу воспроизвести проблему. Изменения внесены для случая, когда jqGrid может находиться внутри диалога или какого-то другого div с position: absolute. Изменения из 4.9.0 работали правильно во всех моих тестах, но нельзя использовать все возможные тестовые случаи причины.   -  person Oleg    schedule 24.06.2015
comment
Мне не удалось воссоздать его для демонстрации, извините. Я могу видеть это только в своем окружении. Я не использую position:absolute, поэтому, если вы говорите, что с изменениями, которые я сделал, нет никакого риска, то этого достаточно для меня.   -  person Tal    schedule 24.06.2015
comment
Было бы интересно локализовать источник проблемы. Я предполагаю, что вы установили некоторые параметры, такие как jqModal, modal, toTop диалогового окна поиска, или вы установили некоторые свойства $.jgrid.jqModal (toTop: false или что-то в этом роде). Можно использовать опцию recreateFilter: true, чтобы игнорировать ранее сохраненную позицию. Это обязательно решит проблему, но мне было бы интересно локализовать тестовый случай, когда код 4.9.0 работает некорректно. Нужно просто иметь демо, которое воспроизводит код и отлаживать код, чтобы найти причину.   -  person Oleg    schedule 25.06.2015
comment
Я сделал это. jsfiddle.net/bnbdyn0c Просто нажмите на btn2 и закройте диалоговое окно, затем снова нажмите на btn2, закройте его. , снова нажмите на кнопку btn2. Вы увидите это.   -  person Tal    schedule 25.06.2015


Ответы (1)


Спасибо за отчет об ошибке и демонстрацию, демонстрирующую проблему! Я согласен, что код глючит. Я исправил код savePositionOnHide (см. здесь) из

savePositionOnHide = function (propName, frmgr, h) {
    var $w = h.w, $form = $(frmgr), toTop = h.c.toTop, offsetGbox,
        top = getCssStyleOrFloat($w, "top"),
        left = getCssStyleOrFloat($w, "left");
    // we use below .style.height and .style.width to save correctly "auto" and "100%" values
    // the "px" suffix will be saved too, but it's not a problem 
    if (toTop) {
        offsetGbox = $w.closest(".ui-jqgrid").offset();
        top -= offsetGbox.top;
        left -= offsetGbox.left;
    }
    ...
}

к следующему

savePositionOnHide = function (propName, frmgr, h) {
    var $w = h.w, $form = $(frmgr), toTop = h.c.toTop, offsetGbox, offset, top, left;
    if (toTop) {
        offsetGbox = this.closest(".ui-jqgrid").offset();
        offset = $w.offset();
        top = offset.top - offsetGbox.top;
        left = offset.left - offsetGbox.left;
    } else {
        // we use below .style.height and .style.width to save correctly "auto" and "100%" values
        // the "px" suffix will be saved too, but it's not a problem 
        top = getCssStyleOrFloat($w, "top");
        left = getCssStyleOrFloat($w, "left");
    }

и зафиксировали изменения основного кода на GitHub. демонстрация, которую вы разместили, использует код непосредственно из GitHub, и она начинает работать правильно после того, как я внес исправление.

person Oleg    schedule 25.06.2015