jquery $ (window) .width () dan $ (window) .height () mengembalikan nilai yang berbeda ketika viewport belum diubah ukurannya

105

Saya menulis situs menggunakan jquery yang berulang kali memanggil $(window).width()dan $(window).height()memposisikan serta elemen ukuran berdasarkan ukuran viewport.

Dalam pemecahan masalah saya menemukan bahwa saya mendapatkan laporan ukuran viewport yang sedikit berbeda dalam panggilan berulang ke fungsi jquery di atas ketika viewport tidak diubah ukurannya.

Bertanya-tanya apakah ada kasus khusus yang diketahui siapa pun ketika ini terjadi, atau apakah memang begini adanya. Perbedaan ukuran yang dilaporkan adalah 20 piksel atau kurang, tampaknya. Itu terjadi di Safari 4.0.4, Firefox 3.6.2 dan Chrome 5.0.342.7 beta di Mac OS X 10.6.2. Saya belum menguji browser lain karena tampaknya tidak spesifik untuk browser tersebut. Saya juga tidak dapat mengetahui apa perbedaannya, jika bukan ukuran area pandang, mungkinkah ada faktor lain yang membuat hasil berbeda?

Semua wawasan akan dihargai.


memperbarui:

Bukan nilai $(window).width()dan $(window).height()yang berubah. Ini adalah nilai variabel yang saya gunakan untuk menyimpan nilai di atas.

Bukan scrollbar yang memengaruhi nilai, tidak ada scrollbar yang muncul saat nilai variabel berubah. Berikut adalah kode saya untuk menyimpan nilai dalam variabel saya (yang saya lakukan supaya lebih pendek).

(semua ini ada di dalam $(document).ready())

// awalnya mendeklarasikan variabel agar terlihat oleh fungsi otehr di dalamnya .ready()

var windowWidth = $(window).width(); //retrieve current window width
var windowHeight = $(window).height(); //retrieve current window height
var documentWidth = $(document).width(); //retrieve current document width
var documentHeight = $(document).height(); //retrieve current document height
var vScrollPosition = $(document).scrollTop(); //retrieve the document scroll ToP position
var hScrollPosition = $(document).scrollLeft(); //retrieve the document scroll Left position


function onm_window_parameters(){ //called on viewer reload, screen resize or scroll

    windowWidth = $(window).width(); //retrieve current window width
    windowHeight = $(window).height(); //retrieve current window height
    documentWidth = $(document).width(); //retrieve current document width
    documentHeight = $(document).height(); //retrieve current document height
    vScrollPosition = $(document).scrollTop(); //retrieve the document scroll ToP position
    hScrollPosition = $(document).scrollLeft(); //retrieve the document scroll Left position

}; //end function onm_window_parameters()

Saya memasukkan pernyataan peringatan untuk menyelidiki variabel di atas terhadap nilai yang seharusnya mereka pegang. The $(item).param()nilai tetap konsisten, tetapi variabel saya berubah untuk alasan yang saya tidak tahu.

Saya telah mencari tempat-tempat di mana kode saya mungkin mengubah nilai variabel yang dimaksud, sebagai lawan hanya mengambil nilai yang ditetapkan dan tidak dapat menemukannya. Saya dapat memposting seluruh shebang di suatu tempat jika itu memungkinkan.

Manca Weeks
sumber

Jawaban:

98

Saya pikir apa yang Anda lihat adalah menyembunyikan dan menampilkan scrollbar. Berikut demo singkat yang menunjukkan perubahan lebar .

Selain itu: apakah Anda perlu melakukan polling secara konstan? Anda mungkin dapat mengoptimalkan kode Anda untuk dijalankan pada acara pengubahan ukuran, seperti ini:

$(window).resize(function() {
  //update stuff
});
Nick Craver
sumber
1
Ngomong-ngomong, Anda benar ... saat memecahkan masalah, saya perhatikan ada scrollbar. mereka muncul begitu singkat sehingga mereka tidak dapat dilihat kecuali dalam mode debug dengan skrip berhenti di tengah-tengah eksekusi. setelah saya menghapus variabel dan fungsi di atas, beberapa elemen masih melompat dari posisinya - ini berkaitan dengan urutan langkah skrip - Saya hanya harus memastikan saya mengatur ulang div yang menahan gambar yang saya sisipkan ke css kiri: 0 sebelum memasukkan gambar . moral untuk cerita ini: hanya karena scrollbar tidak muncul cukup lama untuk dilihat, tidak berarti mereka tidak ada di sana!
Manca Weeks
Saya juga akan menggunakan pertanyaan ini: stackoverflow.com/questions/2854407/… sehingga Anda dapat memeriksa setelah acara pengubahan ukuran selesai sebelum melakukan apa pun. Skrip Anda akan menjalankan apa pun yang ada di fungsi .resize () setiap piksel yang Anda ubah ukurannya, jadi praktik yang lebih baik adalah menunggu.
MarkP
9

Coba gunakan a

  • $(window).load peristiwa

atau

  • $(document).ready

    karena nilai awal mungkin tidak konstan karena perubahan yang terjadi selama penguraian atau selama pemuatan DOM.

Albi Patozi
sumber
3

Perhatikan bahwa jika masalah tersebut disebabkan oleh munculnya scrollbar, meletakkan

body {
  overflow: hidden;
}

di CSS Anda mungkin merupakan perbaikan yang mudah (jika Anda tidak membutuhkan halaman untuk menggulir).

xixixao
sumber
1

Saya mengalami masalah yang sangat mirip. Saya mendapatkan nilai height () yang tidak konsisten saat menyegarkan halaman saya. (Itu bukan variabel saya yang menyebabkan masalah, itu adalah nilai ketinggian yang sebenarnya.)

Saya perhatikan bahwa di bagian atas halaman saya, saya memanggil skrip saya terlebih dahulu, kemudian file css saya. Saya beralih sehingga file css ditautkan terlebih dahulu, kemudian file skrip dan tampaknya telah memperbaiki masalah sejauh ini.

Semoga membantu.

Jared
sumber
Sebenarnya, masalah awal saya adalah cara elemen saya memposisikan diri di sekitar halaman menyebabkan scrollbar muncul sepersekian detik -cukup untuk pengukuran menjadi miring tetapi tidak cukup bagi mata untuk menangkapnya ... Saya pikir ini setelah saya meletakkan pernyataan peringatan di antara pernyataan javascript saya untuk memecah kode menjadi status yang berbeda. Saya melakukan itu sehingga saya dapat meminta lansiran melaporkan pengukuran pada setiap tahap dalam eksekusi kode. Saat itulah saya memperhatikan bahwa salah satu status menyebabkan scrollbar muncul -yang kebetulan merupakan status pengukuran dilakukan.
Manca Weeks
1
Saya dapat mengkonfirmasi hal yang sama dengan bilah gulir. Saya akan membaca $ (window) .height () setelah mengubah ukuran browser dan itu mungkin menunjukkan sesuatu seperti 500. Kemudian saya akan menyegarkan (tanpa mengubah ukuran browser) dan itu akan menampilkan sesuatu yang lebih besar seperti 700. Dalam my kasus, saya dapat memperbaikinya hanya dengan melakukan overflow: hidden on the body, karena saya tidak ingin scrollbar menyala. Setelah saya melakukan itu, laporan ketinggiannya konsisten.
sbuck