Kurze Bewertung von perplexy (KI)
Anmerkung!
Variante 1 => Dein Code aus #20
Variante 2 => hänge ich mal unten an.
ZitatBeide Varianten tun funktional fast dasselbe, sind aber unterschiedlich strukturiert und haben jeweils Vor‑ und Nachteile.
Robustheit / Fehlerfälle
- Beide Varianten kapseln CustomizableUI.createWidget in try { ... } catch(e) {}, behandeln aber den Fehler nur durch Ignorieren.
- Variante 1 geht davon aus, dass document.getElementById(button_id) nach createWidget sofort existiert; wenn das fehlschlägt, gibt es keinen Klick‑Listener.
- Variante 2 prüft explizit, ob der Button existiert, und versucht es bei Fehlschlag weiter (Polling), wodurch der Listener sehr zuverlässig angehängt wird.
Bewertung: Variante 2 ist in der Praxis fehlertoleranter, weil der Klick‑Handler fast sicher gesetzt wird.
Ob DAS so stimmt? Ich kann das nicht so wirklich beurteilen.
Da müsste mal kurz ein Profi drüberschauen.
Horstmann In der langen Version der "Beurteilung" standen nur Dinge,
die meiner Meinung jetzt nicht so ausschlaggebend waren.
Ich glaube, das kannst Du Dir ja anschauen, wenn Du ganz unten den Editierbutton anklickst.
Wenn das nicht gehen sollte, ich schicke Dir die lange Version auch gerne per PN zu.
Und hier meine Variante, wobei da noch zwei Zeilen Code sind,
die ich auskommentiert habe, weil ich mich noch nicht entschieden habe!
(function() {
if (!window.gBrowser)
return;
const
// ■■ START UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
id = 'link-button-cf', // Id des Buttons
link = 'https://www.camp-firefox.de/forum/', // Linkziel des Buttons
label = 'Quicklink: camp-firefox.de/...', // Bezeichnung des Buttons
tooltiptext = 'Quicklink:\nForum - camp-firefox.de',
// Icon-------------------------------------------------------
icon = 'camp-firefox.ico', // [Name.Dateiendung] des Symbols
iconPath = '/chrome/icons/', // Pfad zum Ordner der das Icon beinhaltet
// ■■ END UserConfiguration ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
curProfDir = PathUtils.toFileURI(PathUtils.join(PathUtils.profileDir));
// Erlaubt korrekte .svg Icons Darstellung in allen UI Bereichen
if (Services.prefs.getBoolPref('svg.context-properties.content.enabled') == false) {
Services.prefs.setBoolPref('svg.context-properties.content.enabled', true );
}
//BUTTON
try {
CustomizableUI.createWidget({
id: id,
defaultArea: CustomizableUI.AREA_NAVBAR,
label: label,
tooltiptext: tooltiptext,
onCreated: (button) => {
// Optik
button.style.MozContextProperties = 'fill, stroke, fill-opacity';
button.style.listStyleImage = 'url("' + curProfDir + iconPath + icon + '")';
button.style.minWidth = 'fit-content';
}
});
} catch(e) {};
//click
(function add_button() {
// const button = document.getElementById(id);
if (button) {
// button.addEventListener('click', event => {
document.getElementById(id).addEventListener('click', event => {
if (event.button === 0) {
openTrustedLinkIn(link, "tab");
}
});
} else {
setTimeout(add_button, 100);
}
})();
})();
Alles anzeigen