javascript - window.location.reload พร้อมล้างแคช
ฉันต้องการรีโหลดหน้าเพจโดยใช้ JavaScript แต่ฉันต้องการล้างแคชด้วย ดังนั้นเมื่อรีเฟรชหน้าจะได้เวอร์ชันล่าสุดของทุกอย่างจากเซิร์ฟเวอร์ เบราว์เซอร์อื่น ๆ ยกเว้น IE จะไม่ได้เนื้อหาล่าสุด
มีวิธีแก้ไขสำหรับ IE9 ไหม?
คำตอบ #1
reload() ถูกออกแบบมาให้รับอาร์กิวเมนต์ซึ่งบอกให้มันทำการรีโหลดแบบหนัก เห็นได้ชัดว่าเป็นการละเลยแคช:
location.reload(true);
ฉันไม่สามารถรับรองความน่าเชื่อถือของมันได้ คุณอาจต้องการตรวจสอบเรื่องนี้เพิ่มเติม
แก้ไข (2021): พารามิเตอร์นี้ไม่เคยมีมาตรฐานและถูกยกเลิกไปแล้วในเบราว์เซอร์ที่ทันสมัย การเพิ่มความคิดเห็นทุกไตรมาสเพื่ออธิบายข้อเท็จจริงนี้จะไม่ช่วยอะไร
คำตอบ #2
คุณสามารถทำสิ่งนี้ได้หลายวิธี อย่างแรก เพียงแค่เพิ่มแท็กเมตานี้ลงใน head ของคุณ:
<meta http-equiv="Cache-control" content="no-cache">
หากคุณต้องการลบเอกสารออกจากแคช แท็กเมตา expires ควรจะสามารถลบได้โดยการตั้งค่าแอตทริบิวต์ content เป็น -1 ดังนี้:
<meta http-equiv="Expires" content="-1">
http://www.metatags.org/meta_http_equiv_cache_control
นอกจากนี้ IE ควรจะแสดงเนื้อหาล่าสุดสำหรับหน้าหลักให้คุณ หากคุณมีปัญหากับเอกสารภายนอก เช่น CSS และ JS ให้เพิ่มพารามิเตอร์ปลอมที่ท้าย URL ของคุณพร้อมเวลาปัจจุบันในมิลลิวินาทีเพื่อให้ไม่เหมือนเดิม วิธีนี้ IE และเบราว์เซอร์อื่น ๆ จะ มักจะ ให้คุณใช้งานเวอร์ชันล่าสุด นี่คือตัวอย่าง:
<script src="mysite.com/js/myscript.js?12345">
อัปเดต 1
หลังจากที่อ่านความคิดเห็นแล้ว ฉันเข้าใจว่าคุณต้องการลบแคชโดยใช้โปรแกรม ไม่ใช่ทุกครั้ง สิ่งที่คุณสามารถทำได้คือมีฟังก์ชันใน JS เช่น:
eraseCache(){
window.location = window.location.href+'?eraseCache=true';
}
จากนั้น ใน PHP สมมติว่าคุณทำอะไรบางอย่างแบบนี้:
<head>
<?php
if (isset($_GET['eraseCache'])) {
echo '<meta http-equiv="Cache-control" content="no-cache">';
echo '<meta http-equiv="Expires" content="-1">';
$cache = '?' . time();
}
?>
<!-- ... other head HTML -->
<script src="mysite.com/js/script.js<?= $cache ?>"
</head>
นี่ไม่ได้รับการทดสอบ แต่ควรใช้ได้ โดยพื้นฐานแล้ว ฟังก์ชัน JS ของคุณ ถ้าเรียกใช้งาน จะโหลดหน้าเพจใหม่ แต่จะเพิ่มพารามิเตอร์ GET ต่อท้าย URL จากนั้นเว็บไซต์ของคุณจะมีโค้ดฝั่งเซิร์ฟเวนท์ที่ตรวจหาพารามิเตอร์นี้ หากมีอยู่ จะเพิ่มแท็กเมตาและตัวแปรแคชที่มีเวลาปัจจุบันและแนบไปกับสคริปต์และ CSS ที่คุณมีปัญหาเรื่องการแคช
อัปเดต 2
แท็กเมตาแท้จริงแล้วจะไม่ล้างแคช เมื่อโหลดหน้า ดังนั้น ในทางเทคนิคคุณจะต้องเรียกใช้ฟังก์ชัน eraseCache ใน JS เมื่อหน้าโหลดเสร็จ คุณจะต้องโหลดมัน อีกครั้ง เพื่อให้การเปลี่ยนแปลงมีผล คุณควรจะสามารถแก้ปัญหานี้ด้วยภาษาเซิร์ฟเวอร์ของคุณ คุณสามารถเรียกใช้ฟังก์ชัน JS eraseCache เดิมได้ แต่แทนที่จะเพิ่มแท็กเมตา คุณต้องเพิ่ม HTTP Cache headers:
<?php
header("Cache-Control: no-cache, must-revalidate");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
?>
<!-- Here you'd start your page... -->
วิธีนี้ทำงานได้ทันทีโดยไม่ต้องรีโหลดหน้าเพจ เพราะมันล้างแคชก่อนที่หน้าจะโหลดและก่อนที่จะมีการรันอะไรก็ตาม
คำตอบ #3
ฉันมีปัญหานี้และฉันแก้มันโดยใช้จาวาสคริปต์
location.reload(true);
คุณอาจจะใช้
window.history.forward(1);
เพื่อหยุดปุ่มย้อนกลับของเบราว์เซอร์หลังจากผู้ใช้ล็อกเอาต์ออกจากแอปพลิเคชัน
