potential fix for emojis sometimes not loading properly
This commit is contained in:
@@ -37,6 +37,9 @@ class CommentSystem {
|
|||||||
this.customEmojis[e.name] = e.url;
|
this.customEmojis[e.name] = e.url;
|
||||||
});
|
});
|
||||||
console.log('Loaded Emojis:', this.customEmojis);
|
console.log('Loaded Emojis:', this.customEmojis);
|
||||||
|
|
||||||
|
// Preload images to prevent NS Binding Aborted errors
|
||||||
|
this.preloadEmojiImages();
|
||||||
} else {
|
} else {
|
||||||
this.customEmojis = {};
|
this.customEmojis = {};
|
||||||
}
|
}
|
||||||
@@ -46,6 +49,17 @@ class CommentSystem {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
preloadEmojiImages() {
|
||||||
|
// Preload all emoji images into browser cache
|
||||||
|
if (!this.customEmojis) return;
|
||||||
|
|
||||||
|
Object.values(this.customEmojis).forEach(url => {
|
||||||
|
const img = new Image();
|
||||||
|
img.src = url;
|
||||||
|
// No need to append to DOM, just loading into cache
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// ...
|
// ...
|
||||||
|
|
||||||
renderEmoji(match, name) {
|
renderEmoji(match, name) {
|
||||||
@@ -645,13 +659,37 @@ class CommentSystem {
|
|||||||
if (actions) {
|
if (actions) {
|
||||||
actions.prepend(trigger);
|
actions.prepend(trigger);
|
||||||
|
|
||||||
|
// Create picker once and cache it
|
||||||
|
let picker = null;
|
||||||
|
let closeHandler = null;
|
||||||
|
|
||||||
trigger.addEventListener('click', (e) => {
|
trigger.addEventListener('click', (e) => {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
let picker = container.querySelector('.emoji-picker');
|
|
||||||
|
// If picker already exists, toggle visibility
|
||||||
if (picker) {
|
if (picker) {
|
||||||
picker.remove();
|
const isVisible = picker.style.display !== 'none';
|
||||||
|
if (isVisible) {
|
||||||
|
picker.style.display = 'none';
|
||||||
|
if (closeHandler) {
|
||||||
|
document.removeEventListener('click', closeHandler);
|
||||||
|
closeHandler = null;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
picker.style.display = 'block';
|
||||||
|
closeHandler = (ev) => {
|
||||||
|
if (!picker.contains(ev.target) && ev.target !== trigger) {
|
||||||
|
picker.style.display = 'none';
|
||||||
|
document.removeEventListener('click', closeHandler);
|
||||||
|
closeHandler = null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
setTimeout(() => document.addEventListener('click', closeHandler), 0);
|
||||||
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Create picker only once
|
||||||
picker = document.createElement('div');
|
picker = document.createElement('div');
|
||||||
picker.className = 'emoji-picker';
|
picker.className = 'emoji-picker';
|
||||||
|
|
||||||
@@ -661,6 +699,14 @@ class CommentSystem {
|
|||||||
const img = document.createElement('img');
|
const img = document.createElement('img');
|
||||||
img.src = url;
|
img.src = url;
|
||||||
img.title = `:${name}:`;
|
img.title = `:${name}:`;
|
||||||
|
img.loading = 'lazy'; // Use native lazy loading
|
||||||
|
|
||||||
|
// Add error handling for failed loads
|
||||||
|
img.onerror = () => {
|
||||||
|
console.warn(`Failed to load emoji: ${name}`);
|
||||||
|
img.style.display = 'none';
|
||||||
|
};
|
||||||
|
|
||||||
img.onclick = (ev) => {
|
img.onclick = (ev) => {
|
||||||
ev.stopPropagation();
|
ev.stopPropagation();
|
||||||
textarea.value += ` :${name}: `;
|
textarea.value += ` :${name}: `;
|
||||||
@@ -672,15 +718,17 @@ class CommentSystem {
|
|||||||
picker.innerHTML = '<div style="padding:5px;color:white;font-size:0.8em;">No emojis found</div>';
|
picker.innerHTML = '<div style="padding:5px;color:white;font-size:0.8em;">No emojis found</div>';
|
||||||
}
|
}
|
||||||
|
|
||||||
const closeHandler = (ev) => {
|
trigger.after(picker);
|
||||||
|
|
||||||
|
// Set up close handler
|
||||||
|
closeHandler = (ev) => {
|
||||||
if (!picker.contains(ev.target) && ev.target !== trigger) {
|
if (!picker.contains(ev.target) && ev.target !== trigger) {
|
||||||
picker.remove();
|
picker.style.display = 'none';
|
||||||
document.removeEventListener('click', closeHandler);
|
document.removeEventListener('click', closeHandler);
|
||||||
|
closeHandler = null;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
setTimeout(() => document.addEventListener('click', closeHandler), 0);
|
setTimeout(() => document.addEventListener('click', closeHandler), 0);
|
||||||
|
|
||||||
trigger.after(picker);
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user