Javascript ile LocalStorage'a veri yazma, okuma, silme ....

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Merhaba,

Lokal bir HTML dosyasında tarayıcının LocalStorage'ına ufak tefek bilgileri yazma, okuma, silme, formu PDF olarak yazdırma vb işleri yapan bir HTML ve JavaScript çalışmasına ait hazırladığım kodlar aşağıdadır.

İlk çalıştırıldığında, LocalStorage'ınız da ilgili verileri bulamadığı için sizden formu doldurup Update - Güncelleme yapmanız istenecektir. Güncelledikten sonra HTML kapattığınızda bu veriler silinmez. Herhangibir zaman dosyayı tekrar açtığınızda, LocalStorage'daki veriler HTML sayfasındaki forma işlenir.

Form verileri istenildiğinde LocalStorage'dan ebediyen silinebilir veya güncellenebilir. Çeşit olsun diye, formun "UserName" bölümünde veri girişinde istenildiğinde aktif edilebilen maskeleme kullanılmış, yazdırma butonuna tıklandığında form üzerindeki butonların, maskeleme elemanlarının gizlenerek yazdırılması sağlanmış, tarayıcının default-varsayılan butonları görsel olarak geliştirilmiş, üzerlerine tıklandığında hafifçe küçülerek, gölgelenme yapılmak suretiyle ActiveX butonları gibi bir görsellik verilmeye çalışılmıştır. Formu PDF olarak yazdırırken, otomatik olarak üretilen header-footer (üst-alt bilgi) engellenmiş, onun yerine formun sonunda yazdırılma tarihinin yazdırılması sağlanmış, sayfa üzerindeki marjinlerde ayarlama yapılmıştır. Kodlar incelendiğinde, herşeyin çok esnek olduğu ve ihtiyaca göre şekillendirilebileceği görülmektedir.

Form dizaynı ve içeriği ihtiyaca göre revize edilerek, kullanılabilir. LocalStorage nesnesine sadece aynı domain üzerinden erişilebildiği için, kişisel ev kullanıcıları için çok fazla risk barındırmaz diye düşünüyorum, ama yine de çok önemli bilgileri yazmamakta fayda var tabii.....

Konu hakkında geliştirmeye yönelik herhangibir soruyu cevaplayamayacağımı, peşinen bildiririm çünkü o tür isteklerin sonu gelmez. HTML, CSS ve JavaScript ile ilgilenenler için faydalı olabileceğini düşündüğüm kodlama teknikleri olduğu için paylaşmak istedim.

İyi akşamlar,

HTML:
<!DOCTYPE html>
<html lang="tr">
<head>
   <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.3.0/font/bootstrap-icons.css" />
   <style>
    
    @media print {
         @page {
         margin-left: 0.5in;
        margin-right: 0.5in;
        margin-top: 0;          /* Remove header */
        margin-bottom: 0;       /* Remove footer */
        }
       body {
        margin-left: 0.8cm;
        margin-top: 1.5cm;
          -webkit-print-color-adjust:exact !important;      /* For use in Chrome but the user may need to select to print colors from printing settings  */
         print-color-adjust:exact !important;              /* For use in FireFox but the user may need to select to print colors from printing settings */
        }
    }

    label {
    display: inline-block;
    width: 90px;
    }

    .myInfo {
     background-color:powderblue;
     width:500px;
     height:40px;
     display: flex;
     justify-content: center;
     line-height: 40px;
    }

    .submitB {
        background-color: #555;
         color:white;
         width: 80px;
         height: 22px;
         font-size: 14px;
         border-radius: 8px;
         font-weight: bold;
    }

    .submitB:hover{
         cursor: pointer;
    }

    .submitB:active{
         box-shadow: 3px 4px 10px rgba(0, 0, 0, 0.3);
         cursor: pointer;
         transform: scale(0.95);
    }
    </style>
    <title>Membership Form</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta name="google" content="notranslate"/>
  <script type="text/javascript">
    function deleteData(){
        localStorage.removeItem('memberdata');
        document.getElementById("membershipForm").reset();
        document.getElementById('infoDiv').innerHTML = 'Your membership details not found. Please fill the form below and update.';
    }
  </script>

