Bagaimana cara pusat otomatis dialog jQuery UI saat mengubah ukuran browser?

100

Saat Anda menggunakan dialog jquery UI, semuanya bekerja dengan baik, kecuali satu hal. Saat browser diubah ukurannya, dialog tetap berada di posisi awal yang bisa sangat mengganggu.

Anda dapat mengujinya di: http://jqueryui.com/demos/dialog/

Klik pada contoh "dialog modal" dan ubah ukuran browser Anda.

Saya ingin mengizinkan dialog menjadi pusat otomatis saat browser mengubah ukuran. Bisakah ini dilakukan dengan cara yang efisien untuk semua dialog saya di aplikasi saya?

Terima kasih banyak!

Jorre
sumber

Jawaban:

160

Mengatur positionopsi akan memaksa ini, jadi gunakan saja selektor yang sama yang mencakup semua dialog Anda di mana saya gunakan di #dialogsini (jika tidak menemukannya tidak ada tindakan yang diambil, seperti semua jQuery):

jQuery UI sebelum 1.10

$(window).resize(function() {
    $("#dialog").dialog("option", "position", "center");
});

jQuery UI 1.10 atau lebih tinggi

$(window).resize(function() {
    $("#dialog").dialog("option", "position", {my: "center", at: "center", of: window});
});

Inilah halaman demo UI jQuery yang sama yang hanya menambahkan kode di atas , kami hanya menambahkan penangan ke acara jendela resizedengan .resize(), sehingga memicu pusat ulang pada waktu yang tepat. </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> orang </s>

Nick Craver
sumber
terima kasih, itu terlihat bagus. Mungkin seharusnya saya memberi tahu bahwa saya tidak selalu tahu ID dialog saya, seperti ini (bagaimana saya bisa menargetkan dialog itu?): Var $ dialog = $ ('<div> <a href = "#" title = "Batal"> Batal </a> </div> ') .html (assetBrowser) .dialog ({autoOpen: false, title:' Assets Manager ', modal: true, closeOnEscape: true, tombol: tombol, lebar: 840, tinggi: 500}); $ dialog.dialog ('open');
Jorre
11
@Jorre - Mereka semua mendapatkan kelas yang sama saat Anda membuat dialog, untuk membuatnya umum Anda dapat melakukan ini:, $(".ui-dialog-content").dialog("option", "position", "center");ini akan memeriksa dialog apa pun :)
Nick Craver
3
Sayangnya, jawaban yang diajukan berdampak buruk pada pengubahan ukuran dialog. Ketika Anda mencoba mengubah ukurannya dengan pegangan SE, dialog diubah ukurannya di keempat sisi.
2
Saya merekomendasikan pembatasan atau debouncing acara pengubahan ukuran. Saya telah melihat IE7 & IE8 memindahkan dialog "di luar" viewport karena penangan pengubahan ukuran menjalankan terlalu banyak kali.
BStruthers
2
Pada versi terbaru jQuery UI, saya perlu menggunakan {my: "center", di: "center", of: window} daripada "center". Saya menggunakan 1.11.0.
Mike Dotterer
20

Atau jawaban Ellesedil,

Solusi itu tidak langsung berfungsi untuk saya, Jadi saya melakukan hal berikut yang juga merupakan versi dinamis tetapi dipersingkat:

$( window ).resize(function() {
    $(".ui-dialog-content:visible").each(function () {
        $( this ).dialog("option","position",$(this).dialog("option","position"));
    });
});

1 untuk Ellesedil sekalipun

EDIT:

Versi yang jauh lebih pendek yang berfungsi baik untuk satu dialog:

$(window).resize(function(){
    $(".ui-dialog-content").dialog("option","position","center");
});

Tidak perlu .each () digunakan mungkin jika Anda memiliki beberapa dialog unik yang tidak ingin Anda sentuh.

Pierre
sumber
menggunakan kelas .ui-dialog-content untuk semua dialog, jawaban yang diterima adalah untuk dialog tertentu
Pierre
Ah benar. Maaf. Tidak melihat perbedaan pada pandangan pertama dalam pengeditan.
Ellesedil
Saya menggunakan pendekatan ini dengan semi-berhasil. Itu seperti yang diiklankan tetapi safari seluler iOS 7 benar-benar tersedak jika keyboard menyala. Saya telah mencoba untuk mengaburkan () input tetapi Gingerbread melihat keyboard sebagai acara pengubahan ukuran dan terjebak dalam lingkaran yang tidak pernah mengizinkan entri input. Ada lagi yang menghadapi ini?
Joseph Juhnke
Mungkin menambahkan penghitung di luar .resize()dan di dalam jika penghitung mencapai 10atau 20kemudian break;, saya belum punya masalah ini, saya tidak melayani Perangkat / Browser tersebut. Anda harus mencoba solusi yang jika macet, Anda dapat keluar dari situ
Pierre
Saran pertama Anda berhasil dan jawaban @Ellesedil tidak.
akousmata
13

