Javascript İle Dinamik Bir Etkileşimli Not Defteri Uygulaması Nasıl Yapılır?

Javascript İle Dinamik Bir Etkileşimli Not Defteri Uygulaması Nasıl Yapılır?
Javascript İle Dinamik Bir Etkileşimli Not Defteri Uygulaması Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce modern bir tarayıcı (Chrome, Firefox veya Edge) ve bir kod editörü (VS Code önerilir) yeterlidir. Javascript kodlarımızı ES6+ standartlarında yazacağız; bu nedenle güncel sözdizimlerini kullanacağız.

  • HTML5: Uygulamanın iskeletini oluşturmak için.
  • CSS3: Arayüzün görselleştirilmesi için.
  • LocalStorage API: Verilerin tarayıcıda kalıcı olarak saklanması için.
  • ES6+ Javascript: Mantıksal işlemler ve DOM yönetimi için.

Dosya yapınızı index.html, style.css ve app.js şeklinde oluşturarak başlayabilirsiniz. Bu yapı, kodun okunabilirliğini ve yönetilebilirliğini artıracaktır.

Adım 1: Uygulamanın HTML İskeletini Oluşturma

Dinamik bir uygulama için öncelikle not girişi yapılacak bir alan ve notların listeleneceği bir konteyner oluşturmalıyız. HTML tarafında input, button ve notların ekleneceği bir ul etiketi kullanacağız.

Not Defterim