</head>
 
 <body>
    <br>
    <div id="infoDiv" class="myInfo"></div>
    <div id="formDiv" class="formDiv" style="width:500px">
    <form id="membershipForm" autocomplete="off" style= "text-align: left;">
        <fieldset>
            <legend>Membership Form</legend>
            <br>
            <div><label for="Firstname">First Name: </label><input id="Firstname" type="text" name="First_N" autocomplete="off" required style="left: 100px" /></div>
            <br>
            <div><label for="LastName">Last Name: </label><input id="LastName" type="text" name="Last_N" autocomplete="off" required /></div>
            <br>
            <div><label for="userN">Username: </label><input type="password" id="userN" name="Username" autocomplete="off" required />
            <i class="bi bi-eye-slash" id="toggleUserName" style="margin-left: -25px; color:blue;"></i> <!-- Position of the eye in the input is adjusted by negative margin -->
            </div>               
            <br>
            <div><label for="BthDate">Birth Date: </label><input id="BthDate" type="date" name="Bdate" required /></div>
            <br>
            <div><label for="EML">E-Mail: </label><input id="EML" type="email" name="Email" autocomplete="off" required /></div>
            <br>
            <input class="submitB" type="submit" value="Update" />
            <input class="submitB" type="button" value="Delete" onclick="deleteData()" />
            <input class="submitB" type="button" value="Print" onclick="printPage()" />
        </fieldset>
    </form>
  </div>
  <br>
  <div id="footerID" style="font-size: 10px;"></div>

  <script type="text/javascript">
        const togglePassword = document.querySelector("#toggleUserName");
        const password = document.querySelector("#userN");

        togglePassword.addEventListener("click", function () {
            // toggle the type attribute
            const type = password.getAttribute("type") === "password" ? "text" : "password";
            password.setAttribute("type", type);
            
            // toggle the icon
            this.classList.toggle("bi-eye");
        });
    </script>

    <script type="text/javascript">
    var xData= JSON.parse(localStorage.getItem('memberdata')) || [];
    if (xData.length == 0) {document.getElementById('infoDiv').innerHTML = 'Your membership details not found. Please fill the form below and update.';};
    if (Object.keys(xData).length > 0) {
        document.getElementsByName("First_N")[0].value= xData.FirstName;
        document.getElementsByName("Last_N")[0].value= xData.LastName;
        document.getElementsByName("Username")[0].value= xData.UserName;
        document.getElementsByName("Bdate")[0].value= xData.BirthDate;
        document.getElementsByName("Email")[0].value= xData.Email;
        document.getElementById('infoDiv').innerHTML= 'Last Updated on: ' + xData.LastUpdate;
    }
    </script>

   <script type="text/javascript">
      document.getElementById("membershipForm").addEventListener("submit", function(event) {
      event.preventDefault(); // Prevent form submission
 
      // Collect form data
      const formData = {
        "FirstName": this.elements["First_N"].value,
        "LastName": this.elements["Last_N"].value,
        "UserName": this.elements["Username"].value,
        "BirthDate": this.elements["Bdate"].value,
        "Email": this.elements["Email"].value,
        "LastUpdate": new Date().toLocaleString()   // Last Update timestamp is added for the info division
      };
 
      // Convert form data to JSON format
      const jsonData = JSON.stringify(formData, null, 2);
      console.log(jsonData);

      // Write to local storage
      localStorage.setItem( 'memberdata', jsonData );
      
      // Inform the user   
      document.getElementById('infoDiv').innerHTML = 'Last Updated on: ' + formData.LastUpdate;
    });
  </script>

  <script type="text/javascript">
    // Print page after customizing the layout....
    function printPage(){
        
        // Set buttons and eye style to 'hidden' and write the custom footer
        const buttons= document.getElementsByClassName("submitB");
        var i;

        for (i = 0; i < buttons.length; i++) {
            buttons[i].style.visibility = 'hidden';
        }
        
        myFooter= document.getElementById('footerID');
        myFooter.innerHTML= 'Printed on: ' + new Date().toLocaleString();


                const password = document.querySelector("#userN");
        if( password.getAttribute("type") === "password"){
            password.setAttribute("type", "text")
        }

        document.getElementById('toggleUserName').style.visibility = 'hidden';


        window.print();
        
        // Set buttons and eye style back to 'visible' and clear the custom footer
        for (i = 0; i < buttons.length; i++) {
            buttons[i].style.visibility = 'visible';
        }
        
        document.getElementById('toggleUserName').style.visibility = 'visible';

        myFooter.innerHTML= '' ;
    }
  </script>
 </body>
</html>




Screenshot.png
.
 

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,333
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Bir dönem JScript ile uğraştığım halde localStorage nesnesi ile tanışmamıştım. Bir kaç web araması sonucunda ben de bazı bilgilere ulaştım.

Gerek forum üyeleri, gerekse dünyanın farklı bölgelerinden foruma ulaşan ziyaretçiler için edinebildiğim bazı ilave bilgileri buraya ekleyeyim.

-> localStorage bilgileri disk üzerinde, aşağıdakine benzer bir lokasyonda, şifresiz bir sqlite veritabanı içinde tutuluyor. (Firefox için)