Jawaban yang lebih komprehensif, yang menggunakan jawaban Nick dengan cara yang lebih fleksibel dapat ditemukan di sini .

Adaptasi dari kode relevansi dari utas itu ada di bawah. Ekstensi ini pada dasarnya membuat setelan dialog baru yang disebut autoReposition yang menerima benar atau salah. Kode sebagai default tertulis pilihan true. Masukkan ini ke dalam file .js dalam proyek Anda sehingga halaman Anda dapat memanfaatkannya.

    $.ui.dialog.prototype.options.autoReposition = true;
    $(window).resize(function () {
        $(".ui-dialog-content:visible").each(function () {
            if ($(this).dialog('option', 'autoReposition')) {
                $(this).dialog('option', 'position', $(this).dialog('option', 'position'));
            }
        });
    });

Ini memungkinkan Anda untuk memberikan "benar" atau "salah" untuk pengaturan baru ini saat Anda membuat dialog di halaman Anda.

$(function() {
    $('#divModalDialog').dialog({
        autoOpen: false,
        modal: true,
        draggable: false,
        resizable: false,
        width: 435,
        height: 200,
        dialogClass: "loadingDialog",
        autoReposition: true,    //This is the new autoReposition setting
        buttons: {
            "Ok": function() {
                $(this).dialog("close");
            }
        }
    });
});

Sekarang dialog ini akan selalu mengubah posisinya sendiri. AutoReposition (atau apa pun yang Anda sebut pengaturan) dapat menangani dialog apa pun yang tidak memiliki posisi default dan secara otomatis mengubah posisinya saat jendela diubah ukurannya. Karena Anda menyetel ini saat membuat dialog, Anda tidak perlu mengidentifikasi dialog karena fungsionalitas pemosisian ulang sudah ada di dalam dialog itu sendiri. Dan bagian terbaiknya adalah karena ini diatur per dialog, Anda dapat membuat beberapa dialog mengubah posisinya sendiri dan yang lain tetap di tempatnya.

Penghargaan untuk pengguna scott.gonzalez di forum jQuery untuk solusi lengkapnya.

Ellesedil
sumber
Addon / edit ini sepertinya tidak berfungsi lagi mulai Juli 2014. Jawaban dari @Pierre masih berfungsi.
merosot
@degenerate: Ada kemungkinan bahwa pembaruan pada jQuery mungkin memerlukan sedikit perubahan pada sintaks. Saya tidak lagi bekerja atau bahkan memiliki akses ke proyek tempat saya menerapkan ini (sebenarnya, saya sedang menulis API), jadi saya tidak memiliki cara mudah untuk menentukan apakah ada perubahan yang diperlukan untuk versi jQuery terbaru.
Ellesedil
Jawaban ini tidak berfungsi untuk versi terbaru. Tapi idenya bagus. Ini adalah konten penangan pengubah ukuran jendela saya: $(".ui-dialog-content:visible").each(function () { if ($(this).dialog('option', 'autoReposition')) { $(this).dialog('option', 'position', $(this).dialog('option', 'position')); } });Ini berfungsi dengan baik :)
nacho4d
@ nacho4d: Jangan ragu untuk mengedit jawaban dan menambahkan kode yang lebih baru untuk versi jquery apa pun yang Anda kerjakan di bawah.
Ellesedil
1
@Ellesedil Saya baru saja mengubah beberapa baris dalam potongan kode pertama Anda. Sebenarnya itulah yang ditulis scott.gonzalez pertama kali di utas. Aku tidak tahu mengapa ia berubah $( "#dialog" ).dialog( "option", "position" ) ke $(this).data("dialog").options.positionnanti. Bagaimanapun, sekarang jawaban ini berhasil!
nacho4d
2

Opsi hanya CSS lain yang berfungsi adalah ini. Margin negatif harus sama dengan setengah tinggi dan setengah lebar Anda. Jadi dalam kasus ini, dialog saya adalah lebar 720px kali 400px. Ini memusatkannya secara vertikal dan horizontal.

.ui-dialog {
  top:50% !important;
  margin-top:-200px !important; 
  left:50% !important;
  margin-left:-360px !important
}
Kirk Ross
sumber
2

Sebagai alternatif, posisi ui jQuery dapat digunakan,

$(window).resize(function ()
{
    $(".ui-dialog").position({
        my: "center", at: "center", of: window
    });
});
AkilaI
sumber
0

Halo semuanya!

Solusi Vanilla JS:

(function() {
  window.addEventListener("resize", resizeThrottler, false);

  var resizeTimeout;

  function resizeThrottler() {
    if (!resizeTimeout) {
      resizeTimeout = setTimeout(function() {
        resizeTimeout = null;
        actualResizeHandler();
      }, 66);
    }
  }

  function actualResizeHandler() {
    $(".ui-dialog-content").dialog("option", "position", { my: "center", at: "center", of: window });
  }
}());
Alexandr Kazakov
sumber
$.isVanillaJS == false
Andrew