คอมพิวเตอร์ Windows อินเทอร์เน็ต

ที่เก็บข้อมูลในเครื่อง การใช้ localStorage สำหรับ JavaScript ต้องใช้ที่เก็บข้อมูลในเครื่องของคุกกี้

คุกกี้ที่เราวิเคราะห์ในบทเรียนก่อนหน้านี้มีข้อจำกัดมาก: ในหนึ่งคุกกี้สามารถมีอักขระได้เพียง 4096 ตัว และจำนวนคุกกี้ต่อโดเมนสามารถมีได้ประมาณ 30-50 ตัวขึ้นอยู่กับเบราว์เซอร์ ดังนั้นอนิจจาจะไม่สามารถเก็บข้อมูลจำนวนมากไว้ที่นั่นได้ มันจึงเกิดขึ้นในอดีต

เพื่อหลีกเลี่ยงข้อจำกัดนี้ มีทางเลือกอื่นสำหรับคุกกี้ปรากฏในเบราว์เซอร์ ซึ่งเรียกว่าที่เก็บข้อมูลในเครื่อง ในที่จัดเก็บในตัวเครื่อง เราสามารถจัดเก็บข้อมูลได้ 5-10 เมกะไบต์หรือมากกว่านั้นเป็นเวลานาน

การทำงานกับที่เก็บข้อมูลในเครื่อง

ออบเจ็กต์ localStorage ที่สร้างขึ้นในเบราว์เซอร์มีไว้สำหรับทำงานกับที่จัดเก็บในตัวเครื่อง มี 4 วิธีที่เข้าใจง่าย นี่คือ:

// เก็บค่า: localStorage.setItem ("Key", "Value"); // รับค่า: ค่า var = localStorage.getItem ("คีย์"); // การลบค่า: localStorage.removeItem ("คีย์"); // ล้างที่เก็บข้อมูลทั้งหมด: localStorage.clear ();

กับ localStorageคุณยังสามารถทำงานเหมือนอาร์เรย์ปกติได้:

// เก็บค่า: localStorage ["Key"] = "Value"; // รับค่า: ค่า var = localStorage ["Key"]; // ลบค่า: ลบ localStorage ["Key"];

นอกจากวัตถุ localStorageนอกจากนี้ยังมีวัตถุ sessionStorage... การทำงานกับมันดำเนินการในลักษณะเดียวกัน ข้อแตกต่างเพียงอย่างเดียวคือข้อมูลทั้งหมดจากมันถูกทำลายโดยอัตโนมัติหลังจากปิดเบราว์เซอร์หรือแท็บที่มีไซต์ localStorage เก็บข้อมูลไว้เป็นเวลานานจนกว่าข้อมูลนี้จะถูกลบโดยสคริปต์ หรือผู้ใช้เบราว์เซอร์จะล้างที่เก็บข้อมูลในเครื่องโดยใช้การตั้งค่า

ตัวอย่างของ

ในตัวอย่างต่อไปนี้ เราจะเขียนชื่อผู้ใช้ไปยังที่จัดเก็บในตัวเครื่อง:

LocalStorage.setItem ("ชื่อ", "อีวาน");

สักพักเราจะได้ชื่อนี้กลับมา:

การแจ้งเตือน (localStorage.getItem ("ชื่อ"));

อย่างที่คุณเห็น ไม่มีอะไรซับซ้อนที่นี่ ทุกอย่างง่ายกว่าการทำงานเดียวกันกับคุกกี้มาก

กำลังบันทึกวัตถุ

ที่จัดเก็บในเครื่องไม่สามารถจัดเก็บวัตถุและอาร์เรย์ JavaScript ได้ แม้ว่าวิธีนี้มักจะสะดวก แต่มีวิธีหนึ่ง - คุณต้องทำให้ข้อมูลนี้เป็นอนุกรมในรูปแบบ JSON - คุณได้รับสตริงที่สามารถเก็บไว้ใน localStorage ได้แล้ว จากนั้น เมื่อเราต้องการรับวัตถุนี้กลับ - แปลงสตริงจาก JSON กลับเป็นวัตถุ - และใช้อย่างใจเย็น

ลองดูกระบวนการนี้พร้อมตัวอย่าง ทำให้วัตถุเป็นอนุกรมและบันทึกลงในที่จัดเก็บในตัวเครื่อง:

// กำหนดวัตถุ: var obj = (ชื่อ: "Ivan", arr :); // ทำให้เป็นอนุกรมเป็น "(" ชื่อ ":" Ivan "," arr ":)": var json = JSON.stringify (obj); // เขียนไปยัง localStorage ด้วยคีย์ obj: localStorage.setItem ("obj", json);

หลังจากนั้นไม่นาน เราก็ได้วัตถุกลับมา:

// รับข้อมูลคืนจาก localStorage เป็น JSON: var json = localStorage.getItem ("obj"); // แปลงกลับเป็นวัตถุ JavaScript: var obj = JSON.parse (json); console.log (obj);

คุณลักษณะเพิ่มเติม

การกำหนดจำนวนเร็กคอร์ดในการจัดเก็บ: alert (localStorage.length)

การกำหนดชื่อคีย์ตามหมายเลข: alert (localStorage.key (number))

เมื่อดำเนินการกับที่เก็บข้อมูล เหตุการณ์จะถูกทริกเกอร์ การจัดเก็บ... หากคุณผูกฟังก์ชันกับเหตุการณ์นี้ อ็อบเจ็กต์ Event ที่มีคุณสมบัติต่อไปนี้จะพร้อมใช้งาน:

ฟังก์ชั่น func (เหตุการณ์) (var key = event.key; // คีย์ของข้อมูลที่เปลี่ยนแปลง var oldValue = event.oldValue; // ค่าเก่า var newValue = event.newValue; // ค่าใหม่ var storageArea = event.storageArea; // พื้นที่จัดเก็บ )

เพิ่ม. วัสดุ

การจัดเก็บอาร์เรย์ในที่จัดเก็บในตัวเครื่อง: https://youtu.be/sYUILPMnrIo

จะทำอย่างไรต่อไป:

เริ่มแก้ปัญหาได้ที่ลิงค์ต่อไปนี้ งานสำหรับบทเรียน

เมื่อคุณได้ตัดสินใจทุกอย่างแล้ว ให้ไปศึกษาหัวข้อใหม่

วิดีโอบางรายการอาจกำลังดำเนินการอยู่ เนื่องจากเรายังไม่ได้ดำเนินการผ่าน ES6 ทั้งหมดมายังสถานที่นี้ในบทช่วยสอน เพียงข้ามวิดีโอเหล่านี้ ดูในภายหลัง

ภาพรวมการจัดเก็บเว็บ

บนอินเทอร์เน็ต ข้อมูลสามารถจัดเก็บได้สองแห่ง: บนเว็บเซิร์ฟเวอร์และบนเว็บไคลเอ็นต์ (เช่น คอมพิวเตอร์ของผู้เยี่ยมชมเพจ) เป็นการดีที่สุดที่จะจัดเก็บข้อมูลบางประเภทไว้ในที่ใดที่หนึ่งและประเภทอื่นๆ

ที่ที่เหมาะสมในการจัดเก็บข้อมูลที่สำคัญและละเอียดอ่อนคือเว็บเซิร์ฟเวอร์ ตัวอย่างเช่น หากคุณเพิ่มสินค้าลงในตะกร้าสินค้าของคุณในร้านค้าออนไลน์ ข้อมูลการซื้อที่เป็นไปได้ของคุณจะถูกจัดเก็บไว้บนเว็บเซิร์ฟเวอร์ ข้อมูลการติดตามเพียงไม่กี่ไบต์จะถูกเก็บไว้ในคอมพิวเตอร์ของคุณ โดยมีข้อมูลเกี่ยวกับคุณ (หรือเกี่ยวกับคอมพิวเตอร์ของคุณ) เพื่อให้เว็บเซิร์ฟเวอร์รู้ว่าที่เก็บข้อมูลใดเป็นของคุณ แม้จะมีความสามารถใหม่ของ HTML5 ก็ตาม ไม่จำเป็นต้องเปลี่ยนระบบนี้ เนื่องจากเป็นระบบที่น่าเชื่อถือ ปลอดภัย และมีประสิทธิภาพ

แต่การจัดเก็บข้อมูลบนเซิร์ฟเวอร์ไม่ใช่วิธีที่ดีที่สุดเสมอไป บางครั้งการจัดเก็บข้อมูลที่ไม่จำเป็นบนคอมพิวเตอร์ของผู้ใช้ทำได้ง่ายกว่า ตัวอย่างเช่น การเก็บค่ากำหนดของผู้ใช้ (เช่น การตั้งค่าที่กำหนดวิธีแสดงหน้าเว็บ) และสถานะของแอปพลิเคชัน (ภาพรวมของสถานะปัจจุบันของแอปพลิเคชันเว็บ) นั้นสมเหตุสมผลแล้วในเครื่อง เพื่อให้ผู้เยี่ยมชมสามารถดำเนินการต่อจากตำแหน่งที่เคยเป็นได้ในภายหลัง เวลา.

ก่อน HTML5 วิธีเดียวในการจัดเก็บข้อมูลในเครื่องคือการใช้กลไกไฟล์ คุ้กกี้ซึ่งเดิมออกแบบมาเพื่อแลกเปลี่ยนข้อมูลระบุตัวตนจำนวนเล็กน้อยระหว่างเว็บเซิร์ฟเวอร์และเบราว์เซอร์ คุกกี้เหมาะสำหรับการจัดเก็บข้อมูลจำนวนเล็กน้อย แต่โมเดล JavaScript สำหรับการทำงานกับพวกมันนั้นค่อนข้างจะเกะกะ ระบบคุกกี้ยังบังคับให้นักพัฒนาซอฟต์แวร์ต้องเล่นซอกับวันหมดอายุและส่งข้อมูลไปมาทางอินเทอร์เน็ตอย่างไร้ประโยชน์เมื่อมีการร้องขอทุกหน้า

HTML5 นำเสนอทางเลือกที่ดีกว่าคุกกี้ ซึ่งทำให้ง่ายต่อการจัดเก็บข้อมูลบนคอมพิวเตอร์ของผู้เยี่ยมชม ข้อมูลนี้สามารถเก็บไว้ในคอมพิวเตอร์ไคลเอนต์ได้ไม่จำกัด ไม่ถูกส่งไปยังเว็บเซิร์ฟเวอร์ (เว้นแต่นักพัฒนาจะทำเอง) ข้อมูลดังกล่าวอาจมีขนาดใหญ่และต้องการเพียงสองออบเจ็กต์ JavaScript ที่เรียบง่ายและมีประสิทธิภาพในการทำงานด้วย

โอกาสนี้เรียกว่า ที่เก็บข้อมูลเว็บและเหมาะอย่างยิ่งสำหรับการใช้งานกับ โหมดออฟไลน์ผลงานของเว็บไซต์เพราะ ช่วยให้คุณสร้างแอปพลิเคชันแบบสแตนด์อโลนที่มีอยู่ในตัวเองซึ่งสามารถบันทึกข้อมูลทั้งหมดที่ต้องการได้แม้ในขณะที่ไม่มีการเชื่อมต่ออินเทอร์เน็ต

ฟังก์ชันการจัดเก็บเว็บ HTML5 ช่วยให้หน้าเว็บสามารถจัดเก็บข้อมูลบนคอมพิวเตอร์ของผู้เยี่ยมชมได้ ข้อมูลนี้อาจเป็นข้อมูลระยะสั้น ซึ่งจะถูกลบออกหลังจากปิดเบราว์เซอร์ หรือข้อมูลระยะยาว ซึ่งยังคงมีอยู่ในการเยี่ยมชมหน้าเว็บครั้งต่อๆ ไป

ข้อมูลที่จัดเก็บในที่จัดเก็บบนเว็บไม่ได้ถูกจัดเก็บไว้บนอินเทอร์เน็ต แต่อยู่ในคอมพิวเตอร์ของผู้เยี่ยมชมหน้าเว็บ กล่าวอีกนัยหนึ่ง ที่เก็บข้อมูลบนเว็บไม่ได้หมายถึงการจัดเก็บข้อมูลบนอินเทอร์เน็ต แต่เป็นการจัดเก็บข้อมูลจากอินเทอร์เน็ต

ที่เก็บข้อมูลบนเว็บมีสองประเภทที่เกี่ยวข้องกับสองอ็อบเจ็กต์:

ที่เก็บข้อมูลในเครื่อง

ใช้วัตถุ localStorageเพื่อจัดเก็บข้อมูลสำหรับทั้งเว็บไซต์อย่างถาวร ซึ่งหมายความว่าหากหน้าเว็บบันทึกข้อมูลลงในที่จัดเก็บในตัวเครื่อง ข้อมูลนั้นจะพร้อมใช้งานสำหรับผู้ใช้เมื่อพวกเขากลับมาที่หน้าเว็บนั้นในวันถัดไป สัปดาห์หน้า หรือปีหน้า

แน่นอน เบราว์เซอร์ส่วนใหญ่ยังให้ตัวเลือกแก่ผู้ใช้ในการล้างที่เก็บข้อมูลในเครื่อง ในบางเบราว์เซอร์ มีการใช้งานเป็นกลยุทธ์ทั้งหมดหรือไม่มีเลย และจะลบข้อมูลในเครื่องทั้งหมด เหมือนกับการลบคุกกี้ (อันที่จริงแล้ว ในบางเบราว์เซอร์ คุกกี้และที่เก็บข้อมูลในเครื่องจะเชื่อมต่อถึงกัน ดังนั้นวิธีเดียวที่จะลบข้อมูลในเครื่องคือลบคุกกี้) เบราว์เซอร์อื่นๆ สามารถให้ผู้ใช้สามารถดูข้อมูลสำหรับแต่ละเว็บไซต์และลบข้อมูลสำหรับ ไซต์หรือไซต์ที่เลือก

ที่เก็บข้อมูลเซสชัน

ใช้วัตถุ sessionStorageเพื่อจัดเก็บข้อมูลชั่วคราวสำหรับหน้าต่างเบราว์เซอร์หรือแท็บเดียว ข้อมูลนี้จะใช้ได้จนกว่าผู้ใช้จะปิดหน้าต่างหรือแท็บ หลังจากนั้นเซสชันจะสิ้นสุดลงและข้อมูลจะถูกลบออก แต่ข้อมูลเซสชันจะยังคงอยู่หากผู้ใช้นำทางไปยังเว็บไซต์อื่นแล้วย้อนกลับกลับมา โดยมีเงื่อนไขว่าสิ่งนี้จะเกิดขึ้นในหน้าต่างเบราว์เซอร์เดียวกัน

จากมุมมองของโค้ดหน้าเว็บ ทั้งที่จัดเก็บในตัวเครื่องและที่เก็บข้อมูลเซสชันทำงานเหมือนกันทุกประการ ข้อแตกต่างเพียงอย่างเดียวคือระยะเวลาในการจัดเก็บข้อมูล

การใช้ที่จัดเก็บในตัวเครื่องให้ โอกาสที่ดีที่สุดเพื่อบันทึกข้อมูลที่จำเป็นสำหรับการเยี่ยมชมเว็บไซต์ในภายหลังโดยผู้ใช้ และที่เก็บเซสชั่นใช้เพื่อจัดเก็บข้อมูลที่ต้องถ่ายโอนจากหน้าหนึ่งไปยังอีกหน้าหนึ่ง (ที่เก็บเซสชันยังสามารถจัดเก็บข้อมูลชั่วคราวที่ใช้โดยหน้าเดียวเท่านั้น แต่ตัวแปร JavaScript ปกติทำงานได้ดีสำหรับจุดประสงค์นี้)

ทั้งที่จัดเก็บในตัวเครื่องและที่จัดเก็บเซสชันเชื่อมโยงกับโดเมนเว็บไซต์ ดังนั้น หากคุณบันทึกข้อมูลสำหรับหน้า www..html ในที่จัดเก็บในตัวเครื่อง ข้อมูลนี้จะพร้อมใช้งานสำหรับหน้า www..html เนื่องจาก ทั้งสองหน้านี้มีโดเมนเดียวกัน แต่ข้อมูลนี้จะไม่สามารถใช้ได้สำหรับหน้าของโดเมนอื่น

นอกจากนี้ตั้งแต่ ที่เก็บข้อมูลเว็บอยู่ในคอมพิวเตอร์ของคุณ (หรือ อุปกรณ์โทรศัพท์) ผู้ใช้ที่ได้รับมันเชื่อมโยงกับคอมพิวเตอร์เครื่องนี้และหน้าเว็บที่เปิดขึ้น คอมพิวเตอร์เครื่องนี้และการจัดเก็บข้อมูลในที่จัดเก็บในตัวเครื่องจะไม่สามารถเข้าถึงข้อมูลที่จัดเก็บไว้ในคอมพิวเตอร์เครื่องอื่นได้ ในทำนองเดียวกัน หน้าเว็บจะสร้างร้านค้าในพื้นที่แยกต่างหากหากคุณเข้าสู่ระบบด้วยชื่อผู้ใช้อื่นหรือเปิดเบราว์เซอร์อื่น

แม้ว่าข้อกำหนด HTML5 จะไม่ได้กำหนดกฎเกณฑ์ที่เข้มงวดและรวดเร็วสำหรับพื้นที่เก็บข้อมูลสูงสุด แต่เบราว์เซอร์ส่วนใหญ่จะจำกัดไว้ที่ 5MB คุณสามารถแพ็คข้อมูลจำนวนมากลงในโวลุ่มนี้ได้ แต่จะไม่เพียงพอหากคุณต้องการใช้ที่จัดเก็บในตัวเครื่องเพื่อเพิ่มประสิทธิภาพและแคชรูปภาพหรือวิดีโอขนาดใหญ่ในนั้น (และที่จริงแล้วที่จัดเก็บในเครื่องไม่ได้ออกแบบมาเพื่อวัตถุประสงค์ดังกล่าว ).

มาตรฐานฐานข้อมูลที่พัฒนาอย่างต่อเนื่องสำหรับการจัดเก็บข้อมูลจำนวนมาก จัดทำดัชนีDBอนุญาตให้มีการจัดเก็บในเครื่องมากขึ้น - โดยทั่วไปแล้วจะเริ่มต้น 50 MB และมากกว่านั้นหากผู้ใช้ตกลง

กำลังบันทึกข้อมูล

ก่อนที่จะใส่ข้อมูลบางส่วนลงในที่จัดเก็บในตัวเครื่องหรือเซสชัน จะต้องระบุชื่อที่สื่อความหมาย ชื่อนี้เรียกว่าคีย์และจำเป็นเพื่อให้สามารถดึงข้อมูลได้ในอนาคต

ไวยากรณ์สำหรับการบันทึกข้อมูลเป็นดังนี้:

localStorage = ข้อมูล;

// JS localStorage ["ชื่อผู้ใช้"] = "อีวาน เปตรอฟ";

แน่นอน มันไม่สมเหตุสมผลเลยที่จะบันทึกข้อความคงที่ ตามกฎแล้ว เราจำเป็นต้องบันทึกข้อมูลตัวแปรบางประเภท เช่น วันที่ปัจจุบัน ผลลัพธ์ของการคำนวณทางคณิตศาสตร์ หรือข้อมูลข้อความที่ผู้ใช้ป้อนลงในช่องแบบฟอร์ม ต่อไปนี้คือตัวอย่างการจัดเก็บข้อมูลข้อความที่ผู้ใช้ป้อน:

ที่เก็บข้อมูลเว็บ

ฟังก์ชั่น saveData () (// รับค่าของกล่องข้อความ var localData = document.getElementById ("localData") ค่า; var sessionData = document.getElementById ("sessionData") ค่า; // บันทึกข้อความที่ป้อน ในกล่องข้อความลงในที่จัดเก็บในตัวเครื่อง localStorage ["localData"] = localData; // บันทึกข้อความที่ป้อนลงในช่องข้อความไปยังพื้นที่จัดเก็บเซสชัน sessionStorage ["sessionData"] = sessionData;) ฟังก์ชัน loadData () (// โหลดข้อมูลที่บันทึกไว้ ข้อมูลจากที่เก็บข้อมูล var localData = localStorage ["localData"]; var sessionData = sessionStorage ["sessionData"]; // แสดงข้อมูลนี้ในช่องข้อความหาก (localData! = null) (document.getElementById ("localData") ค่า = localData;) ถ้า (sessionData! = null) (document.getElementById ("sessionData") ค่า = sessionData;))

หน้านี้มีกล่องข้อความสองกล่อง: สำหรับการจัดเก็บในเครื่อง (ด้านบน) และสำหรับการจัดเก็บเซสชัน (ด้านล่าง) การคลิกปุ่มบันทึกจะบันทึกข้อความที่ป้อนในช่องข้อความ และคลิกปุ่มโหลดจะแสดงข้อมูลที่บันทึกไว้ที่เกี่ยวข้องในฟิลด์

Web Storage ยังสนับสนุนไวยากรณ์ของคุณสมบัติทั่วไปที่น้อยกว่าอีกด้วย ตามกฎของไวยากรณ์นี้ เราอ้างถึงตำแหน่งการจัดเก็บที่ชื่อ username เป็น localStorage.username ไม่ใช่ localStorage ["ชื่อผู้ใช้"] ไวยากรณ์ทั้งสองประเภทมีค่าเท่ากัน และการใช้อย่างใดอย่างหนึ่งเป็นเรื่องของความชอบส่วนบุคคล

ที่เก็บข้อมูลเว็บไม่ทำงานหากไม่มีเว็บเซิร์ฟเวอร์

ในการค้นคว้าเกี่ยวกับที่จัดเก็บข้อมูลบนเว็บ คุณอาจพบปัญหาที่ไม่คาดคิด ในเบราว์เซอร์จำนวนมาก พื้นที่จัดเก็บเว็บใช้งานได้เฉพาะกับหน้าเว็บที่เว็บเซิร์ฟเวอร์ให้มาเท่านั้น ในกรณีนี้ไม่ว่าเซิร์ฟเวอร์จะอยู่ที่ใด บนอินเทอร์เน็ตหรือบนคอมพิวเตอร์ของคุณเอง สิ่งที่สำคัญที่สุดคือหน้าเว็บนั้นไม่ได้เปิดจากเครื่องในเครื่อง ฮาร์ดดิสก์(ตัวอย่างเช่น, ดับเบิลคลิกโดยไอคอนไฟล์หน้า)

คุณลักษณะนี้เป็นผลข้างเคียงของวิธีที่เบราว์เซอร์จัดสรรพื้นที่จัดเก็บในตัวเครื่อง ตามที่ระบุไว้ก่อนหน้านี้ เบราว์เซอร์จำกัดพื้นที่จัดเก็บในเครื่องสำหรับแต่ละเว็บไซต์ไว้ที่ 5MB โดยเชื่อมโยงแต่ละหน้าที่ต้องการใช้ที่จัดเก็บในตัวเครื่องกับโดเมนของเว็บไซต์

จะเกิดอะไรขึ้นเมื่อคุณเปิดเพจที่ใช้ที่เก็บข้อมูลเว็บจากฮาร์ดไดรฟ์ในเครื่องของคุณ ทุกอย่างขึ้นอยู่กับเบราว์เซอร์ เบราว์เซอร์ Internet Explorerดูเหมือนว่าจะสูญเสียการสนับสนุนที่เก็บข้อมูลบนเว็บโดยสิ้นเชิง ออบเจ็กต์ localStorage และ sessionStorage หายไป และพยายามใช้วัตถุดังกล่าวทำให้เกิดข้อผิดพลาด JavaScript

ในเบราว์เซอร์ Firefox ออบเจ็กต์ localStorage และ sessionStorage ยังคงอยู่และดูเหมือนว่าจะได้รับการสนับสนุน (แม้แต่ Modernizr ก็ตรวจพบว่าได้รับการสนับสนุน) แต่ทุกอย่างที่ส่งไปยังที่จัดเก็บจะหายไปโดยไม่มีใครรู้ว่าที่ไหน วี เบราว์เซอร์ Chromeอีกครั้ง มีบางอย่างที่แตกต่างออกไป - ฟังก์ชันส่วนใหญ่ของที่เก็บข้อมูลบนเว็บทำงานได้ตามที่ควรจะเป็น แต่คุณลักษณะบางอย่าง (เช่น เหตุการณ์ onStorage) ไม่ทำงาน

ปัญหาที่คล้ายกันนี้เกิดขึ้นกับ File API ดังนั้น คุณจะช่วยตัวเองให้ยุ่งยากได้มาก หากคุณทดสอบหน้าเว็บบนเซิร์ฟเวอร์ทดสอบเพื่อหลีกเลี่ยงความคลุมเครือเหล่านี้

รองรับการจัดเก็บข้อมูลบนเว็บโดยเบราว์เซอร์

Web Storage เป็นหนึ่งในคุณสมบัติที่ได้รับการสนับสนุนมากที่สุดของ HTML5 พร้อมการสนับสนุนที่ดีในทุกเบราว์เซอร์หลัก ตารางด้านล่างแสดงเวอร์ชันขั้นต่ำของเบราว์เซอร์หลักที่รองรับการจัดเก็บเว็บ:

เบราว์เซอร์ทั้งหมดเหล่านี้มีความสามารถในการจัดเก็บข้อมูลในเครื่องและเซสชัน แต่เพื่อรองรับเหตุการณ์ onStorage จำเป็นต้องใช้เบราว์เซอร์เวอร์ชันใหม่กว่า เช่น IE 9, Firefox 4 หรือ Chrome 6

ปัญหามากที่สุดคือ IE 7 ซึ่งไม่รองรับที่เก็บข้อมูลบนเว็บเลย คุณสามารถจำลองพื้นที่เก็บข้อมูลเว็บโดยใช้คุกกี้เพื่อแก้ปัญหาชั่วคราว นี่ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์แบบจริงๆ แต่ใช้งานได้ แม้ว่าจะไม่มีสคริปต์อย่างเป็นทางการในการปิดช่องว่างนี้ แต่คุณสามารถพบจุดเริ่มต้นที่ดีได้ในหน้า HTML5 Cross Browser (ภายใต้ "ที่เก็บข้อมูลเว็บ")

การแปลบทความ: วิธีใช้ที่จัดเก็บในเครื่องสำหรับ JavaScript
ซาร่า วิเอร่า.

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

มีวิธีที่ง่ายมากในการออกจากสถานการณ์นี้โดยใช้กลไก localStorage เนื่องจาก localStorage ช่วยให้เราสามารถจัดเก็บข้อมูลที่จำเป็นบนคอมพิวเตอร์ของผู้ใช้ รายการงานและเหตุการณ์ตามกำหนดเวลาด้านบนจะยังคงมีอยู่หลังจากโหลดหน้าซ้ำ นอกจากนี้ localStorage ยังเป็นวิธีการจัดเก็บข้อมูลและการเข้าถึงที่ง่ายมากอย่างน่าประหลาดใจ เมื่อจำเป็น

localStorage คืออะไร?

เป็นเอ็นจิ้นการจัดเก็บข้อมูลในเครื่องที่เป็นส่วนหนึ่งของเทคโนโลยี Web Storage ตามที่กำหนดโดยข้อกำหนด HTML5 มีตัวเลือกการจัดเก็บสองตัวเลือกตามข้อกำหนดนี้:

  • ที่เก็บข้อมูลในเครื่อง:ให้คุณบันทึกข้อมูลได้โดยไม่มีข้อจำกัดเรื่องระยะเวลาในการจัดเก็บ เราจะใช้ตัวเลือกนี้ เนื่องจากรายการงานที่มีอยู่ในตัวอย่างของเราควรถูกเก็บไว้อย่างถาวร
  • การใช้เซสชัน:รับรองความปลอดภัยของข้อมูลในช่วงเวลาหนึ่งเซสชันเท่านั้น นั่นคือ หลังจากที่ผู้ใช้ปิดแท็บของแอปพลิเคชันของเราและเปิดใหม่อีกครั้ง ทุกสิ่งที่จำเป็นสำหรับ ทำงานต่อไปข้อมูลการสมัครจะถูกลบ

พูดง่ายๆ ก็คือ ทุกอย่างที่ Web Storage ทำคือจัดเก็บข้อมูลในรูปแบบ ชื่อคีย์ / ค่าในท้องถิ่นและแตกต่างจากอีกสองวิธีซึ่งแต่ละวิธีมีข้อเสีย ( การจัดเก็บข้อมูลเซสชันจัดให้มีการใช้ฝั่งเซิร์ฟเวอร์สำหรับสิ่งนี้ นอกจากนี้ หลังจากปิดเซสชันของผู้ใช้แล้ว ข้อมูลนี้จะถูกลบออก และแม้ว่าคุกกี้จะถูกใช้สำหรับการจัดเก็บในฝั่งไคลเอ็นต์ แต่ก็ไม่น่าเชื่อถือเพราะผู้ใช้สามารถยกเลิกการสนับสนุนผ่าน การตั้งค่าเบราว์เซอร์) บันทึกข้อมูลแม้ว่าคุณจะปิดเบราว์เซอร์หรือปิดคอมพิวเตอร์ ( * ฉันใช้เสรีภาพในการเปลี่ยนแปลงเล็กน้อยและเสริมเนื้อหาของย่อหน้านี้ เนื่องจากฉันเชื่อว่าผู้เขียนได้ทำความไม่ถูกต้องบางอย่างในต้นฉบับ)

Html

ถ้าเรายึดติดกับตัวอย่างของเราซึ่งเราต้องการสร้างเวอร์ชันอิเล็กทรอนิกส์ สมุดบันทึกส่วนประกอบที่จำเป็นทั้งหมดสำหรับการนำไปใช้จะถูกนำเสนอด้านล่าง:

  • ช่องสำหรับป้อนบันทึกใหม่ (เหตุการณ์ กรณี ฯลฯ)
  • ปุ่มยืนยันการป้อนข้อมูล
  • ปุ่มสำหรับล้างรายการสิ่งที่ต้องทำที่สร้างไว้แล้ว
  • รายการที่ไม่เรียงลำดับซึ่งจะถูกเติมด้วยรายการใหม่
  • สุดท้าย เราจำเป็นต้องมี div เป็นคอนเทนเนอร์เพื่อบรรจุข้อความที่จะแสดงต่อผู้ใช้ เช่น คำเตือนว่าเขาลืมป้อนค่าสำหรับระเบียนถัดไป โดยปล่อยให้ช่องป้อนข้อมูลว่างเปล่า

ด้วยเหตุนี้ มาร์กอัปของเราจึงควรมีลักษณะดังนี้:








นี่เป็นเทมเพลต HTML มาตรฐานที่เราเติมด้วยเนื้อหาที่สร้างขึ้นแบบไดนามิกโดยใช้ JavaScript

JavaScript

เกี่ยวกับโครงสร้างของแอปพลิเคชั่นแผ่นจดบันทึกที่ง่ายที่สุดในตัวอย่างของเรา สิ่งแรกที่เราต้องทำคือต้องแน่ใจว่ามีการติดตามเหตุการณ์การคลิกปุ่ม "เพิ่มบันทึก"และตรวจสอบว่ามีการป้อนข้อมูลใด ๆ ลงในช่องข้อความสำหรับบันทึกหรือไม่ นั่นคือในขณะที่กดปุ่มนั้นไม่ควรว่างเปล่า บางอย่างเช่นนี้:

$ ("# เพิ่ม") คลิก (ฟังก์ชัน () (
// ถ้าช่องข้อความว่าง
$ ("# การแจ้งเตือน") html (" ความสนใจ!ป้อนรายการในข้อความ
สนาม.");
คืนค่าเท็จ;
}

นี่คือสิ่งที่เราทำกับโค้ดชิ้นนี้ เมื่อกดปุ่ม "เพิ่มบันทึก"เราตรวจสอบว่าผู้ใช้ได้ป้อนข้อมูลใด ๆ ในฟิลด์สำหรับบันทึกใหม่หรือไม่ หากเขาไม่ได้ทำสิ่งนี้ div ที่เราให้ไว้สำหรับแสดงข้อความจะปรากฏขึ้นโดยแจ้งผู้ใช้ว่าช่องป้อนข้อมูลของเรคคอร์ดไม่ได้ถูกกรอก จากนั้นหลังจาก 1,000 มิลลิวินาที (1 วินาที) องค์ประกอบ div และตามข้อความ หายไป จากนั้นฟังก์ชันจะคืนค่า false หลังจากที่เบราว์เซอร์หยุดดำเนินการส่วนที่เหลือของสคริปต์ และแอปพลิเคชันก็พร้อมที่จะป้อนระเบียนใหม่อีกครั้ง

ขั้นตอนต่อไปของเราคือการเพิ่มค่าที่ป้อนลงในฟิลด์เรกคอร์ดที่จุดเริ่มต้นของรายการโดยการสร้างรายการใหม่ ดังนั้น เมื่อผู้ใช้เพิ่มรายการอื่น รายการนั้นจะถูกวางไว้ที่จุดเริ่มต้นของรายการสิ่งที่ต้องทำและเหตุการณ์ที่คาดไว้เสมอ หลังจากนั้น สิ่งที่เราต้องทำคือบันทึกรายการโดยใช้กลไก localStorage:

// เพิ่มรายการลงในรายการที่มีอยู่
$ ("# todos") นำหน้า ("

  • "+ คำอธิบาย +"
  • ");
    // ล้างช่องใส่ข้อมูล
    $ ("# form") รีเซ็ต ();

    คืนค่าเท็จ;
    });

    อย่างที่คุณอาจสังเกตเห็น ไม่มีอะไรผิดปกติที่นี่ มันถูกใช้ รุ่นมาตรฐานรหัส jQuery ที่จุดเข้าถึงวัตถุ localStorage เราต้องระบุข้อมูลที่เรากำลังบันทึกในรูปแบบของคีย์ / ค่า สามารถใช้ชื่อใดก็ได้สำหรับคีย์ และฉันตั้งชื่อมันว่า "สิ่งที่ต้องทำ"จากนั้นเราต้องระบุสิ่งที่เราจำเป็นต้องเก็บไว้ในความทรงจำจริงๆ ในกรณีนี้ เป็นมาร์กอัป HTML ที่สมบูรณ์ ซึ่งรวมอยู่ในรายการแบบไม่เรียงลำดับ (อยู่ระหว่างแท็ก) ซึ่งแสดงรายการทั้งหมดที่ผู้ใช้ป้อนก่อนหน้านี้ จากโค้ด คุณจะเห็นว่าเราเพียงแค่ดึงแฟรกเมนต์ที่เราต้องการโดยใช้เมธอด jQuery .html () และในตอนท้าย หลังจากดำเนินการที่จำเป็นทั้งหมดเสร็จแล้ว เราจะตั้งค่าส่งคืนของฟังก์ชันเป็น false ซึ่งป้องกันฟอร์ม ข้อมูลจากการถูกส่งและดังนั้นการโหลดหน้าของเรา

    ในตอนนี้ สมมติว่าผู้ใช้ของเราได้ทำรายการหลายรายการก่อนหน้านี้ และสำหรับการทำงานปกติของแอปพลิเคชันต่อไป เราจำเป็นต้องตรวจสอบว่ามีข้อมูลที่เก็บไว้ในคอมพิวเตอร์ใน localStorage หรือไม่ และหากมี ให้แสดงข้อมูลดังกล่าวให้ผู้ใช้ทราบ เนื่องจากชื่อคีย์ของเราคือ "todos" เราจึงต้องตรวจสอบการมีอยู่ของคีย์ดังนี้:

    // หากมีข้อมูลในที่จัดเก็บในตัวเครื่องอยู่แล้ว ให้แสดง

    }

    ในการตรวจสอบการมีอยู่ของข้อมูล เราใช้คำสั่ง if ตามปกติ และเมื่อตรงตามเงื่อนไขที่ระบุ เราก็ดึงข้อมูลทั้งหมดจากที่จัดเก็บในเครื่อง โดยวางไว้เป็นมาร์กอัป HTML ในรายการที่ไม่เรียงลำดับ โดยช่วยให้ บันทึกที่ผู้ใช้ป้อนก่อนหน้านี้จะปรากฏขึ้น

    หากคุณทดสอบแอปพลิเคชันที่ง่ายที่สุด คุณจะพบว่าหลังจากโหลดหน้านี้ใหม่แล้ว ทุกอย่างจะยังคงอยู่ และตอนนี้ สิ่งสุดท้ายที่เราต้องทำคือสร้างฟังก์ชันที่ผู้ใช้หากจำเป็น สามารถลบบันทึกทั้งหมดของเขาได้ ซึ่งทำได้โดยการล้าง localStorage และโหลดหน้าซ้ำเพื่อเปิดใช้งานการเปลี่ยนแปลงที่ทำ ต่อไป ในกรณีก่อนหน้านี้ เราตั้งค่า false เป็นค่าส่งคืนของฟังก์ชัน ซึ่งป้องกันไม่ให้แฮชปรากฏใน URL ( * และไม่เลื่อนหน้าขึ้น):

    // การล้างข้อมูล localStorage แบบเต็ม
    window.localStorage.clear ();
    location.reload ();
    คืนค่าเท็จ;
    });

    ส่งผลให้เรามีแอพพลิเคชั่นที่ทำงานได้อย่างสมบูรณ์ และเมื่อรวมข้อมูลโค้ดด้านบนทั้งหมดเข้าด้วยกัน เราก็จะได้โค้ดแอปพลิเคชันที่สมบูรณ์:

    $ ("# เพิ่ม") คลิก (ฟังก์ชัน () (
    var Description = $ ("# คำอธิบาย") val ();
    ถ้า ($ ("# คำอธิบาย") val () == "") (
    $ ("# การแจ้งเตือน") html (" ความสนใจ!ป้อนรายการใน
    ช่องข้อความ.");
    $ ("# alert") fadeIn (). ล่าช้า (1000) .fadeOut ();
    คืนค่าเท็จ;
    }
    $ ("# todos") นำหน้า ("

  • "
    + คำอธิบาย + "
  • ");
    $ ("# form") รีเซ็ต ();
    var todos = $ ("# todos") html ();
    localStorage.setItem ("todos", สิ่งที่ต้องทำ);
    คืนค่าเท็จ;
    });

    ถ้า (localStorage.getItem ("todos")) (
    $ ("# todos") html (localStorage.getItem ("todos"));
    }

    $ ("# clear") คลิก (ฟังก์ชัน () (
    window.localStorage.clear ();
    location.reload ();
    คืนค่าเท็จ;
    });

    รองรับเบราว์เซอร์

    ข้อกำหนด HTML5 ให้การสนับสนุนที่มีประสิทธิภาพมากสำหรับเทคโนโลยี Web Storage เนื่องจากเบราว์เซอร์ยอดนิยมส่วนใหญ่ใช้งานได้ แม้กระทั่ง IE8 IE7 ยังคงเป็นปัญหาเดียวหากคุณยังสนใจอยู่

    บทสรุป.

    ในแอปพลิเคชันขนาดเล็กดังกล่าว กลไก localStorage สามารถแทนที่การใช้ฐานข้อมูลได้ค่อนข้างสำเร็จ สำหรับการจัดเก็บข้อมูลจำนวนเล็กน้อย ไม่จำเป็นต้องใช้ทางเลือกที่ซับซ้อนกว่านี้

    * หมายเหตุนักแปล

    โพสต์จำนวนการดู: 475

    แปล: Vlad Merzhevich

    ที่เก็บข้อมูลในเครื่องถาวรเป็นพื้นที่หนึ่งที่แอปพลิเคชันไคลเอนต์ใช้ประโยชน์จากแอปพลิเคชันเซิร์ฟเวอร์ สำหรับการใช้งานเช่น ระบบปฏิบัติการให้ชั้นนามธรรมสำหรับการจัดเก็บและเรียกข้อมูล เช่น การตั้งค่าหรือสถานะการดำเนินการ ค่าเหล่านี้สามารถเก็บไว้ในรีจิสทรี ไฟล์ INI ไฟล์ XML หรือที่อื่น ๆ ขึ้นอยู่กับหลักการของแพลตฟอร์ม หากแอปพลิเคชันไคลเอนต์ของคุณต้องการพื้นที่จัดเก็บในเครื่องมากกว่าแค่คู่คีย์ / ค่า คุณสามารถแทรกฐานข้อมูลของคุณเอง สร้างรูปแบบไฟล์ของคุณเอง หรือโซลูชันอื่นๆ จำนวนเท่าใดก็ได้

    ในอดีต เว็บแอปพลิเคชันไม่มีความหรูหราเหล่านี้เลย คุกกี้ถูกประดิษฐ์ขึ้นในช่วงต้นของประวัติศาสตร์อินเทอร์เน็ต และสามารถใช้เพื่อจัดเก็บข้อมูลจำนวนเล็กน้อยในเครื่องได้อย่างถาวร แต่มีข้อเสียที่เป็นไปได้สามประการ:

    • คุกกี้รวมอยู่ในคำขอ HTTP ทุกครั้ง ซึ่งจะทำให้เว็บแอปพลิเคชันของคุณช้าลงจากการส่งข้อมูลเดียวกันซ้ำแล้วซ้ำอีกโดยไม่จำเป็น
    • คุกกี้จะรวมอยู่ในคำขอ HTTP ทุกครั้งเมื่อข้อมูลถูกส่งผ่านอินเทอร์เน็ตในรูปแบบที่ไม่ได้เข้ารหัส (แม้ว่าเว็บแอปพลิเคชันทั้งหมดจะถูกส่งผ่าน SSL)
    • คุกกี้ถูกจำกัดข้อมูลไว้ที่ประมาณ 4 KB ซึ่งเพียงพอที่จะทำให้แอปพลิเคชันของคุณช้าลง (ดูด้านบน) แต่ไม่เพียงพอที่จะมีประโยชน์

    นี่คือสิ่งที่เราต้องการจริงๆ:

    • พื้นที่เก็บข้อมูลมากมาย
    • ทำงานในฝั่งไคลเอ็นต์
    • คำนึงถึงการรีเฟรชหน้าบัญชี
    • ไม่มีการส่งไปยังเซิร์ฟเวอร์

    ก่อน HTML5 ความพยายามทั้งหมดเพื่อให้บรรลุสิ่งนี้ในท้ายที่สุดล้มเหลวในหลายวิธี

    ประวัติโดยย่อของการจัดเก็บในเครื่องก่อน HTML5

    ในตอนแรกมี Internet Explorer เพียงเครื่องเดียว อย่างน้อย Microsoft ต้องการให้โลกคิดอย่างนั้น ด้วยเหตุนี้ ภายในกรอบของ First มหาสงครามเบราว์เซอร์ Microsoft ได้ประดิษฐ์หลายสิ่งหลายอย่างและรวมไว้ในเบราว์เซอร์ที่สิ้นสุดสงคราม - Internet Explorer หนึ่งในสิ่งเหล่านี้เรียกว่าพฤติกรรม DHTML และพฤติกรรมหนึ่งเรียกว่า userData

    UserData ช่วยให้หน้าเว็บสามารถจัดเก็บข้อมูลได้มากถึง 64KB ต่อโดเมนในโครงสร้างแบบ XML แบบลำดับชั้น โดเมนที่เชื่อถือได้ เช่น ไซต์อินทราเน็ตสามารถจัดเก็บได้มากถึงสิบเท่า และเดี๋ยวก่อน 640 KB น่าจะเพียงพอสำหรับทุกคน IE ไม่ได้ให้วิธีการใดๆ ในการเปลี่ยนแปลงข้อตกลงเหล่านี้ ดังนั้นจึงไม่มีทางที่จะเพิ่มจำนวนหน่วยความจำที่มีอยู่ได้

    ในปี 2545 Adobe ได้เปิดตัวฟีเจอร์ใน Flash 6 ซึ่งกลับกลายเป็นว่าโชคร้ายและมีชื่อที่ทำให้เข้าใจผิด - "Flash Cookies" ในสภาพแวดล้อม Flash ความสามารถนี้รู้จักกันดีในชื่อ Local Shared Objects (LSO) กล่าวโดยย่อ จะช่วยให้ออบเจ็กต์ Flash สามารถจัดเก็บข้อมูลได้สูงสุด 100KB ต่อโดเมน แบรด นอยเบิร์ก ผู้พัฒนาต้นแบบสะพานเชื่อมระหว่าง Flash และ JavaScript เรียกมันว่า AMASS (AJAX Massive Storage System) แต่ถูกจำกัดด้วยลักษณะเฉพาะบางประการของการออกแบบ Flash ภายในปี 2549 ด้วยการเปิดตัว ExternalInterface ใน Flash 8 การเข้าถึง LSO ผ่าน JavaScript ได้กลายเป็นลำดับความสำคัญที่ง่ายและรวดเร็วยิ่งขึ้น แบรดเขียน AMASS ใหม่และรวมเข้ากับ Dojo Toolkit ยอดนิยมภายใต้นามแฝง dojox.storage Flash "ฟรี" ให้พื้นที่เก็บข้อมูล 100kb แต่ละโดเมน นอกจากนี้ยังแจ้งให้ผู้ใช้เพิ่มความจุในการจัดเก็บตามลำดับความสำคัญเมื่อมีการร้องขอ (1 MB, 10 MB ฯลฯ)

    ถ้า (Modernizr.localstorage) (
    // window.localStorage พร้อมใช้งานแล้ว!
    ) อื่น (
    // ไม่รองรับพื้นที่จัดเก็บ HTML5 ดั้งเดิม
    }

    การใช้ที่เก็บข้อมูล HTML5

    พื้นที่จัดเก็บ HTML5 ขึ้นอยู่กับชื่อของคู่คีย์ / ค่า คุณจัดเก็บข้อมูลตามชื่อคีย์ จากนั้นคุณสามารถดึงข้อมูลนั้นด้วยคีย์เดียวกันได้ ชื่อคีย์คือสตริง ข้อมูลอาจเป็นประเภทใดก็ได้ที่ JavaScript รองรับ รวมถึงสตริง บูลีน จำนวนเต็ม หรือตัวเลขทศนิยม อย่างไรก็ตาม ในความเป็นจริง ข้อมูลถูกจัดเก็บเป็นสตริง หากคุณกำลังบันทึกและดึงข้อมูลที่ไม่ใช่สตริง คุณจะต้องใช้ฟังก์ชัน เช่น parseInt () หรือ parseFloat () เพื่อแปลข้อมูลผลลัพธ์เป็นประเภท JavaScript ที่ถูกต้อง

    อินเทอร์เฟซการจัดเก็บ (
    รับผ่าน getItem (คีย์);
    ตั้งค่าผ่าน setItem (คีย์ ข้อมูล);
    };

    การเรียก setItem () ด้วยชื่อคีย์ที่มีอยู่จะเขียนทับค่าก่อนหน้าโดยไม่โต้ตอบ การเรียก getItem () ด้วยคีย์ที่ไม่มีอยู่จริงจะคืนค่า NULL แทนที่จะส่งข้อยกเว้น

    เช่นเดียวกับออบเจ็กต์ JavaScript อื่นๆ คุณสามารถอ้างถึงอ็อบเจ็กต์ localStorage เป็นอาเรย์ที่เชื่อมโยงได้ แทนที่จะใช้เมธอด getItem () และ setItem () คุณเพียงแค่ระบุ วงเล็บเหลี่ยม... ตัวอย่างเช่น โค้ดชิ้นนี้

    var foo = localStorage.getItem ("แถบ");
    // ...
    localStorage.setItem ("บาร์", foo);

    สามารถเขียนใหม่ได้โดยใช้ไวยากรณ์วงเล็บเหลี่ยม:

    var foo = localStorage ["บาร์"];
    // ...
    localStorage ["บาร์"] = foo;

    นอกจากนี้ยังมีวิธีการลบค่าตามชื่อคีย์เช่นเดียวกับการล้างร้านค้าทั้งหมด (นั่นคือการลบคีย์และค่าทั้งหมดพร้อมกัน)

    อินเทอร์เฟซการจัดเก็บ (
    ลบผ่าน removeItem (คีย์);
    แจ่มใส ();
    }

    การเรียก removeItem () ด้วยคีย์ที่ไม่มีอยู่จะไม่ส่งคืนอะไรเลย

    สุดท้ายมีคุณสมบัติสำหรับรับจำนวนค่าทั้งหมดในพื้นที่จัดเก็บและสำหรับการวนซ้ำคีย์ทั้งหมดตามดัชนี (รับชื่อของแต่ละคีย์)

    อินเทอร์เฟซการจัดเก็บ (
    ระยะเวลา
    รับคีย์ (จำนวนเต็มไม่เป็นลบ);
    }

    หากเมื่อเรียกคีย์ () ดัชนีไม่อยู่ในช่วงตั้งแต่ 0 ถึง (ยาว-1) ฟังก์ชันจะคืนค่า null

    การติดตามพื้นที่จัดเก็บ HTML5

    หากคุณต้องการติดตามการเปลี่ยนแปลงที่เก็บข้อมูลโดยทางโปรแกรม คุณต้องดักจับเหตุการณ์ที่เก็บข้อมูล เหตุการณ์นี้เริ่มทำงานบนวัตถุหน้าต่างเมื่อมีการเรียก setItem (), removeItem () หรือ clear () และเปลี่ยนแปลงบางสิ่ง ตัวอย่างเช่น หากคุณตั้งค่าที่มีอยู่หรือเรียก clear () เมื่อไม่มีคีย์ เหตุการณ์จะไม่เริ่มทำงานเนื่องจากพื้นที่จัดเก็บไม่ได้เปลี่ยนแปลงจริงๆ

    รองรับเหตุการณ์ที่เก็บข้อมูลทุกที่ที่วัตถุ localStorage ทำงานรวมถึง Internet Explorer 8 IE 8 ไม่รองรับมาตรฐาน W3C addEventListener (แม้ว่าในที่สุดจะถูกเพิ่มใน IE 9) ดังนั้นเพื่อให้จับเหตุการณ์การจัดเก็บ คุณต้องตรวจสอบว่าเอ็นจิ้นเหตุการณ์ใด รองรับเบราว์เซอร์ (หากคุณเคยทำสิ่งนี้มาก่อนกับกิจกรรมอื่น คุณสามารถข้ามส่วนนี้ไปจนจบได้) การสกัดกั้นเหตุการณ์การจัดเก็บทำงานในลักษณะเดียวกับการสกัดกั้นเหตุการณ์อื่นๆ หากคุณต้องการใช้ jQuery หรือไลบรารี JavaScript อื่นๆ เพื่อลงทะเบียนตัวจัดการเหตุการณ์ คุณสามารถทำได้ด้วยพื้นที่เก็บข้อมูลเช่นกัน

    ถ้า (window.addEventListener) (
    window.addEventListener ("ที่เก็บข้อมูล", handle_storage, เท็จ);
    ) อื่น (
    window.attachEvent ("ontorage", handle_storage);
    };

    การโทรกลับ handle_storage จะถูกเรียกด้วยวัตถุ StorageEvent ยกเว้นใน Internet Explorer ซึ่งเหตุการณ์จะถูกเก็บไว้ใน window.event

    ฟังก์ชั่น handle_storage (e) (
    ถ้า (! e) (e = window.event;)
    }

    ในกรณีนี้ e จะเป็นอ็อบเจ็กต์ StorageEvent ที่มีคุณสมบัติที่มีประโยชน์ดังต่อไปนี้

    * หมายเหตุ: คุณสมบัติ url เดิมเรียกว่า uri และเบราว์เซอร์บางตัวรองรับคุณสมบัตินี้ก่อนการเปลี่ยนแปลงข้อกำหนด เพื่อความเข้ากันได้สูงสุด คุณควรตรวจสอบว่ามีคุณสมบัติ url หรือไม่ และหากไม่มี ให้ตรวจสอบคุณสมบัติ uri แทน

    ไม่สามารถยกเลิกเหตุการณ์การจัดเก็บได้ ไม่มีทางที่จะหยุดการเปลี่ยนแปลงภายในการเรียกกลับ handle_storage เป็นเพียงวิธีที่เบราว์เซอร์บอกคุณว่า “นี่มันเพิ่งเกิดขึ้น ไม่มีอะไรที่นายทำไม่ได้ ฉันแค่อยากให้นายรู้”

    ข้อจำกัดในเบราว์เซอร์ปัจจุบัน

    เมื่อพูดถึงประวัติของที่จัดเก็บในตัวเครื่องด้วยปลั๊กอินของบริษัทอื่น ฉันได้กล่าวถึงข้อจำกัดของแต่ละเทคนิค ฉันจำได้ว่าฉันไม่ได้พูดอะไรเกี่ยวกับข้อจำกัดของพื้นที่จัดเก็บ HTML5 มาตรฐานในตอนนี้ ฉันจะให้คำตอบกับคุณ แล้วฉันจะอธิบาย คำตอบตามลำดับความสำคัญคือ “5 เมกะไบต์”, “QUOTA_EXCEEDED_ERR” และ “ไม่”

    "5 เมกะไบต์" - พื้นที่จัดเก็บที่จัดเตรียมไว้โดยค่าเริ่มต้นเป็นเท่าใด ความหมายนี้เหมือนกันในทุกเบราว์เซอร์อย่างน่าประหลาดใจ แม้ว่ามันจะถูกกำหนดให้เป็นเพียงข้อเสนอในข้อมูลจำเพาะของ HTML5 คุณต้องเข้าใจว่าคุณกำลังจัดเก็บสตริง ไม่ใช่ข้อมูลในรูปแบบดั้งเดิม หากคุณเก็บจำนวนเต็มหรือเลขทศนิยมไว้จำนวนมาก ความแตกต่างในการแสดงอาจมีมาก แต่ละหลักในเลขทศนิยมจะถูกเก็บไว้เป็นอักขระ ไม่ใช่การแสดงตัวเลขตามปกติสำหรับตัวเลขดังกล่าว

    "QUOTA_EXCEEDED_ERR" เป็นข้อยกเว้นที่คุณจะได้รับหากคุณใช้โควต้าเกิน 5MB "ไม่" คือคำตอบของคำถามที่ชัดเจนถัดไป: "ฉันขอพื้นที่เก็บข้อมูลเพิ่มจากผู้ใช้ได้ไหม" ในขณะที่เขียน เบราว์เซอร์ยังไม่ได้ใช้กลไกใดๆ สำหรับนักพัฒนาเว็บเพื่อขอพื้นที่เก็บข้อมูลเพิ่ม เบราว์เซอร์บางตัว (เช่น Opera) อนุญาตให้ผู้ใช้ควบคุมโควตาพื้นที่เก็บข้อมูลสำหรับแต่ละไซต์ แต่นี่เป็นความคิดริเริ่มสำหรับผู้ใช้เท่านั้น ไม่ใช่สิ่งที่คุณในฐานะนักพัฒนาสามารถฝังลงในเว็บแอปพลิเคชันของคุณได้

    ที่เก็บข้อมูล HTML5 ในการใช้งานจริง

    มาดูการทำงานของพื้นที่จัดเก็บ HTML5 กัน กลับไปที่สิ่งที่เราสร้างในบทการวาด เกมนี้มีปัญหาเล็กน้อย: หากคุณปิดหน้าต่างเบราว์เซอร์กลางเกม คุณจะเสียผลลัพธ์ แต่ด้วยพื้นที่จัดเก็บ HTML5 เราสามารถเก็บการเล่นเกมไว้ในเบราว์เซอร์ได้ เปิดการสาธิต ขยับเล็กน้อย ปิดแท็บเบราว์เซอร์ แล้วเปิดใหม่อีกครั้ง หากเบราว์เซอร์ของคุณรองรับพื้นที่จัดเก็บ HTML5 หน้าสาธิตจะจดจำตำแหน่งที่แน่นอนในเกมได้อย่างน่าอัศจรรย์ รวมถึงจำนวนการเคลื่อนไหวที่คุณทำ ตำแหน่งของแต่ละชิ้นบนกระดาน และแม้แต่ชิ้นส่วนที่เลือก

    มันทำงานอย่างไร? ทุกครั้งที่มีการเปลี่ยนแปลงในเกม เราจะเรียกฟังก์ชันนี้

    ฟังก์ชั่น saveGameState () (

    localStorage ["halma.game.in.progress"] = gGameInProgress;
    สำหรับ (var i = 0; i< kNumPieces; i++) {
    localStorage ["halma.piece" + i + ".row"] = gPieces [i] .row;
    localStorage ["halma.piece" + i + ".column"] = gPieces [i] .column;
    }
    localStorage ["halma.selectedpiece"] = gSelectedPieceIndex;
    localStorage ["halma.selectedpiecehasmoved"] = gSelectedPieceHasMoved;
    localStorage ["halma.movecount"] = gMoveCount;
    คืนค่าจริง;
    }

    อย่างที่คุณเห็น ออบเจ็กต์ localStorage ใช้เพื่อบันทึกกระบวนการเกม (gGameInProgress, บูลีน) ถัดไป โทเค็นทั้งหมด (gPieces, JavaScript array) จะถูกวนซ้ำและจัดเก็บแถวและคอลัมน์ไว้สำหรับแต่ละโทเค็น หลังจากนั้น สถานะเกมเพิ่มเติมบางส่วนจะถูกบันทึก รวมถึงชิ้นส่วนที่เลือก (gSelectedPieceIndex, integer) ชิ้นที่อยู่ตรงกลางของการกระโดดแบบยาว (gSelectedPieceHasMoved, boolean) และจำนวนการเคลื่อนไหวทั้งหมด (gMoveCount, integer) .

    เมื่อหน้าเว็บโหลด แทนที่จะเรียกใช้ฟังก์ชัน newGame () โดยอัตโนมัติ ซึ่งจะทำให้ตัวแปรทั้งหมดกลับเป็นค่าดั้งเดิม เราจะเรียก resumeGame () ฟังก์ชัน resumeGame () ใช้ที่เก็บข้อมูล HTML5 เพื่อตรวจสอบสถานะของเกมในที่จัดเก็บในเครื่อง หากมี จะคืนค่าโดยใช้วัตถุ localStorage

    ฟังก์ชัน resumeGame () (
    ถ้า (! supportLocalStorage ()) (คืนค่าเท็จ;)
    gGameInProgress = (localStorage ["halma.game.in.progress"] == "จริง");
    ถ้า (! gGameInProgress) (คืนค่าเท็จ;)
    gPieces = อาร์เรย์ใหม่ (kNumPieces);
    สำหรับ (var i = 0; i< kNumPieces; i++) {
    var row = parseInt (localStorage ["halma.piece" + i + ".row"]);
    var คอลัมน์ = parseInt (localStorage ["halma.piece" + i + ".column"]);
    gPieces [i] = เซลล์ใหม่ (แถว, คอลัมน์);
    }
    gNumPieces = kNumPieces;
    gSelectedPieceIndex = parseInt (localStorage ["halma.selectedpiece"]);
    gSelectedPieceHasMoved = localStorage ["halma.selectedpiecehasmoved"] == "จริง";
    gMoveCount = parseInt (localStorage ["halma.movecount"]);
    กระดานวาด ();
    คืนค่าจริง;
    }

    ส่วนที่สำคัญที่สุดของฟังก์ชันนี้คือข้อแม้ที่ฉันกล่าวถึงก่อนหน้านี้ในบทนี้ และจะทำซ้ำที่นี่: ข้อมูลถูกจัดเก็บเป็นสตริง หากคุณกำลังจัดเก็บอย่างอื่นที่ไม่ใช่สตริง คุณต้องแปลงเมื่อได้รับ ตัวอย่างเช่น แฟล็กที่เกมกำลังดำเนินการอยู่ (gGameInProgress) เป็นประเภทบูลีน ในฟังก์ชัน saveGameState () เราเพียงแค่จัดเก็บและไม่ต้องกังวลกับประเภทข้อมูล

    localStorage ["halma.game.in.progress"] = gGameInProgress;

    แต่ใน resumeGame () เราต้องดูค่าที่เราได้รับจากที่จัดเก็บในตัวเครื่องเป็นสตริง และสร้างบูลีนของเราเอง

    gGameInProgress = (localStorage ["halma.game.in.progress"] == "จริง");

    ในทำนองเดียวกัน จำนวนการเคลื่อนไหวจะถูกเก็บไว้ใน gMoveCount เป็นจำนวนเต็ม ในฟังก์ชัน saveGameState () เราเพียงแค่บันทึก

    localStorage ["halma.movecount"] = gMoveCount;

    แต่ใน resumeGame () เราต้องแปลงค่าเป็นจำนวนเต็มโดยใช้ฟังก์ชัน parseInt () ในตัวของ JavaScript

    gMoveCount = parseInt (localStorage ["halma.movecount"]);

    Beyond Key / Value Pair: วิสัยทัศน์การแข่งขัน

    แม้ว่าจะมีกลอุบายและวิธีแก้ปัญหามากมายในประวัติศาสตร์ แต่สถานะปัจจุบันของพื้นที่จัดเก็บ HTML5 นั้นดีอย่างน่าประหลาดใจ API ใหม่นี้ได้รับมาตรฐานและรวมอยู่ในเบราว์เซอร์ แพลตฟอร์ม และอุปกรณ์หลักทั้งหมด สำหรับนักพัฒนาเว็บ คุณไม่เห็นสิ่งนี้ทุกวันใช่ไหม แต่นั่นเป็นมากกว่า "คู่คีย์ / ค่า 5 เมกะไบต์" และอนาคตของการจัดเก็บในเครื่องแบบถาวรคือ ... จะพูดอย่างไร ... ปล่อยให้มันเป็นวิสัยทัศน์ที่แข่งขันได้

    วิสัยทัศน์หนึ่งคือคำย่อที่คุณรู้จัก - SQL ในปี 2550 Google ได้เปิดตัว Gears ซึ่งเป็นปลั๊กอินข้ามเบราว์เซอร์พร้อมโอเพ่นซอร์ส รหัสแหล่งที่มาซึ่งรวมถึงฐานข้อมูลที่ใช้ SQLite แบบฝังตัว ต้นแบบรุ่นแรกนี้มีอิทธิพลต่อการสร้างข้อกำหนดฐานข้อมูล Web SQL Database ในเวลาต่อมา ฐานข้อมูล Web SQL (เดิมเรียกว่า "WebDB") จัดเตรียม wrapper แบบบางรอบ ๆ ฐานข้อมูล ข้อมูล SQLซึ่งช่วยให้คุณทำสิ่งต่อไปนี้จาก JavaScript:

    openDatabase ("เอกสาร", "1.0", "ที่จัดเก็บเอกสารในเครื่อง", 5 * 1024 * 1024, ฟังก์ชัน (db) (
    db.changeVersion ("", "1.0", ฟังก์ชัน (t) (
    t.executeSql ("สร้างเอกสารตาราง (id, ชื่อ)");
    ), ข้อผิดพลาด);
    });

    อย่างที่คุณเห็น การดำเนินการส่วนใหญ่เป็นไปตามวิธี ExecuteSQL สตริงนี้สามารถรองรับคำสั่ง SQL ใดๆ รวมถึง SELECT, UPDATE, INSERT และ DELETE มันเหมือนกับการเขียนโปรแกรมฐานข้อมูลฝั่งเซิร์ฟเวอร์ ยกเว้นว่าคุณใช้ JavaScript! โอ้ จอย!

    ข้อมูลจำเพาะฐานข้อมูล Web SQL ถูกนำไปใช้กับเบราว์เซอร์และแพลตฟอร์มสี่ตัว

    รองรับฐานข้อมูลเว็บ SQL
    เช่น Firefox ซาฟารี โครเมียม โอเปร่า iPhone Android
    4.0+ 4.0+ 10.5+ 3.0+ 2.0+

    แน่นอน หากคุณเคยใช้ฐานข้อมูลมากกว่าหนึ่งฐานข้อมูลในชีวิต คุณจะรู้ว่า "SQL" เป็นคำศัพท์ทางการตลาดมากกว่ามาตรฐานที่เข้มงวดและรวดเร็ว (อาจมีคนพูดถึง HTML5 เหมือนกัน แต่นั่นก็ไม่สำคัญ ). แน่นอนว่ามีข้อกำหนด SQL ที่เป็นปัจจุบัน (เรียกว่า SQL-92) แต่ไม่มีเซิร์ฟเวอร์ฐานข้อมูลใดในโลกที่สอดคล้องกับข้อกำหนดนี้เท่านั้น มี Oracle SQL, Microsoft SQL, SQL ใน MySQL, SQL ใน PostgreSQL, SQL ใน SQLite อันที่จริงแล้ว แต่ละผลิตภัณฑ์เหล่านี้จะเพิ่มผลิตภัณฑ์ใหม่เมื่อเวลาผ่านไป ฟังก์ชัน SQLดังนั้นแม้แต่การพูดว่า "SQL ใน SQLite" ก็ยังไม่เพียงพอ คุณต้องพูดว่า "เวอร์ชันของ SQL ที่มาพร้อมกับ SQLite เวอร์ชัน X.Y.Z"

    ทั้งหมดนี้นำเราไปสู่ข้อแม้ถัดไป ซึ่งปัจจุบันอยู่ที่ด้านบนสุดของข้อกำหนด Web SQL

    ข้อมูลจำเพาะอยู่ในทางตัน: ​​นักพัฒนาที่สนใจทั้งหมดกำลังใช้ SQL ฝั่งเซิร์ฟเวอร์ (SQLite) แต่เราต้องการการใช้งานอิสระหลายรายการเพื่อก้าวไปสู่การกำหนดมาตรฐาน ในขณะที่นักพัฒนารายอื่นสนใจที่จะนำข้อกำหนดนี้ไปใช้ คำอธิบายภาษา SQL ยังคงเป็นข้อมูลอ้างอิงปกติของ Sqlite ซึ่งไม่เป็นที่ยอมรับในมาตรฐาน

    ตรงกันข้ามกับฉากหลังนี้ที่ฉันจะแบ่งปันวิสัยทัศน์ด้านการแข่งขันอีกประการหนึ่งสำหรับการจัดเก็บในเครื่องขั้นสูงและถาวรสำหรับเว็บแอปพลิเคชัน: Indexed Database API ซึ่งเดิมเรียกว่า "WebSimpleDB" ซึ่งปัจจุบันเรียกว่า IndexedDB อย่างสนิทสนม

    Indexed Database API ให้สิ่งที่เรียกว่าการจัดเก็บอ็อบเจ็กต์ โดยมีแนวคิดมากมายที่ยืมมาจากฐานข้อมูล SQL มี "ฐานข้อมูล" กับ "ระเบียน" แต่ละระเบียนมี "เขตข้อมูล" จำนวนหนึ่ง แต่ละฟิลด์มีชนิดข้อมูลเฉพาะที่กำหนดไว้เมื่อสร้างฐานข้อมูล คุณสามารถเลือกส่วนของระเบียน แล้วแสดงรายการด้วย "เคอร์เซอร์" การเปลี่ยนแปลงการจัดเก็บอ็อบเจ็กต์จะถูกประมวลผลด้วย "ธุรกรรม"

    หากคุณเคยตั้งโปรแกรมฐานข้อมูล SQL คำศัพท์เหล่านี้อาจคุ้นเคยกับคุณ ความแตกต่างหลักคือที่จัดเก็บอ็อบเจ็กต์ไม่มีภาษาคิวรีที่มีโครงสร้าง คุณไม่ได้เขียนเงื่อนไขเช่น "SELECT * จากผู้ใช้โดยที่ ACTIVE =" Y "" แต่จะใช้วิธีการที่ให้โดยที่เก็บอ็อบเจ็กต์เพื่อเปิดฐานข้อมูล USERS ระบุเรคคอร์ด กรองเรคคอร์ดของเรา และใช้เมธอด accessor เพื่อรับค่าของแต่ละฟิลด์ของเรคคอร์ดที่เหลือ การแนะนำ IndexedDB เบื้องต้นเป็นแนวทางที่ดีเกี่ยวกับวิธีการทำงานของ IndexedDB และเปรียบเทียบ IndexedDB กับ Web SQL

    ในขณะที่เขียน IndexedDB ได้ถูกนำมาใช้ใน Firefox 4 รุ่นเบต้าเท่านั้น ในทางตรงกันข้าม Mozilla ระบุว่าจะไม่ใช้ Web SQL Google กล่าวว่าพวกเขากำลังพิจารณาการสนับสนุน IndexedDB สำหรับ Chromium และ Google Chrome... และแม้แต่ Microsoft ก็บอกว่า IndexedDB นั้น "ยอดเยี่ยมสำหรับเว็บ"

    คุณสามารถทำอะไรในฐานะนักพัฒนาเว็บด้วย IndexedDB? บน ช่วงเวลานี้แทบไม่มีอะไรอื่นนอกจากการสาธิตเทคโนโลยีบางอย่าง ในหนึ่งปี? บางที.