Rich (BB code):
C:\Users\zeki\AppData\Roaming\Mozilla\Firefox\Profiles\sqde92k3.default-release\storage\default\file++++C++Users+zeki+Desktop+Test.htm\ls\data.sqlite
Veritabanı görseli:

251683

-> localStorage bilgilerine sadece client-side çalışan, html gibi dosya erişebilir. Server-side çalışan bir dosyanın (PHP, ASP vb) erişebilmesi, kullanıcıyı "çekilişten ödül kazandınız" benzeri butonu kullanmasını sağlayarak sunucuya post etmesiyle mümkün. Bilinçli bir kullanıcı bağlamında verilerin güvende olduğunu söyleyebiliriz.

-> Eğer gerekliyse, localStorage listesini elde edebilmek de mümkün:

JavaScript:
function listAllItems(){
// Ref: https://stackoverflow.com/questions/8419354/get-html5-localstorage-keys
    for (i=0; i<localStorage.length; i++)
    {
        key = localStorage.key(i);
        console.log(localStorage.getItem(key));
    }
}
Araştırma, yeni bilgiler edinme, forum içeriğini zenginleştirerek bilgiyi paylaşma adına emeğinize sağlık...

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Teşekkürler Zeki Üstad,

Bu arada mesajımda belirttiğim hususlara bir açıklama getireyim. LocalStorage, Windows üzerindeki MyDocuments-Belgelerim klasörü gibi bir yer değildir. HTML sayfasının kendisine has bir özelliktir. .... Zeki Beyin verdiği örnekte olduğu gibi internete açık olduğunuz zaman, bir şekilde harici yazılımların sözkonusu HTML sayfasına ulaşması durumunda burada saklanan bilgiler ele geçirilebilir. Veya, sözkonusu HTML sayfasını hazırlarken kullanılan harici scriptlerin (........jquery.min.js gibi) içine yerleştirilmiş olabilecek ufak scriptler bu bilgilere ulaşabilir. O nedenle, kullanılacak harici script'leri de dikkatli seçmek gerekir.

.
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Merhaba;

VBA dan sıkılmış biri mi var? ;) Elinize sağlık..

Local Storage konusuna girdiyseniz Session Storage de el atmanız lazım bence ikisi ayrılmaz bir bütündür.. Local ya da session bilgilerinizi de en kolay aşağıdaki resimdeki gibi kontrol edebilirsiniz. Browserın developer sekmesinden F12 ile açılan..

haluk.png
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Teşekkürler Necdet Bey ve beab05,

Esas, IndexedDB olayına yönelmek lazım...... Ciddi bir veritabanı olayı, çok güzel.

.
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Teşekkürler Necdet Bey ve beab05,

Esas, IndexedDB olayına yönelmek lazım...... Ciddi bir veritabanı olayı, çok güzel.

.
Ben indexedDB ile büyük sorunlar yaşamıştım 2-3 yıl önce. WebosTv için bir uygulama yaparken FireBase/FireStore ile Chromium, web engine: WebKit 538.2 için (hala notlarım duruyormuş ki bunu tam yazabildim) uyumsuzluk yaşamıştım. Firestore offline verileri eğer güncelleme yapmak istsersem diye indexeddb de tutuyordu diye hatırlıyorum.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
@beab05; benim ilgimi çekti, biraz bakıyorum ne yapılabilir diye..... yukarıdaki örneği adapte edeceğim umarım.

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Bu konu başlığı altındaki örneği bukez IndexedDB ile ele aldım..... Benim yaptığım ufak tefek denemeler iyi sonuç verdi.
İnternetten araştırdığım kadarıyla, LocalStorage'a göre çok daha iyiymiş, hassas bilgilerin bie güvenle saklanabileceğini belirtiyorlar.

Bu örnekte;
  • - Yeni kayıt giriş
  • - Kayıt silme
  • - Kayıt arama/bulma
  • - Kayıt güncelleme
  • - Veritabanının tümünü silme/görüntüleme
  • - Veritabanı kayıtlarını PDF olarak kaydetme

işlemleri yapılmaktadır. Veri tabanı kayıtlarını görüntülediğimiz alanda, gerektiğinde düşey kaydırma çubuğu çıkar. Yeni kayıt yapmaya devam edildiğinde kaydırma çubuğu listenin sonuna konumlandırır, tabloda aşağıya doğru inerken tablo başlıkları yerinde sabit kalır (freeze row) ........ falan filan birşeyler karaladık işte :)

Ekran görüntüsü ve ilgili kodlar;


Screenshot.png


Not: Kodlar biraz uzun olduğu için, forum sistemi mesajda kabul etmedi. Ben de HTML dosyasını ekliyorum....

Güncelleme:

- Kodları yeniden düzenledim, muhtelif kontroller vb ilave edildi. (25/05/2024)

