เนื่องจาก HTTP ไม่มีสถานะทุกครั้งที่คุณโหลดหน้าเว็บจะใช้ค่าเริ่มต้นของสิ่งที่คุณตั้งไว้ใน JavaScript คุณไม่สามารถตั้งค่าตัวแปรส่วนกลางใน JS และทำให้ค่านั้นคงอยู่หลังจากโหลดหน้าเว็บอีกครั้ง
มีสองวิธีที่คุณสามารถเก็บค่าไว้ที่อื่นเพื่อให้คุณสามารถเริ่มต้นเมื่อโหลดโดยใช้ JavaScript
สตริงการค้นหา
เมื่อส่งแบบฟอร์มโดยใช้GET
เมธอด url จะได้รับการอัปเดตด้วยสตริงการสืบค้น ( ?parameter=value&something=42
) คุณสามารถใช้สิ่งนี้ได้โดยตั้งค่าช่องป้อนข้อมูลในรูปแบบเป็นค่าที่แน่นอน นี่เป็นตัวอย่างที่ง่ายที่สุด:
<form method="GET">
<input type="hidden" name="clicked" value="true" />
<input type="submit" />
</form>
ในการโหลดครั้งแรกของหน้าจะไม่มีการตั้งค่าสตริงการสืบค้น เมื่อคุณส่งรูปแบบนี้name
และการรวมกันของการป้อนข้อมูลที่ถูกส่งผ่านในสตริงแบบสอบถามเป็นvalue
clicked=true
ดังนั้นเมื่อหน้าเว็บโหลดอีกครั้งด้วยสตริงการสืบค้นนั้นคุณสามารถตรวจสอบได้ว่ามีการคลิกปุ่มหรือไม่
หากต้องการอ่านข้อมูลนี้คุณสามารถใช้สคริปต์ต่อไปนี้ในการโหลดหน้า:
function getParameterByName(name) {
name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
results = regex.exec(location.search);
return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}
var clicked = getParameterByName('clicked');
( ที่มา )
ความสามารถในการใช้สิ่งนี้ขึ้นอยู่กับว่าแบบฟอร์มของคุณทำงานอย่างไรในปัจจุบันหากคุณใช้ POST อยู่แล้วอาจเป็นปัญหาได้
นอกจากนี้สำหรับชุดข้อมูลขนาดใหญ่จะมีค่าน้อยกว่าที่เหมาะสม การส่งผ่านสตริงไม่ใช่เรื่องใหญ่ แต่สำหรับอาร์เรย์และออบเจ็กต์ของข้อมูลคุณควรใช้ Web Storage หรือคุกกี้ แม้ว่ารายละเอียดจะแตกต่างกันเล็กน้อยในแต่ละเบราว์เซอร์ แต่ขีด จำกัด ของความยาว URI ในทางปฏิบัติคือประมาณ2,000 อักขระ
ที่เก็บข้อมูลบนเว็บ
ด้วยการแนะนำ HTML5 เรายังมี Web Storage ซึ่งช่วยให้คุณสามารถบันทึกข้อมูลในเบราว์เซอร์ในการโหลดหน้าเว็บ นอกจากนี้localStorage
ที่สามารถบันทึกข้อมูลเป็นระยะเวลานาน (ตราบเท่าที่ผู้ใช้ไม่ได้ด้วยตนเองล้างมัน) และsessionStorage
ซึ่งบันทึกข้อมูลเฉพาะในช่วงเซสชันการเรียกดูของคุณในปัจจุบัน ข้อนี้มีประโยชน์สำหรับคุณที่นี่เนื่องจากคุณไม่ต้องการให้ "คลิก" ตั้งค่าเป็นจริงเมื่อผู้ใช้กลับมาในภายหลัง
ที่นี่ฉันตั้งค่าที่เก็บข้อมูลในเหตุการณ์การคลิกปุ่ม แต่คุณสามารถผูกไว้กับแบบฟอร์มส่งหรืออย่างอื่นได้
$('input[type="submit"][value="Search"]').click(function() {
sessionStorage.setItem('clicked', 'true');
});
จากนั้นเมื่อคุณโหลดหน้าเว็บคุณสามารถตรวจสอบว่าได้ตั้งค่าไว้หรือไม่โดยใช้สิ่งนี้
var clicked = sessionStorage.getItem('clicked');
แม้ว่าค่านี้จะถูกบันทึกเฉพาะในช่วงการเรียกดูนี้ แต่คุณอาจต้องการรีเซ็ตก่อนหน้านี้ โดยใช้:
sessionStorage.removeItem('clicked');
หากคุณต้องการบันทึกออบเจ็กต์ JS หรืออาร์เรย์คุณควรแปลงเป็นสตริง ตามข้อกำหนดควรเป็นไปได้ที่จะบันทึกประเภทข้อมูลอื่น ๆ แต่ยังไม่สามารถใช้งานได้อย่างถูกต้องในเบราว์เซอร์
localStorage.setItem('myObject', JSON.stringify(myObject));
var myObject = JSON.parse(localStorage.getItem('myObject'));
การรองรับเบราว์เซอร์ค่อนข้างดีดังนั้นคุณควรใช้สิ่งนี้อย่างปลอดภัยเว้นแต่คุณจะต้องรองรับเบราว์เซอร์ที่เก่า / คลุมเครือจริงๆ Web Storage คืออนาคต
คุ้กกี้
อีกทางเลือกหนึ่งของ Web Storage คือการบันทึกข้อมูลในคุกกี้ คุกกี้ส่วนใหญ่สร้างขึ้นเพื่ออ่านข้อมูลฝั่งเซิร์ฟเวอร์ แต่สามารถใช้สำหรับข้อมูลฝั่งไคลเอ็นต์ได้เช่นกัน
คุณใช้ jQuery อยู่แล้วซึ่งทำให้การตั้งค่าคุกกี้ค่อนข้างง่าย อีกครั้งฉันใช้click
เหตุการณ์ที่นี่ แต่สามารถใช้ได้ทุกที่
$('input[type="submit"][value="Search"]').click(function() {
$.cookie('clicked', 'true', {expires: 1});
});
จากนั้นในการโหลดหน้าเว็บคุณสามารถอ่านคุกกี้ได้ดังนี้:
var clicked = $.cookie('clicked');
เนื่องจากคุกกี้ยังคงมีอยู่ในเซสชันในกรณีของคุณคุณจะต้องยกเลิกการตั้งค่าทันทีที่คุณทำสิ่งที่คุณต้องการทำกับมัน คุณคงไม่ต้องการให้ผู้ใช้กลับมาในวันต่อมาและยังคงclicked
ตั้งค่าเป็นจริง
if(clicked === "true") {
$.cookie('clicked', null);
}
(วิธีที่ไม่ใช่ jQuery ในการตั้งค่า / อ่านคุกกี้สามารถพบได้ที่นี่ )
โดยส่วนตัวแล้วฉันจะไม่ใช้คุกกี้เพื่ออะไรง่ายๆอย่างการจำสถานะที่ถูกคลิก แต่ถ้าสตริงการสืบค้นไม่ใช่ตัวเลือกและคุณต้องรองรับเบราว์เซอร์รุ่นเก่าที่ไม่รองรับ sessionStorage สิ่งนี้จะใช้ได้ คุณควรใช้สิ่งนั้นด้วยการตรวจสอบ sessionStorage ก่อนและเฉพาะในกรณีที่ล้มเหลวให้ใช้วิธีการคุกกี้
window.name
แม้ว่านี่จะดูเหมือนเป็นการแฮ็กสำหรับฉันที่อาจเกิดขึ้นก่อน localStorage / sessionStorage คุณสามารถจัดเก็บข้อมูลในwindow.name
คุณสมบัติ:
window.name = "my value"
สามารถจัดเก็บสตริงได้เท่านั้นดังนั้นหากคุณต้องการบันทึกอ็อบเจ็กต์คุณจะต้องสตริงมันเหมือนกับlocalStorage
ตัวอย่างด้านบน:
window.name = JSON.stringify({ clicked: true });
ความแตกต่างที่สำคัญคือข้อมูลนี้จะถูกเก็บรักษาไว้ไม่เพียง แต่การรีเฟรชหน้าเท่านั้น แต่ยังรวมถึงโดเมนต่างๆด้วย อย่างไรก็ตามมันถูก จำกัด ไว้เฉพาะแท็บปัจจุบันที่คุณอยู่
ซึ่งหมายความว่าคุณสามารถบันทึกข้อมูลบางอย่างในเพจของคุณได้และตราบเท่าที่ผู้ใช้ยังคงอยู่ในแท็บนั้นคุณจะสามารถเข้าถึงข้อมูลเดียวกันนั้นได้แม้ว่าเขาจะเรียกดูเว็บไซต์อื่นและย้อนกลับก็ตาม โดยทั่วไปฉันจะแนะนำให้ใช้สิ่งนี้เว้นแต่คุณจะต้องจัดเก็บข้อมูลข้ามโดเมนในระหว่างการเรียกดูครั้งเดียว