דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. מחלקה פשוטה ב-JS לטפל בחוסר הודאות בקיום localstorage

מחלקה פשוטה ב-JS לטפל בחוסר הודאות בקיום localstorage

מתוזמן נעוץ נעול הועבר תכנות
8 פוסטים 4 כותבים 522 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • yossizY מנותק
    yossizY מנותק
    yossiz
    כתב ב נערך לאחרונה על ידי
    #1

    קיבלתי הרבה דיווחי שגיאות בקוד פרונטאנד מסויים בגלל מצבים שונים שבהם localstorage לא זמין, למשל בדפדפנים מסויימים במצב גלישה בסתר, או גירסאות מסויימות של דפדפנים למובייל וכדומה
    אז כתבתי את המחלקה הזאת כמעטפה ל-localstorage
    אשמח לקבל שיפורים

    export class Storage {
      static #nullStorage = {
        getItem() {},
        setItem() {},
        removeItem() {}
      };
    
      static #cookieBasedStorage = {
        getItem(key, defaultValue) {
          // https://stackoverflow.com/a/64472572
          return Object.fromEntries(document.cookie.split('; ').map((v) => v.split(/=(.*)/s).map(decodeURIComponent)))[key] ?? defaultValue;
        },
        setItem(key, value) {
          document.cookie = `${key}=${value}`;
        },
        removeItem(key) {
          document.cookie = `${key}=; expires=Thu, 01 Jan 1970 00:00:00 UTC`;
        }
      };
    
      static #storage = this.#storageAvailable(localStorage)
        ? localStorage
        : this.#storageAvailable(this.#cookieBasedStorage)
        ? this.#cookieBasedStorage
        : this.#nullStorage;
    
      static #storageAvailable(storage) {
        // https://developer.mozilla.org/en-US/docs/Web/API/Web_Storage_API/Using_the_Web_Storage_API#Feature-detecting_localStorage
        try {
          const x = '__storage_test__';
          storage.setItem(x, x);
          storage.removeItem(x);
          return true;
        } catch (e) {
          return false;
        }
      }
    
      static getItem(key, defaultValue) {
        return this.#storage.getItem(key) ?? defaultValue;
      }
    
      static setItem(key, value) {
        this.#storage.setItem(key, value);
      }
    
      static removeItem(key) {
        this.#storage.removeItem(key);
      }
    }
    
    

    📧 יוסי@מייל.קום | 🌎 בלוג | ☕ קפה

    א שלום עולם 0ש 2 תגובות תגובה אחרונה
    12
    • א מנותק
      א מנותק
      אביחיל
      השיב לyossiz ב נערך לאחרונה על ידי
      #2

      @yossiz כתב במחלקה פשוטה ב-JS לטפל בחוסר הודאות בקיום localstorage:

      document.cookie = ${key}=${value};

      המחלקה מטפלת ב localstorage או בכוכיז?

      צדיק תמיםצ תגובה 1 תגובה אחרונה
      0
      • צדיק תמיםצ מנותק
        צדיק תמיםצ מנותק
        צדיק תמים
        השיב לאביחיל ב נערך לאחרונה על ידי
        #3

        @אביחיל היא נופלת (fallback) לקוקיז במקרה שlocalstorage לא זמין

        Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
        טיפים

        תגובה 1 תגובה אחרונה
        3
        • שלום עולם 0ש מנותק
          שלום עולם 0ש מנותק
          שלום עולם 0
          השיב לyossiz ב נערך לאחרונה על ידי שלום עולם 0
          #4

          @yossiz המחקלה מאפשרת רק תקשורת בסיסית עם localstorage דהיינו get, set, remove. אבל ל-localstorage יש גם מתודת ()clear ומאפיין length; אפשר לגשת ולשנות את רכיביו עם [localStorage[key או Object.hasOwnPropetry, אפשר לבצע עליו איטרציות(!) וכו'.

          אם אתה רוצה לחקות באמת את localstorage, כנראה הפתרון הוא Proxy שלם שיושב על כל אפשרויות התקשורת עם localstorage ומספק תחליפים על בסיס coockie. ייתכן שעבור עבור חלק מהמקרים יהיה אפשר לרכב על ה-API הקיים sessionStorage אם הדפדפן מספק אותו.

          כל זה לענ"ד וכתלמיד הדן בקרקע...


          נ.ב. ייתכן שהיישום של ()localStorage.clear על המחלקה שלך מסוכן כי הוא עולל למחוק שורות מה-coockie שמנוהלים ע"י קוד אחר. לפתור את זה ידרוש מעקב על מה נוסף על ידי הקוד הנוכחי ומה לא.

          צדיק תמיםצ תגובה 1 תגובה אחרונה
          1
          • צדיק תמיםצ מנותק
            צדיק תמיםצ מנותק
            צדיק תמים
            השיב לשלום עולם 0 ב נערך לאחרונה על ידי צדיק תמים
            #5

            @שלום-עולם-0 כתב במחלקה פשוטה ב-JS לטפל בחוסר הודאות בקיום localstorage:

            @yossiz המחקלה מאפשרת רק תקשורת בסיסית עם localstorage. אבל ל-localstorage יש גם מאפיין length ואפשר לגשת ולשנות את רכיביו עם localStorage.key או Object.hasOwnPropetry, איטרציות(!) וכו'.

            אני לא מצליח לראות תרחיש "בעולם האמיתי" שבו יש צורך באפשרויות האלה

            Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
            טיפים

            שלום עולם 0ש תגובה 1 תגובה אחרונה
            1
            • שלום עולם 0ש מנותק
              שלום עולם 0ש מנותק
              שלום עולם 0
              השיב לצדיק תמים ב נערך לאחרונה על ידי
              #6

              @צדיק-תמים כמובן הכל תלוי בגודל הפרויקט.
              דוגמא לנחיצות איטרציה, היא כאשר העדפות המשתמש נשמרות ב-localStorage ואתה רוצה להעתיק את הנתונים משם לאובייקט שמכיל את ההגדרות.

              צדיק תמיםצ תגובה 1 תגובה אחרונה
              0
              • צדיק תמיםצ מנותק
                צדיק תמיםצ מנותק
                צדיק תמים
                השיב לשלום עולם 0 ב נערך לאחרונה על ידי
                #7

                @שלום-עולם-0 במקרה כזה עושים סריאליזציה לאובייקט ההגדרות עם JSON.stringify ושומרים אותו תחת key בשם settings

                Don’t comment bad code — rewrite it." — Brian W. Kernighan and P. J. Plaugher"
                טיפים

                שלום עולם 0ש תגובה 1 תגובה אחרונה
                2
                • שלום עולם 0ש מנותק
                  שלום עולם 0ש מנותק
                  שלום עולם 0
                  השיב לצדיק תמים ב נערך לאחרונה על ידי
                  #8

                  @צדיק-תמים אני התכוונתי לכיוון ההפוך – חילוץ ההגדרות מ-localStorage, אבל אתה צודק שאם השמירה נעשתה עם key מיוחד אין בעיה.

                  תגובה 1 תגובה אחרונה
                  0

                  בא תתחבר לדף היומי!
                  • התחברות

                  • אין לך חשבון עדיין? הרשמה

                  • התחברו או הירשמו כדי לחפש.
                  • פוסט ראשון
                    פוסט אחרון
                  0
                  • דף הבית
                  • קטגוריות
                  • פוסטים אחרונים
                  • משתמשים
                  • חיפוש
                  • חוקי הפורום