Проблема полосы прокрутки с jQuery диалоговое окно UI в Chrome и Safari

Эта запись в блоге от Eric Lippert, Главного Инженера-разработчика программного обеспечения в Microsoft, подводит итог превосходного и краткого набора инструкции .

по стратегии исключения

Короче говоря:

  • Фатальный : Ужасные ошибки, которые указывают на Ваш процесс, полностью неисправимы. Очистите любые ресурсы, Вы можете, но не ловить их. Если Вы пишете код, который имеет способность обнаружить такую ситуацию, любой ценой, бросок. Пример: Из исключения памяти.

  • Глупый : Относительно простые ошибки, которые указывают на Ваш процесс, не могут воздействовать на любые данные, которые он вручается, но обычно продолжал бы, если независимо от того, что ситуация вызвала ошибку, просто проигнорирован. Они более известны как ошибки. Не бросайте или ловите их, но вместо этого предотвращайте их, обычно передающими ошибками или другими значимыми индикаторами отказа, который может быть обработан Вашими методами. Пример: исключение Нулевого аргумента.

  • Досаждать : Относительно простые ошибки, которые кодируют Вас, не владеют, бросает в Вас. Необходимо поймать все их и соглашение с ними, обычно таким же образом, поскольку Вы имели бы дело с Глупый собственное исключение. Не бросайте их назад снова. Пример: исключение Формата из C# Int32. Синтаксический анализ () метод

  • Внешний : Относительно простые ошибки, которые много походят Досаждать (от кода других людей) или даже Глупый (от Вашего кода) ситуации, но должны быть брошены, потому что действительность диктует, что код это бросает их действительно, понятия не имеют, как восстановиться, но вызывающая сторона, вероятно, будет. Разрешение и бросок они, но когда Ваш код получает их откуда-либо, ловят их и соглашение с ними. Пример: Файл, не найденный исключением.

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

42
задан tw16 8 September 2011 в 19:46
поделиться

5 ответов

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

Не могли бы вы поместить содержимое диалогового окна в прокручиваемый div? Таким образом, вместо того, чтобы прокручивать всю страницу, нужно прокручивать только содержимое внутри div. Этот обходной путь тоже должен быть довольно простым.

7
ответ дан 26 November 2019 в 23:56
поделиться

Я считаю, что слишком большие диалоги противоречат вашему требованию «приличного удобства использования». Даже если бы у вас не было обходного пути из-за ошибки диалогового окна jQuery UI, я бы избавился от таких больших диалогов. В любом случае, я понимаю, что могут быть некоторые «крайние» случаи, когда вам нужно адаптироваться, поэтому ...

Тем не менее, было бы неплохо, если бы вы приложили скриншот - вы задаете вопрос о дизайне, но мы этого не видим. Но я понимаю, что вы, возможно, не сможете / не захотите показать его содержимое, так что это нормально. Это мои слепые догадки; надеюсь, вы найдете их полезными:

  • Попробуйте другой макет для своего диалога. Если вы это сделаете, сделайте это для всех диалогов, а не только для тех, с которыми у вас возникли проблемы (пользователи не любят изучать много разных интерфейсов).
  • Если вы не можете найти другой макет, попробуйте сначала расширить диалоговое окно . ЕСЛИ у вас есть много вариантов на выбор, вы можете найти хорошее решение, разделив их на две колонки.
  • Зная, что вы уже используете jQuery UI, попробуйте использовать вкладки . Если у вас слишком много параметров, панель с вкладками обычно является хорошим решением - пользователи «привыкли» к этому виджету.
  • Вы говорили об «элементах» в диалоговом окне, но мы не знаем, что это за элемент. Можно ли вообще отображать их в «обобщенном» виде, например, в небольшом списке слева и в расширенном виде справа, когда вы нажимаете на них? Например, имея список с названиями элементов слева, и когда вы щелкаете по ним, вы получаете полное отображение справа.

Не имея возможности увидеть дизайн, я думаю, это все, что я могу.

1
ответ дан 26 November 2019 в 23:56
поделиться

Хотя я согласен с теми, кто не делает диалоговое окно больше, чем область просмотра, я думаю, что в некоторых случаях может потребоваться прокрутка. Диалог может выглядеть очень хорошо в разрешении больше 1024 x 768, но все, что меньше, выглядит ломким. Или скажите, например, что вы никогда не хотите, чтобы диалоговое окно отображалось над заголовком вашего сайта. В моем случае у меня есть объявления, которые иногда имеют проблемы с z-индексом flash, поэтому я никогда не хочу, чтобы над ними отображались диалоговые окна. Наконец, вообще плохо лишать пользователя какого-либо общего элемента управления, такого как прокрутка. Это проблема, не связанная с размером диалога.

Мне было бы интересно узнать, почему эти события mousedown и mouseup вообще существуют.

Я попробовал решение, которое предоставил alexis.kennedy, и оно работает с перебоями, не нарушая ничего из того, что я вижу в любом браузере.

2
ответ дан 26 November 2019 в 23:56
поделиться

Вы пробовали мой добавочный номер к Dialog? http://plugins.jquery.com/project/jquery-framedialog

0
ответ дан 26 November 2019 в 23:56
поделиться

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

function showPopup()
{
    //...

    // actionContainer - is a DIV for dialog

    if ($.browser.safari == true)
    {
        // disable modal mode
        $("#actionContainer").dialog('option', 'modal', false);

        // show overlay div manually
        var tempDiv = $("<div id='tempOverlayDiv'></div>");
        tempDiv.css("background-color", "#000");
        tempDiv.css("opacity", "0.2");
        tempDiv.css("position", "absolute");
        tempDiv.css("left", 0);
        tempDiv.css("top", 0);
        tempDiv.css("width", $(document).width());
        tempDiv.css("height", $(document).height());
        $("body").append(tempDiv);
    }

    // remove overlay div on dialog close
    $("#actionContainer").bind('dialogclose', function(event, ui) {
        $("#tempOverlayDiv").remove();      
    });

    //...
}
2
ответ дан 26 November 2019 в 23:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: