Bab 6: HTML5 APIs dan Advanced Features
Bab 6: HTML5 APIs dan Advanced Features
6.1 Storage APIs
6.1.1 LocalStorage
// Menyimpan data
localStorage.setItem('username', 'john_doe');
localStorage.setItem('preferences', JSON.stringify({
    theme: 'dark',
    fontSize: '16px'
}));
// Mengambil data
const username = localStorage.getItem('username');
const preferences = JSON.parse(localStorage.getItem('preferences'));
// Menghapus data
localStorage.removeItem('username');
// Menghapus semua data
localStorage.clear();
// Event listener untuk storage changes
window.addEventListener('storage', (e) => {
    console.log('Storage changed:', e.key, e.newValue);
});6.1.2 SessionStorage
// Menyimpan data sesi
sessionStorage.setItem('cartItems', JSON.stringify([
    { id: 1, name: 'Product 1' },
    { id: 2, name: 'Product 2' }
]));
// Mengambil data sesi
const cartItems = JSON.parse(sessionStorage.getItem('cartItems'));
// Menghapus data sesi
sessionStorage.removeItem('cartItems');
// Menghapus semua data sesi
sessionStorage.clear();6.1.3 IndexedDB
// Membuka database
const request = indexedDB.open('MyDatabase', 1);
request.onerror = (event) => {
    console.error('Database error:', event.target.error);
};
request.onupgradeneeded = (event) => {
    const db = event.target.result;
    
    // Membuat object store
    const store = db.createObjectStore('customers', {
        keyPath: 'id',
        autoIncrement: true
    });
    
    // Membuat index
    store.createIndex('name', 'name', { unique: false });
    store.createIndex('email', 'email', { unique: true });
};
request.onsuccess = (event) => {
    const db = event.target.result;
    
    // Menambah data
    const transaction = db.transaction(['customers'], 'readwrite');
    const store = transaction.objectStore('customers');
    
    store.add({
        name: 'John Doe',
        email: 'john@example.com'
    });
    
    // Mengambil data
    const getRequest = store.get(1);
    getRequest.onsuccess = () => {
        console.log('Customer:', getRequest.result);
    };
};6.1.4 Cache API
// Menyimpan response ke cache
caches.open('my-cache').then(cache => {
    cache.add('/styles.css');
    cache.add('/script.js');
    
    // Atau menggunakan addAll
    cache.addAll([
        '/',
        '/styles.css',
        '/script.js',
        '/images/logo.png'
    ]);
});
// Mengambil data dari cache
caches.match('/styles.css')
    .then(response => {
        if (response) {
            return response;
        }
        return fetch('/styles.css');
    });
// Service Worker dengan Cache
self.addEventListener('fetch', event => {
    event.respondWith(
        caches.match(event.request)
            .then(response => response || fetch(event.request))
    );
});6.2 Drag and Drop
6.2.1 Draggable Elements
<!-- Element yang bisa di-drag -->
<div draggable="true" id="dragMe">
    Drag saya!
</div>
<script>
const element = document.getElementById('dragMe');
element.addEventListener('dragstart', (e) => {
    e.dataTransfer.setData('text/plain', e.target.id);
    e.target.classList.add('dragging');
});
element.addEventListener('dragend', (e) => {
    e.target.classList.remove('dragging');
});
</script>6.2.2 Drop Zones
<div id="dropZone" class="drop-zone">
    Drop di sini!
</div>
<script>
const dropZone = document.getElementById('dropZone');
dropZone.addEventListener('dragover', (e) => {
    e.preventDefault();
    e.dataTransfer.dropEffect = 'move';
});
dropZone.addEventListener('drop', (e) => {
    e.preventDefault();
    const id = e.dataTransfer.getData('text/plain');
    const draggableElement = document.getElementById(id);
    dropZone.appendChild(draggableElement);
});
</script>6.2.3 File Drag and Drop
<div id="fileDropZone" class="file-drop-zone">
    Drop file di sini