- Kodlarda iyileştirme yapıldı, tarayıcıdaki stoklama kapasitesi ve IndexedDB'nin ne kadarını kullandığı ilave edildi. (26/05/2024)

- Kodlarda iyileştirme yapıldı (29/05/2024)

- Dosyanın son hali aşağıdaki linktedir (31/05/2024)



.
 

Ekli dosyalar

Son düzenleme:

Zeki Gürsoy

Uzman
Uzman
Katılım
31 Aralık 2005
Mesajlar
4,333
Excel Vers. ve Dili
Office 2019 (64 bit) - Türkçe
Gerek LocalStorage, gerekse IndexedDB aslında Sqlite veritabanının (her ikisinin de içeriğine bir manager program ile ulaştım) ta kendisi. Eğer bir JavaScript Library bulunabilirse, tarayıcıda çalışan çok güzel bir Sql veritabanı uygulaması ortaya çıkabilir. Tebrikler...

Sqlite Database : https://www.sqlite.org/
Test için Sqlite Manager : https://sqlitestudio.pl/

.
 
Son düzenleme:

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Zeki üstad, o tür library'ler gördüm ama çok güvenip de adamların script'lerini denemedim. Sonuçta; external script'ler ve çok uzun, içinde bir yerlerde sıkıntı yaratabilecek birşeyler olabilir diye çekindim.... açıkçası.

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
9 No'lu mesajdaki dosya revize edildi, tarayıcının depolama kapasitesi ve IndexDB'nin ne kadarını kullandığı belirtildi.

.
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Merhaba;

@Haluk beyin projesini birebir almaya çalışarak (umarım kızmaz) ama tam birebir değil ;) ReactJS projesi olarak yapmaya çalıştım. Amacım React için belki bir heveslendirme olması. Kaynak çok çok fazla ve geliştirme aşaması çok daha kolay ve canlı olarak değişiklikleri görebilirsiniz. React Native ile çalışırsanız cross-platform olur. Mobile uygulamalar için de aynı projeyi kullanabilirsiniz.
Aşağıda ufak bir geliştirme çalışması ön izlemesi ve ReactJS nin kaynak kodlarını bulabilirsiniz. Bu kaynak kodları kullanmak ve React projeleri geliştirmek için öncelikle
https://react.dev/ inceleyiniz.


react_haluk.gif
 

Ekli dosyalar

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Yok canım, kızacak bir durum yok.... bilakis memnun oldum. Lakin, ne yaptığını/nasıl çalıştıracağımı anlamadım..... Önerdiğiniz kaynaktan ReactJS'i kurcalayıp neyin ne olduğunu anlamam lazım herhalde.

.
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Yok canım, kızacak bir durum yok.... bilakis memnun oldum. Lakin, ne yaptığını/nasıl çalıştıracağımı anlamadım..... Önerdiğiniz kaynaktan ReactJS'i kurcalayıp neyin ne olduğunu anlamam lazım herhalde.

.
Verdiğim linki inceleyiniz lütfen, web ve mobil uygulamalar oluşturabilirsiniz. Başta karışık gelebilir ama alışınca superdir. Öncesinde editor ya da aslında IDE olmasa da mutlaka "Visual Studio Code" u indirip kurun. (Visual Studio değil, Visual Studio Code) Ben notepad yerine bile artık bunu kullanıyorum. VS Code ve React kullanın. Çok daha keyifli kod yazacaksınız. Tekrar okuyunca GPT gibi hissettim kendimi ama değil, benim cümlelerimdir ;)
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Ben editör olarak "Sublime Text" kullanıyorum. Fena değil....

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
Tamam, oğlum da söylüyordu ..... artık indirip bir deneyeyim. Gerçi o da Sublime kullanıyor :)

.
 

Haluk

Özel Üye
Katılım
7 Temmuz 2004
Mesajlar
12,406
Excel Vers. ve Dili
64 Bit 2010 - İngilizce
+
Google Sheets
+
JScript
Altın Üyelik Bitiş Tarihi
VSCode iyiymiş bence de..... Sublime gibi ikide bir satınalmaya yönlendirmeyecek muhtemelen. Intellisense de var sanırım, o da büyük nimet....

.
 

beab05

Özel Üye
Katılım
19 Mart 2007
Mesajlar
1,418
Excel Vers. ve Dili
Office 2013
Intellisense var elbette ama kullandığınız programlama diline göre eklentileri de ekleyin. JS için zaten yok yok.. Hatta mesela JS için en çok yüklenen eklentiler listesine bakın ona göre yükleyin.. Zaten IDE sayılır VSCode. Bir ara çok tartışıyorlardı bunu ;)
 
Üst