Automatyczne powiększanie lub zmniejszanie okna dialogowego interfejsu użytkownika JQuery w celu dopasowania do jego zawartości


132

Mam okno dialogowe interfejsu użytkownika JQuery, które wyświetla formularz. Wybierając określone opcje w formularzu, pojawią się nowe opcje w formularzu, powodując jego wzrost. Może to prowadzić do scenariusza, w którym strona główna ma pasek przewijania, a okno dialogowe interfejsu użytkownika JQuery ma pasek przewijania. Ten scenariusz z dwoma paskami przewijania jest brzydki i mylący dla użytkownika.

Jak mogę sprawić, by okno dialogowe interfejsu użytkownika JQuery rosło (i prawdopodobnie zmniejszało się), aby zawsze pasowało do jego zawartości bez wyświetlania paska przewijania? Wolałbym, aby widoczny był tylko pasek przewijania na stronie głównej.


1
Proponuję zamieścić próbkę kodu, trudno jest polecić rozwiązanie bez obejrzenia struktury okna dialogowego.
Diego

Odpowiedzi:


139

Aktualizacja: Począwszy od jQuery UI 1.8, działającym rozwiązaniem (jak wspomniano w drugim komentarzu) jest użycie:

width: 'auto'

Użyj opcji autoResize: true. Zilustruję:

  <div id="whatup">
    <div id="inside">Hi there.</div>
  </div>
   <script>
     $('#whatup').dialog(
      "resize", "auto"
     );
     $('#whatup').dialog();
     setTimeout(function() {
        $('#inside').append("Hello!<br>");
        setTimeout(arguments.callee, 1000);
      }, 1000);
   </script>

Oto działający przykład: http://jsbin.com/ubowa


Hmm ... będzie musiał rozszerzyć mój FrameDialog ... jest to zasadniczo metoda, która tworzy zawartość iframe do użytku z oknem dialogowym ... nie jest idealna, ale działa dobrze w projekcie, do którego jej potrzebowałem.
Tracker 1

20
To nie zadziałało dla mnie. Zamiast tego ustawiłem opcję „szerokość” na „auto”.
Sam,

+1 do komentarza - u mnie zadziałało i przykład też działa, więc wyobrażam sobie, że to się nie zmieniło, ale hej, jeśli wszystko inne zawiedzie, daj mu szansę.
cgp

To nie działa jednak dla szerokości, myślę, że działa tylko dla wysokości.
Walt W

18
Ta odpowiedź nie jest już ważna dla wersji 1.8.4, zamiast tego użyj wysokości auto forum.jquery.com/topic/dialog-auto-width
Jeff

48

Odpowiedzią jest ustawienie

autoResize:true 

właściwość podczas tworzenia okna dialogowego. Aby to zadziałało, nie możesz ustawić żadnej wysokości dla okna dialogowego. Więc jeśli ustawisz stałą wysokość w pikselach dla okna dialogowego w jego metodzie twórcy lub za pomocą dowolnego stylu, właściwość autoResize nie będzie działać.


9
Fantastycznie :) ale dlaczego jQuery nie umieściło tego w swojej dokumentacji?!. W każdym razie dziękuję.
Wahid Bitar

ostrożnie, nie działa z pozycjonowaniem przez wtyczkę wyzwalacza (at, my, off itp.)
Jeffz

26

Działa to z interfejsem użytkownika jQuery v1.10.3

$("selector").dialog({height:'auto', width:'auto'});

U mnie też zadziałało (wersja 1.11.1).
Jay Cummins

12

Użyłem następującej właściwości, która działa dobrze dla mnie:

$('#selector').dialog({
     minHeight: 'auto'
});

Praca w jquery ui 1.12
Nguyên Ngô Duy

2

Wysokość jest obsługiwana automatycznie.

Szerokość nie jest!

Aby wykonać jakieś auto, pobierz rozmiar wyświetlanego elementu div, a następnie ustaw okno za pomocą.

W kodzie C # ...

TheDiv.Style["width"] = "200px";

    private void setWindowSize(int width, int height)
    {
        string widthScript =    "$('.dialogDiv').dialog('option', 'width', "    +   width   +");";
        string heightScript =   "$('.dialogDiv').dialog('option', 'height', "   +   height  + ");";

        ScriptManager.RegisterStartupScript(this.Page, this.GetType(),
            "scriptDOWINDOWSIZE",
            "<script type='text/javascript'>"
            + widthScript
            + heightScript +
            "</script>", false);
    }

2

Jeśli chcesz, aby działał w IE7, nie możesz użyć opcji nieudokumentowanej, błędnej i nieobsługiwanej {'width':'auto'} . Zamiast tego dodaj do swojego .dialog():

'open': function(){ $(this).dialog('option', 'width', this.scrollWidth) }

To, czy .scrollWidthzawiera wypełnienie po prawej stronie, zależy od przeglądarki (Firefox różni się od Chrome), więc możesz dodać subiektywną „wystarczająco dobrą” liczbę pikseli do .scrollWidthlub zastąpić ją własną funkcją obliczania szerokości.

Możesz chcieć uwzględnić je width: 0wśród swoich .dialog()opcji, ponieważ ta metoda nigdy nie zmniejszy szerokości, a jedynie ją zwiększy.

Przetestowano do pracy w IE7, IE8, IE9, IE10, IE11, Firefox 30, Chrome 35 i Opera 22.


1
var w = $('#dialogText').text().length;

$("#dialog").dialog('option', 'width', (w * 10));

zrobiłem to, czego potrzebowałem, aby zmienić szerokość okna dialogowego.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.