jquery $ (window) .width () và $ (window) .height () trả về các giá trị khác nhau khi khung nhìn chưa được thay đổi kích thước


105

Tôi đang viết một trang web bằng cách sử dụng jquery liên tục gọi $(window).width()$(window).height()định vị các phần tử và kích thước dựa trên kích thước khung nhìn.

Khi khắc phục sự cố, tôi phát hiện ra rằng tôi nhận được các báo cáo kích thước chế độ xem hơi khác trong các lệnh gọi lặp lại các hàm jquery ở trên khi chế độ xem không được thay đổi kích thước.

Tự hỏi liệu có bất kỳ trường hợp đặc biệt nào có ai biết khi nào điều này xảy ra không, hoặc nếu đây chỉ là cách nó là. Sự khác biệt về kích thước được báo cáo là 20px trở xuống, nó xuất hiện. Nó xảy ra trong Safari 4.0.4, Firefox 3.6.2 và Chrome 5.0.342.7 beta trên Mac OS X 10.6.2. Tôi chưa kiểm tra các trình duyệt khác vì nó có vẻ không dành riêng cho trình duyệt. Tôi cũng không thể tìm ra sự khác biệt phụ thuộc vào điều gì, nếu đó không phải là kích thước khung nhìn, liệu có yếu tố nào khác khiến kết quả khác nhau không?

Bất kỳ cái nhìn sâu sắc sẽ được đánh giá cao.


cập nhật:

Nó không phải là các giá trị của $(window).width()$(window).height()đang thay đổi. Đó là các giá trị của các biến mà tôi đang sử dụng để lưu trữ các giá trị ở trên.

Nó không phải là thanh cuộn đang bỏ qua các giá trị, không có thanh cuộn nào xuất hiện khi các giá trị biến thay đổi. Đây là mã của tôi để lưu trữ các giá trị trong các biến của tôi (tôi đang làm chỉ để chúng ngắn hơn).

(tất cả điều này là bên trong $(document).ready())

// ban đầu khai báo các biến để hiển thị cho các hàm otehr trong .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()

Tôi đã chèn một câu lệnh cảnh báo để thăm dò các biến ở trên so với các giá trị mà chúng được cho là đang giữ. Các $(item).param()giá trị vẫn nhất quán, nhưng các biến của tôi thay đổi vì những lý do tôi không thể tìm ra.

Tôi đã tìm kiếm những nơi mà mã của tôi có thể thay đổi giá trị của các biến được đề cập, trái ngược với việc chỉ lấy các giá trị đã đặt của chúng và không thể tìm thấy biến nào. Tôi có thể đăng toàn bộ shebang ở đâu đó nếu đó là khả năng.

Câu trả lời:


98

Tôi nghĩ những gì bạn đang thấy là sự ẩn và hiện của các thanh cuộn. Đây là một bản trình diễn nhanh cho thấy sự thay đổi chiều rộng .

Ngoài ra: bạn có cần thăm dò ý kiến ​​liên tục không? Bạn có thể tối ưu hóa mã của mình để chạy trên sự kiện thay đổi kích thước, như sau:

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

1
btw, cuối cùng thì bạn đã đúng ... trong khi khắc phục sự cố, tôi nhận thấy có các thanh cuộn. chúng xuất hiện quá ngắn đến nỗi không thể nhìn thấy chúng ngoại trừ ở chế độ gỡ lỗi với tập lệnh bị tạm dừng khi đang thực thi. khi tôi đã xóa các biến và hàm ở trên, một số phần tử vẫn nhảy khỏi vị trí - điều đó liên quan đến thứ tự của các bước tập lệnh - tôi chỉ cần đảm bảo rằng tôi đã đặt lại div giữ các hình ảnh đã chèn của tôi về css left: 0 trước khi chèn hình ảnh . đạo đức của câu chuyện: chỉ vì thanh cuộn không xuất hiện đủ lâu để được nhìn thấy, không có nghĩa là chúng không ở đó!
Tuần Manca

Tôi cũng sẽ sử dụng câu hỏi này: stackoverflow.com/questions/2854407/… để bạn có thể kiểm tra khi sự kiện thay đổi kích thước kết thúc trước khi làm bất kỳ điều gì. Tập lệnh của bạn sẽ chạy những gì từng có trong hàm .resize () mỗi pixel bạn thay đổi kích thước, vì vậy cách tốt hơn là hãy đợi.
MarkP

9

Cố gắng sử dụng

  • $(window).load biến cố

hoặc là

  • $(document).ready

    vì các giá trị ban đầu có thể không nhất quán do những thay đổi xảy ra trong quá trình phân tích cú pháp hoặc trong quá trình tải DOM.


3

Lưu ý rằng nếu sự cố đang xảy ra do xuất hiện thanh cuộn, hãy đặt

body {
  overflow: hidden;
}

trong CSS của bạn có thể là một sửa chữa dễ dàng (nếu bạn không cần trang để cuộn).


1

Tôi đã gặp một vấn đề tương tự. Tôi nhận được các giá trị height () không nhất quán khi làm mới trang của mình. (Đó không phải là biến của tôi gây ra sự cố, đó là giá trị chiều cao thực tế.)

Tôi nhận thấy rằng trong phần đầu của trang, tôi đã gọi các tập lệnh của mình trước tiên, sau đó đến tệp css của tôi. Tôi đã chuyển đổi để tệp css được liên kết trước, sau đó đến các tệp tập lệnh và điều đó dường như đã khắc phục được sự cố cho đến nay.

Hy vọng rằng sẽ giúp.


Trên thực tế, vấn đề ban đầu của tôi là cách các yếu tố của tôi tự định vị xung quanh trang đã khiến thanh cuộn xuất hiện trong một phần nhỏ của giây - đủ để phép đo bị lệch nhưng không đủ để mắt bắt được nó ... điều này xảy ra khi tôi đặt các câu lệnh cảnh báo giữa các câu lệnh javascript của mình để ngắt mã thành các trạng thái riêng biệt. Tôi đã làm điều đó để có thể có các cảnh báo báo cáo các phép đo ở mọi giai đoạn trong quá trình thực thi mã. Đó là khi tôi nhận thấy rằng một trong những trạng thái khiến thanh cuộn xuất hiện - tình cờ là trạng thái mà phép đo được thực hiện.
Manca Tuần

1
Tôi có thể xác nhận điều tương tự với các thanh cuộn. Tôi đã đọc $ (window) .height () sau khi thay đổi kích thước trình duyệt và nó có thể hiển thị một cái gì đó giống như 500. Sau đó, tôi sẽ làm mới (mà không thay đổi kích thước trình duyệt) và nó sẽ hiển thị một cái gì đó lớn hơn như 700. Trong trường hợp này, tôi đã có thể sửa nó bằng cách thực hiện tràn: ẩn trên phần thân, vì tôi không bao giờ muốn bật thanh cuộn. Khi tôi đã làm điều đó, báo cáo chiều cao nhất quán.
sbuck
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.