Ekle

    Bu kod bloğu, kullanıcının veri girişi yapabileceği alanı ve bu verilerin dinamik olarak ekleneceği listeyi tanımlar. id değerleri, Javascript tarafında bu elementleri seçmemizi sağlayacaktır.

    Adım 2: Javascript ile Not Ekleme Mantığı

    Kullanıcı "Ekle" butonuna tıkladığında, girdi alanındaki değeri alıp listeye eklememiz gerekir. Javascript'te addEventListener yöntemini kullanarak butonun tıklanma olayını dinleyeceğiz.

    const addBtn = document.getElementById('addBtn');
    const noteInput = document.getElementById('noteInput');
    const noteList = document.getElementById('noteList');
    
    addBtn.addEventListener('click', () => {
        const noteText = noteInput.value;
        if (noteText === '') return; // Boş not eklenmesini engelle
    
        const li = document.createElement('li');
        li.textContent = noteText;
        noteList.appendChild(li);
        noteInput.value = ''; // Giriş alanını temizle
    });

    Bu kod, kullanıcıdan alınan veriyi DOM'a bir liste elemanı olarak ekler. Ancak bu yöntemle notlar sadece o an için ekranda kalır; sayfa yenilendiğinde veriler kaybolur. Bunu çözmek için LocalStorage kullanacağız.

    Adım 3: LocalStorage ile Veri Kalıcılığı Sağlama

    LocalStorage, tarayıcıda anahtar-değer (key-value) çiftleri şeklinde veri saklamamıza olanak tanır. Notlarımızı bir dizi (array) içerisinde tutup, bu diziyi JSON formatında kaydedeceğiz.

    let notes = JSON.parse(localStorage.getItem('myNotes')) || [];
    
    function saveNotes() {
        localStorage.setItem('myNotes', JSON.stringify(notes));
    }
    
    function renderNotes() {
        noteList.innerHTML = '';
        notes.forEach((note, index) => {
            const li = document.createElement('li');
            li.textContent = note;
            noteList.appendChild(li);
        });
    }

    Burada JSON.stringify ile diziyi metne çevirip kaydediyoruz, JSON.parse ile ise veriyi geri alırken tekrar diziye dönüştürüyoruz. Bu, verilerin kalıcı olmasını sağlayan en kritik adımdır.

    Adım 4: Not Silme ve Etkileşimli Arayüz

    Not defterinin etkileşimli olması için eklenen notların silinebilmesi gerekir. Her notun yanına bir silme butonu ekleyerek bu işlemi gerçekleştirebiliriz.

    function deleteNote(index) {
        notes.splice(index, 1);
        saveNotes();
        renderNotes();
    }
    
    // renderNotes fonksiyonu içinde buton ekleme:
    const deleteBtn = document.createElement('button');
    deleteBtn.textContent = 'Sil';
    deleteBtn.onclick = () => deleteNote(index);
    li.appendChild(deleteBtn);

    splice metodu, diziden belirli bir indeksteki elemanı silmemizi sağlar. Ardından saveNotes ile güncel durumu LocalStorage'a yazar ve renderNotes ile arayüzü tazeleriz.

    Karşılaştırma: Tarayıcı Depolama Yöntemleri

    Not defteri uygulamanızda veri saklamak için farklı yöntemler mevcuttur. Aşağıdaki tablo, bu yöntemlerin temel farklarını göstermektedir.

    Yöntem Kapasite Kalıcılık Kullanım Alanı
    LocalStorage ~5MB Süresiz Notlar, Ayarlar
    SessionStorage ~5MB Sekme kapanana kadar Geçici form verileri
    Cookies 4KB Belirlenen süre Oturum yönetimi

    Güvenlik ve Performans Uyarıları

    Kritik Uyarı: Tarayıcı tabanlı depolama (LocalStorage) kullanıcı tarafından manipüle edilebilir. Uygulamanızda hassas veriler (şifre, kişisel kimlik bilgisi vb.) asla LocalStorage üzerinde saklanmamalıdır. Ayrıca, kullanıcıdan alınan verileri DOM'a eklerken innerHTML yerine textContent kullanarak XSS (Cross-Site Scripting) saldırılarına karşı önlem almalısınız.

    Sıkça Sorulan Sorular

    LocalStorage verileri ne kadar süre saklanır?

    LocalStorage verileri, kullanıcı tarayıcı önbelleğini temizleyene veya siz kod ile veriyi silene kadar kalıcıdır.

    Uygulamayı nasıl daha gelişmiş hale getirebilirim?

    Notlara tarih damgası ekleyebilir, notları kategorize edebilir veya bir "tamamlandı" durumu ekleyerek yapılacaklar listesine dönüştürebilirsiniz.

    Neden JSON.stringify kullanıyoruz?

    LocalStorage sadece metin (string) verileri saklayabilir. Diziler ve nesneler metin formatına dönüştürülmeden kaydedilemez.

    XSS saldırısı nedir ve nasıl korunurum?

    XSS, kötü niyetli kodların web sayfanıza enjekte edilmesidir. Kullanıcıdan gelen veriyi doğrudan HTML olarak işlemek yerine textContent kullanarak tarayıcının veriyi sadece metin olarak algılamasını sağlayın.

    Bu uygulama mobil cihazlarda çalışır mı?

    Evet, yazdığımız Javascript kodları tarayıcı tabanlıdır ve tüm modern mobil tarayıcılarda sorunsuz çalışır. CSS tarafında medya sorguları (media queries) kullanarak tasarımı mobil uyumlu hale getirebilirsiniz.

    Uygulama Performansını Optimize Etme ve Hata Ayıklama

    Not defteri uygulamanız büyüdükçe, özellikle localStorage üzerinde tutulan veri miktarı arttığında, tarayıcı performansı üzerinde gözle görülür bir yük oluşabilir. Kullanıcı deneyimini korumak için veri okuma ve yazma işlemlerini optimize etmeniz gerekir.

    DOM Güncellemelerinde Verimlilik

    Her not eklendiğinde veya silindiğinde tüm listeyi DOM'dan silip yeniden oluşturmak (re-rendering) maliyetli bir işlemdir. Bunun yerine, sadece değişen öğeyi hedefleyen bir yapı kurmalısınız. Aşağıdaki örnek, tüm listeyi temizlemek yerine sadece ilgili notu DOM'dan kaldırmanın bir yolunu gösterir:

    function deleteNote(noteId) {
        // DOM'dan sadece ilgili öğeyi seç ve kaldır
        const noteElement = document.getElementById(`note-${noteId}`);
        if (noteElement) {
            noteElement.remove();
        }
        
        // LocalStorage verisini güncelle
        let notes = JSON.parse(localStorage.getItem('notes')) || [];
        notes = notes.filter(note => note.id !== noteId);
        localStorage.setItem('notes', JSON.stringify(notes));
    }

    Hata Ayıklama (Debugging) İpuçları

    Uygulamanızda beklenmedik davranışlar oluştuğunda, tarayıcının geliştirici araçlarını (F12) etkin kullanmak hayat kurtarıcıdır. Özellikle localStorage içeriğini anlık olarak izlemek için şu adımları takip edebilirsiniz:

    • Application Sekmesi: Chrome veya Edge tarayıcılarında "Application" sekmesine giderek "Local Storage" kısmından verilerin doğru formatta kaydedilip kaydedilmediğini kontrol edin.
    • Console Logları: Veri işleme fonksiyonlarınızın içine console.table(notes) komutunu ekleyerek verilerin dizi yapısını görselleştirin.
    • Try-Catch Blokları: JSON.parse() işlemi sırasında veri bozulması (corruption) yaşanabilir. Bu durumu yönetmek için hata yakalayıcılar kullanın:
    try {
        const savedNotes = JSON.parse(localStorage.getItem('notes'));
        if (!Array.isArray(savedNotes)) throw new Error("Veri formatı hatalı");
    } catch (e) {
        console.error("Notlar yüklenemedi, varsayılan boş dizi kullanılıyor:", e);
        localStorage.setItem('notes', JSON.stringify([]));
    }

    Uygulamayı Yayına Alma (Deployment) Süreci

    Not defteri uygulamanızı yerel bilgisayarınızdan çıkarıp internete açmak için çeşitli ücretsiz platformlar mevcuttur. Uygulamanız sadece istemci tarafında (Client-side) çalıştığı için herhangi bir sunucu (Node.js, PHP vb.) kurulumuna ihtiyaç duymazsınız.

    Statik Hosting Seçenekleri

    Uygulamanızı hızlıca yayına almak için şu servisleri kullanabilirsiniz:

    1. GitHub Pages: Projenizi bir GitHub deposuna yükleyerek "Settings" kısmından "Pages" özelliğini aktif edebilirsiniz.
    2. Netlify: Sürükle-bırak yöntemiyle veya GitHub entegrasyonu ile saniyeler içinde yayına alabilirsiniz.
    3. Vercel: Modern web projeleri için optimize edilmiş, hızlı bir dağıtım platformudur.
    Önemli Not: Uygulamanızı yayına alırken index.html dosyanızın kök dizinde olduğundan ve tüm CSS/JS dosyalarınızın göreceli (relative) yollarla çağrıldığından emin olun. Örneğin: src="./script.js" şeklinde tanımlama yapın.

    Dağıtım Öncesi Kontrol Listesi

    • Minification: CSS ve JS dosyalarınızı küçülterek (minify) yüklenme süresini azaltın.
    • Favicon: Uygulamanızın tarayıcı sekmesinde profesyonel görünmesi için bir favicon ekleyin.
    • Meta Etiketleri: SEO uyumluluğu için etiketlerini içerisine yerleştirin.

    Sonuç

    Bu rehberde, Javascript ile dinamik bir etkileşimli not defteri uygulaması nasıl yapılır sorusunu temelden alarak pratik bir şekilde işledik. DOM manipülasyonu, olay dinleyicileri ve LocalStorage kullanımı, web geliştirme kariyerinizde karşınıza çıkacak pek çok projenin temelini oluşturur.

    Bir sonraki adım olarak, bu uygulamaya bir veritabanı (Firebase veya Supabase gibi) entegre ederek verilerin cihazlar arası senkronize olmasını sağlayabilir veya CSS ile notlara animasyonlar ekleyerek kullanıcı deneyimini bir üst seviyeye taşıyabilirsiniz.

    Not: Yazılım geliştirme süreçlerinde güvenlik sorumluluğu geliştiriciye aittir. Üretim ortamına geçmeden önce verilerin doğrulanması ve yetkilendirme katmanlarının oluşturulması hayati önem taşır.

    Bu yazıya tepkinizi paylaşın:
    Zeynep Kaya

    Hobi projeleri ve kendin yap (DIY) içerikleri üzerine uzmanlaşmış bir içerik editörüyüm. Adım adım rehberlerle okuyucuların teknik becerilerini geliştirmelerine yardımcı oluyorum.

    Yorumlar (0)

    Yorum Yaz