Ασύγχρονη φόρτωση εικόνων στο JavaScript

Οι εικόνες που δημιουργούνται δυναμικά μέσω JavaScript, φορτώνονται επίσης ασύγχρονα. Ας εξετάσουμε για παράδειγμα τον ακόλουθο κώδικα:

javascriptlet image = document.createElement('img');
image.src = 'img.png';
document.body.appendChild(image);

Όπως βλέπετε, εδώ δημιουργούμε την ετικέτα img, γράφουμε στο src της τη διαδρομή προς την εικόνα και τοποθετούμε αυτήν την εικόνα στο body. Ωστόσο, η εικόνα δεν θα εμφανιστεί αμέσως στη σελίδα. Το γεγονός είναι ότι όταν γράψαμε στο src τη διαδρομή προς την εικόνα - το πρόγραμμα περιήγησης αρχίζει να κατεβάζει αυτήν την εικόνα από τον ιστότοπο. Μόλις η εικόνα κατεβεί, μόνο τότε το πρόγραμμα περιήγησης θα μπορέσει να την εμφανίσει.

Εάν η εικόνα είναι αρκετά μεγάλη, και η ταχύτητα διαδικτύου αρκετά μικρή, τότε ο χρήστης του ιστότοπου για κάποιο χρονικό διάστημα θα μπορέσει να "θαυμάσει" μια κενή εικόνα - μέχρι να φορτωθεί.

Στην πραγματικότητα, η ετικέτα img έχει το συμβάν load, που ενεργοποιείται όταν ολοκληρωθεί η φόρτωση της εικόνας:

javascriptlet image = document.createElement('img');
image.src = 'img.png';

image.addEventListener('load', function() {
  // θα ενεργοποιηθεί όταν φορτωθεί η εικόνα
});

Μπορούμε να το χρησιμοποιήσουμε αυτό, για να τοποθετήσουμε την εικόνα στη σελίδα, μόνο όταν αυτή η εικόνα έχει φορτωθεί:

javascriptlet image = document.createElement('img');
image.src = 'img.png';

image.addEventListener('load', function() {
  document.body.appendChild(image); // τοποθετούμε όταν φορτωθεί
});

Η εικόνα δεν είναι απαραίτητο να φορτωθεί: μπορεί να συμβεί ότι η διαδρομή προς την εικόνα είναι λανθασμένη, ή να υπάρξει διακοπή του διαδικτύου, βλάβη του διακομιστή του ιστότοπου ή κάτι παρόμοιο. Με άλλα λόγια - εξαιρετική κατάσταση. Σε αυτήν την περίπτωση, δεν θα ενεργοποιηθεί το συμβάν load, αλλά το συμβάν error:

javascriptlet image = document.createElement('img');
image.src = 'img.png';

image.addEventListener('load', function() {
  document.body.appendChild(image);
});
image.addEventListener('error', function() {
  // σφάλμα φόρτωσης εικόνας
});
Задание 1

Δημιουργήστε ένα κουμπί, upon pressing which θα φορτώνεται μια εικόνα. Εμφανίστε την εικόνα, όταν θα έχει φορτωθεί. Εμφανίστε ένα μήνυμα σε περίπτωση προβλημάτων με τη φόρτωση της εικόνας.