</div>
<script>
const fileDropZone = document.getElementById('fileDropZone');
fileDropZone.addEventListener('dragover', (e) => {
    e.preventDefault();
    fileDropZone.classList.add('drag-over');
});
fileDropZone.addEventListener('dragleave', () => {
    fileDropZone.classList.remove('drag-over');
});
fileDropZone.addEventListener('drop', (e) => {
    e.preventDefault();
    fileDropZone.classList.remove('drag-over');
    
    const files = Array.from(e.dataTransfer.files);
    handleFiles(files);
});
function handleFiles(files) {
    files.forEach(file => {
        if (file.type.startsWith('image/')) {
            const reader = new FileReader();
            reader.onload = (e) => {
                const img = document.createElement('img');
                img.src = e.target.result;
                fileDropZone.appendChild(img);
            };
            reader.readAsDataURL(file);
        }
    });
}
</script>6.3 Geolocation dan Device APIs
6.3.1 Geolocation API
// Mengecek dukungan Geolocation
if ('geolocation' in navigator) {
    // Get current position
    navigator.geolocation.getCurrentPosition(
        // Success callback
        (position) => {
            const latitude = position.coords.latitude;
            const longitude = position.coords.longitude;
            console.log(`Location: ${latitude}, ${longitude}`);
        },
        // Error callback
        (error) => {
            console.error('Error:', error.message);
        },
        // Options
        {
            enableHighAccuracy: true,
            timeout: 5000,
            maximumAge: 0
        }
    );
    
    // Watch position
    const watchId = navigator.geolocation.watchPosition(
        (position) => {
            console.log('Updated location:', position);
        },
        (error) => {
            console.error('Error:', error);
        }
    );
    
    // Stop watching
    navigator.geolocation.clearWatch(watchId);
}6.3.2 Device Orientation
window.addEventListener('deviceorientation', (event) => {
    // Alpha: rotation around z-axis
    const alpha = event.alpha;
    // Beta: front back motion
    const beta = event.beta;
    // Gamma: left to right
    const gamma = event.gamma;
    
    console.log(`Orientation: α: ${alpha}, β: ${beta}, γ: ${gamma}`);
});
window.addEventListener('devicemotion', (event) => {
    // Acceleration
    const x = event.acceleration.x;
    const y = event.acceleration.y;
    const z = event.acceleration.z;
    
    // Acceleration including gravity
    const gx = event.accelerationIncludingGravity.x;
    const gy = event.accelerationIncludingGravity.y;
    const gz = event.accelerationIncludingGravity.z;
    
    console.log(`Motion: x: ${x}, y: ${y}, z: ${z}`);
});6.3.3 Battery Status
if ('getBattery' in navigator) {
    navigator.getBattery().then(battery => {
        // Battery level
        console.log('Battery level:', battery.level * 100 + '%');
        
        // Charging status
        console.log('Battery charging:', battery.charging);
        
        // Events
        battery.addEventListener('levelchange', () => {
            console.log('Battery level changed:', battery.level);
        });
        
        battery.addEventListener('chargingchange', () => {
            console.log('Battery charging status:', battery.charging);
        });
    });
}6.3.4 Media Capture
<!-- Camera capture -->
<input type="file" accept="image/*" capture="user">
<!-- Video capture -->
<input type="file" accept="video/*" capture="environment">
<!-- Using MediaDevices API -->
<video id="videoElement"></video>
<script>
if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
    navigator.mediaDevices.getUserMedia({ video: true })
        .then(stream => {
            const video = document.getElementById('videoElement');
            video.srcObject = stream;
        })
        .catch(error => {
            console.error('Error accessing camera:', error);
        });
}
</script>Latihan Praktik
Latihan 1: Todo App dengan LocalStorage
Buat aplikasi todo list yang:
Menyimpan tasks di LocalStorage
Mendukung CRUD operations
Memiliki fitur drag and drop untuk mengatur urutan
Menyimpan preferensi pengguna
Latihan 2: File Upload dengan Drag and Drop
Buat sistem upload file yang:
Mendukung drag and drop
Menampilkan preview untuk gambar
Memiliki progress indicator
Mendukung multiple files
Latihan 3: Location-based Service
Buat aplikasi yang:
Menggunakan Geolocation API
Menampilkan lokasi di peta
Menghitung jarak ke titik tertentu
Memperbarui lokasi secara real-time
Ringkasan Bab
Storage APIs menyediakan berbagai opsi penyimpanan data
Drag and Drop API memungkinkan interaksi yang intuitif
Geolocation dan Device APIs memberikan akses ke fitur perangkat
HTML5 APIs memperkaya pengalaman pengguna
Quiz Bab 6
Apa perbedaan antara localStorage dan sessionStorage?
Bagaimana cara implementasi drag and drop untuk file?
Jelaskan penggunaan Geolocation API!
Apa fungsi dari Battery Status API?
Bagaimana cara mengakses kamera menggunakan Media Capture?
Referensi
Last updated
Was this helpful?