jquery $ (window) .width () та $ (window) .height () повертають різні значення, коли вікно перегляду не було змінено


105

Я пишу веб-сайт за допомогою jquery, який неодноразово дзвонить, $(window).width()а $(window).height()також розміщувати та розміщувати елементи залежно від розміру вікна перегляду.

Під час усунення несправностей я виявив, що я отримую дещо інші звіти про розмір вікна перегляду при повторних викликах вищевказаних функцій jquery, коли область перегляду не змінюється.

Цікаво, чи є якийсь особливий випадок, хтось знає, коли це відбувається, чи це просто так. Різниця у розмірах, про які повідомляється, становить 20 пікселів або менше, вона з'являється. Це трапляється в Safari 4.0.4, Firefox 3.6.2 та Chrome 5.0.342.7 beta на Mac OS X 10.6.2. Я ще не перевіряв інші веб-переглядачі, оскільки, здається, він не є специфічним для браузера. Я також не зміг зрозуміти, від чого залежить різниця, якщо це не розмір вікна перегляду, чи може бути ще один фактор, який робить результати різними?

Будь-яке розуміння буде вдячне.


оновлення:

Це не значення, $(window).width()а $(window).height()те, що змінюються. Це значення змінних, які я використовую для зберігання значень вище.

Значення змінних не змінюються на панелях прокрутки, не змінюються смуги прокрутки. Ось мій код для зберігання значень у моїх змінних (що я роблю лише для того, щоб вони були коротшими).

(все це всередині $(document).ready())

// спочатку оголошують змінні видимими для функцій otehr всередині .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()

Я вставив оператор попередження, щоб перевірити вказані вище змінні проти значень, які вони повинні містити. Ці $(item).param()значення залишаються послідовними, але мої змінні змінюються з причин , я не можу зрозуміти.

Я шукав місця, де мій код може змінювати значення відповідних змінних, на відміну від того, щоб просто отримати їх встановлені значення і не знайти їх. Я можу розмістити цілий шебанг кудись, якщо це можливо.

Відповіді:


98

Я думаю, що ти бачиш - це приховування та показ смуг прокрутки. Ось швидкий демонстраційний показ, який показує зміну ширини .

Як осторонь: чи потрібно постійно опитуватись? Можливо, ви зможете оптимізувати свій код для запуску події зміни розміру, наприклад:

$(window).resize(function() {
  //update stuff
});

1
btw, ви мали рацію все-таки ... під час усунення несправностей я помітив, що є смуги прокрутки. вони з’явилися настільки коротко, що їх не можна було побачити, за винятком режиму налагодження, із сценарієм, призупиненим у середині виконання. як тільки я видалив вищезгадані змінні та функції, деякі елементи все-таки стрибали з позиції - це було пов'язано з порядком кроків сценарію - я просто повинен був переконатися, що я скинув div, утримуючи вставлені зображення, до css left: 0 перед тим, як вставити зображення . морально до історії: тільки те, що смуги прокрутки не з’являються досить довго, щоб їх побачити, не означає, що їх там не було!
Манка тижні

Я також використав би це питання: stackoverflow.com/questions/2854407/…, щоб ви могли перевірити, як тільки подія зміни розміру закінчиться, перш ніж робити що-небудь. Ваш сценарій буде виконувати те, що колись є у .resize () функції кожного пікселя, який ви зміните розмір, тому кращою практикою є почекати.
МаркP

9

Спробуйте використовувати

  • $(window).load подія

або

  • $(document).ready

    тому що початкові значення можуть бути непостійними через зміни, які відбуваються під час розбору або під час завантаження DOM.


3

Зауважте, що якщо проблема викликана появою смуг прокрутки, поставте

body {
  overflow: hidden;
}

у вашому CSS може бути легким виправленням (якщо вам не потрібна сторінка для прокрутки).


1

У мене була дуже схожа проблема. Коли я оновлював сторінку, я отримував невідповідні значення висоти (). (Ця проблема не викликала мою змінну, це фактичне значення висоти.)

Я помітив, що в голові сторінки я зателефонував спершу свої сценарії, потім свій файл css. Я переключився так, що спочатку пов'язаний файл css, потім файли сценаріїв, і, здається, до цього часу виправлена ​​проблема.

Сподіваюся, що це допомагає.


Власне, моя первісна проблема полягала в тому, що те, як мої елементи розташовувались навколо сторінки, спричиняло появу смуг прокрутки на частку секунди - достатньо для того, щоб вимірювання було перекошене, але недостатньо, щоб око це зрозуміло ... Я зрозумів це виходить, як тільки я поміщаю заяви попередження між своїми заявами javascript, щоб розбити код на різні стани. Я зробив це, щоб я міг змусити сповіщення повідомляти про вимірювання на кожному етапі виконання коду. Ось тоді я помітив, що одне із станів спричинило появу смуг прокрутки - що сталося із станом вимірювання.
Manca Weeks

1
Я можу підтвердити те ж саме за допомогою прокрутки. Після зміни розміру браузера я прочитав би $ (window) .height (), і він може відобразити щось на зразок 500. Тоді я б оновив (не змінюючи розмір веб-переглядача), і він відобразив би щось більше, як 700. У моєму У випадку, я зміг це виправити, просто виконавши переповнення: приховано на корпусі, тому що я ніколи не хочу вмикати смуги прокрутки. Як тільки я це зробив, звіт про висоту був узгодженим.
sbuck
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.