jquery $ (window) .width () และ $ (window) .height () ส่งคืนค่าที่แตกต่างกันเมื่อวิวพอร์ตไม่ได้รับการปรับขนาด


105

ฉันกำลังเขียนไซต์โดยใช้ jquery ที่เรียกซ้ำ ๆ$(window).width()และ$(window).height()เพื่อกำหนดตำแหน่งและขนาดองค์ประกอบตามขนาดวิวพอร์ต

ในการแก้ไขปัญหาฉันพบว่าฉันได้รับรายงานขนาดวิวพอร์ตที่แตกต่างกันเล็กน้อยในการเรียกซ้ำไปยังฟังก์ชัน jquery ด้านบนเมื่อไม่ได้ปรับขนาดวิวพอร์ต

สงสัยว่ามีกรณีพิเศษใดที่ใคร ๆ ก็รู้ว่าเมื่อเกิดเหตุการณ์นี้ขึ้นหรือเป็นอย่างนั้น ความแตกต่างของขนาดที่รายงานคือ 20px หรือน้อยกว่าปรากฏ เกิดขึ้นใน 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()ค่าอยู่สม่ำเสมอ แต่ตัวแปรของฉันเปลี่ยนสำหรับเหตุผลที่ฉันไม่สามารถคิดออก

ฉันได้ค้นหาสถานที่ที่โค้ดของฉันอาจเปลี่ยนแปลงค่าของตัวแปรที่เป็นปัญหาซึ่งตรงข้ามกับการดึงค่าที่ตั้งไว้และไม่พบเลย ฉันสามารถโพสต์ Shebang ทั้งหมดได้หากเป็นไปได้

คำตอบ:


98

ฉันคิดว่าสิ่งที่คุณเห็นคือการซ่อนและแสดงแถบเลื่อน นี่คือการสาธิตอย่างรวดเร็วแสดงการเปลี่ยนแปลงความกว้าง

นอกจากนี้คุณจำเป็นต้องสำรวจความคิดเห็นอย่างต่อเนื่องหรือไม่? คุณอาจสามารถเพิ่มประสิทธิภาพโค้ดของคุณเพื่อให้ทำงานในเหตุการณ์ปรับขนาดได้เช่นนี้:

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

1
btw คุณพูดถูก ... ในขณะที่แก้ไขปัญหาฉันสังเกตเห็นว่ามีแถบเลื่อน พวกเขาปรากฏในช่วงสั้น ๆ จนมองไม่เห็นยกเว้นในโหมดดีบักที่สคริปต์หยุดชั่วคราวในระหว่างการดำเนินการ เมื่อฉันลบตัวแปรและฟังก์ชั่นข้างต้นองค์ประกอบบางอย่างยังคงกระโดดจากตำแหน่ง - มันเกี่ยวข้องกับลำดับขั้นตอนของสคริปต์ - ฉันต้องแน่ใจว่าฉันรีเซ็ต div ที่ถือรูปภาพที่แทรกเป็น css ทางซ้าย: 0 ก่อนที่จะแทรกรูปภาพ . คุณธรรมต่อเรื่องราว: เพียงเพราะแถบเลื่อนไม่ปรากฏนานพอที่จะมองเห็นไม่ได้หมายความว่าพวกเขาไม่ได้อยู่ที่นั่น!
Manca Weeks

ฉันจะใช้คำถามนี้ด้วย: stackoverflow.com/questions/2854407/…เพื่อให้คุณสามารถตรวจสอบได้เมื่อเหตุการณ์ปรับขนาดเสร็จสิ้นก่อนที่จะดำเนินการใด ๆ สคริปต์ของคุณจะเรียกใช้สิ่งที่เคยอยู่ในฟังก์ชัน. resize () ทุกพิกเซลที่คุณปรับขนาดดังนั้นแนวทางปฏิบัติที่ดีกว่าคือรอ
MarkP

9

ลองใช้ไฟล์

  • $(window).load เหตุการณ์

หรือ

  • $(document).ready

    เนื่องจากค่าเริ่มต้นอาจไม่แน่นอนเนื่องจากการเปลี่ยนแปลงที่เกิดขึ้นระหว่างการแยกวิเคราะห์หรือระหว่างการโหลด DOM


3

โปรดทราบว่าหากปัญหาเกิดจากการปรากฏแถบเลื่อนให้วาง

body {
  overflow: hidden;
}

ใน CSS ของคุณอาจแก้ไขได้ง่าย (หากคุณไม่ต้องการให้หน้าเลื่อน)


1

ฉันมีปัญหาที่คล้ายกันมาก ฉันได้รับค่าความสูง () ที่ไม่สอดคล้องกันเมื่อฉันรีเฟรชหน้าของฉัน (ไม่ใช่ตัวแปรของฉันที่ทำให้เกิดปัญหา แต่เป็นค่าความสูงที่แท้จริง)

ฉันสังเกตว่าในส่วนหัวของหน้าฉันเรียกสคริปต์ของฉันก่อนจากนั้นจึงเรียกไฟล์ css ฉันเปลี่ยนเพื่อให้ไฟล์ css ถูกเชื่อมโยงก่อนจากนั้นไฟล์สคริปต์และดูเหมือนว่าจะแก้ไขปัญหาได้แล้ว

หวังว่าจะช่วยได้


จริงๆแล้วปัญหาเดิมของฉันคือวิธีที่องค์ประกอบของฉันวางตำแหน่งตัวเองรอบ ๆ หน้าทำให้แถบเลื่อนปรากฏขึ้นเพียงเสี้ยววินาที - เพียงพอที่การวัดจะเบ้ แต่ไม่เพียงพอที่ตาจะจับได้ ... ฉันคิดว่า สิ่งนี้ออกมาเมื่อฉันใส่ข้อความแจ้งเตือนระหว่างคำสั่งจาวาสคริปต์ของฉันเพื่อแบ่งรหัสออกเป็นสถานะที่แตกต่างกัน ฉันทำเช่นนั้นเพื่อให้การแจ้งเตือนรายงานการวัดในทุกขั้นตอนในการเรียกใช้โค้ด นั่นคือตอนที่ฉันสังเกตเห็นว่ารัฐหนึ่งทำให้แถบเลื่อนปรากฏขึ้นซึ่งเป็นสถานะที่วัดได้
Manca Weeks

1
ฉันสามารถยืนยันสิ่งเดียวกันด้วยแถบเลื่อน ฉันจะอ่าน $ (window) .height () หลังจากปรับขนาดเบราว์เซอร์แล้วและมันอาจแสดงบางอย่างเช่น 500 จากนั้นฉันจะรีเฟรช (โดยไม่ต้องปรับขนาดเบราว์เซอร์) และจะแสดงสิ่งที่ใหญ่กว่าเช่น 700 ในของฉัน ในกรณีนี้ฉันสามารถแก้ไขได้โดยการทำ overflow: ซ่อนอยู่ในร่างกายเพราะฉันไม่ต้องการเปิดแถบเลื่อน เมื่อฉันทำเช่นนั้นรายงานความสูงก็สอดคล้องกัน
sbuck
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.