jQuery lyssna/hantera globala events från objekt?

Permalänk

jQuery lyssna/hantera globala events från objekt?

Hej!
Jag sitter med en halvkomplex webbsida och behöver lite assistans med eventhantering och Javascript. Jag behöver kunna "prenumerera" på globala events inifrån diverse javascriptobjekt.
Eventsen skickar jag i dagsläget med
$.event.trigger(.... )

.. dessa kan jag registrera mig för att lyssna på från mina objekt enligt nedan
$(document).on("minevent")..
Här är dock problemet, jag skulle vilja göra nått i stil med.
$(this/MittObjekt).on("minevent").. D.v.s jag vill kunna knyta eventlyssnaren till mitt objekt så jag även senare kan sluta lyssna.

Jag antar i min befintliga kod att jag "appendar" många lyssnare till en global eventlyssnar-lista men jag kan inte avregistrera en av dem om jag vill(?)
Hoppas ni förstår vad jag menar, det är inte helt uppenbart att förklara.
Jag har kikat på nått som heter Amplify.js men jag har svårt att greppa även där hur jag ska kunna lyssna på event inifrån objekt.

Oerhört tacksam för hjälp!

Visa signatur

Dator: MB: Gigabyte Z390 M GAMING mATX | CPU: Intel Core i9 9900K 3.6 GHz (Haswell) | RAM: Corsair 16GB (KIT) 3200Mhz Vengeance LPX | Grafikkort: ASUS GeForce RTX 3060 12GB PHOENIX V2 (LHR) | Chassi: Fractal Design Mini | PSU: Corsair RM750X 750W v2 | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U12S | Operativ: Windows 11 | Scanner: Canon Canoscan 9000F
Övrigt: Nintendo Switch, NES Mini, SNES Mini, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, PS5, AppleTV 4K, Synology NAS DS923+ (32GB), iPhone 14 Pro 128GB, LG OLED 55C2,

Permalänk
Permalänk

Jag har varit där men får inte riktigt till tankesättet hur jag ska göra.

Visa signatur

Dator: MB: Gigabyte Z390 M GAMING mATX | CPU: Intel Core i9 9900K 3.6 GHz (Haswell) | RAM: Corsair 16GB (KIT) 3200Mhz Vengeance LPX | Grafikkort: ASUS GeForce RTX 3060 12GB PHOENIX V2 (LHR) | Chassi: Fractal Design Mini | PSU: Corsair RM750X 750W v2 | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U12S | Operativ: Windows 11 | Scanner: Canon Canoscan 9000F
Övrigt: Nintendo Switch, NES Mini, SNES Mini, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, PS5, AppleTV 4K, Synology NAS DS923+ (32GB), iPhone 14 Pro 128GB, LG OLED 55C2,

Permalänk
99:e percentilen

Inte säker på att detta löser ditt problem, men det går att ta bort event listeners, så länge du har en referens till den lyssnare du vill ta bort. Exempel:

const listener = () => console.log("You clicked."); document.body.addEventListener("click", listener); document.body.removeEventListener("click", listener);

Andra argumentet måste vara en referens till precis den funktion som lades till som lyssnare i addEventListener. Det går inte att göra så här:

document.body.addEventListener("click", () => console.log("You clicked.")); document.body.removeEventListener("click", () => console.log("You clicked."));

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk

Återuppväcker den här tråden lite, det här problemet dyker upp titt som tätt, jag skulle behöva nån form av (custom) eventhantering mellan objekt i JavaScript.
Hur är det tänkt man ska göra egentligen? Anta att jag har XXXX antal objekt vars beteende ska kunna påverkas av en mängd faktorer.

Visa signatur

Dator: MB: Gigabyte Z390 M GAMING mATX | CPU: Intel Core i9 9900K 3.6 GHz (Haswell) | RAM: Corsair 16GB (KIT) 3200Mhz Vengeance LPX | Grafikkort: ASUS GeForce RTX 3060 12GB PHOENIX V2 (LHR) | Chassi: Fractal Design Mini | PSU: Corsair RM750X 750W v2 | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U12S | Operativ: Windows 11 | Scanner: Canon Canoscan 9000F
Övrigt: Nintendo Switch, NES Mini, SNES Mini, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, PS5, AppleTV 4K, Synology NAS DS923+ (32GB), iPhone 14 Pro 128GB, LG OLED 55C2,

Permalänk
Medlem

Du kan namespaca eventen i jquery, så istället för att bind on till click binder du till click.pelle

sen kör du off click.pelle

annars kan du ju också skapa en global klass där du fegistrerar dina events, så kam du använda den som karta när du ska ta bort triggers ellef lyssnare

Permalänk

Hänger inte med riktigt.. Eventhanteringen i JavaScript idag för custom events känns lite knepig, man behöver ju verkligen trigga det på varje komponent som ska ha uppdateringen, det vill jag komma ifrån.

Visa signatur

Dator: MB: Gigabyte Z390 M GAMING mATX | CPU: Intel Core i9 9900K 3.6 GHz (Haswell) | RAM: Corsair 16GB (KIT) 3200Mhz Vengeance LPX | Grafikkort: ASUS GeForce RTX 3060 12GB PHOENIX V2 (LHR) | Chassi: Fractal Design Mini | PSU: Corsair RM750X 750W v2 | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U12S | Operativ: Windows 11 | Scanner: Canon Canoscan 9000F
Övrigt: Nintendo Switch, NES Mini, SNES Mini, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, PS5, AppleTV 4K, Synology NAS DS923+ (32GB), iPhone 14 Pro 128GB, LG OLED 55C2,

Permalänk
Medlem

$(window.document).on("click.pellefant, ()=> { anonfunc})

.off("cluck.pellefant")

Permalänk

Jag vill inte nödvändigtvis knyta eventsen till just klick utan det kan vara massa andra saker som ska trigga dessa. Många objekt ska kunna "subscriba" på eventsen men även "unsubscriba".

Visa signatur

Dator: MB: Gigabyte Z390 M GAMING mATX | CPU: Intel Core i9 9900K 3.6 GHz (Haswell) | RAM: Corsair 16GB (KIT) 3200Mhz Vengeance LPX | Grafikkort: ASUS GeForce RTX 3060 12GB PHOENIX V2 (LHR) | Chassi: Fractal Design Mini | PSU: Corsair RM750X 750W v2 | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U12S | Operativ: Windows 11 | Scanner: Canon Canoscan 9000F
Övrigt: Nintendo Switch, NES Mini, SNES Mini, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, PS5, AppleTV 4K, Synology NAS DS923+ (32GB), iPhone 14 Pro 128GB, LG OLED 55C2,

Permalänk
Medlem

$(window.document).on("bamse.pellefant", ()=> { anonfunc})
$(window.document).trigger("bamse.pellefant")
$(window.document).off("bamse.pellefant")

Permalänk
Medlem

Men det du vill göra är ju att bygga ett pub/sub system. Leta reda på nåt färdigt bibliotek för det.

Det är inte supersvårt att bygga själv heller, men titta lite på olika färdiga lösningar

Permalänk
Skrivet av Ernesto:

$(window.document).on("bamse.pellefant", ()=> { anonfunc})
$(window.document).trigger("bamse.pellefant")
$(window.document).off("bamse.pellefant")

Hur skriver du detta om du vill lyssna på bamse.pellefant från 13 olika ställen och varje ställe ska kunna prenumerera/avprenumerera sig från lyssningen?
Det går väl att skriva nått själv men det hade ju varit käckt med nått som var inbyggt liksom.

Visa signatur

Dator: MB: Gigabyte Z390 M GAMING mATX | CPU: Intel Core i9 9900K 3.6 GHz (Haswell) | RAM: Corsair 16GB (KIT) 3200Mhz Vengeance LPX | Grafikkort: ASUS GeForce RTX 3060 12GB PHOENIX V2 (LHR) | Chassi: Fractal Design Mini | PSU: Corsair RM750X 750W v2 | Optisk: ASUS BW-12B1ST Blu-Ray/DVD brännare | CPU-kylare: Noctua NH-U12S | Operativ: Windows 11 | Scanner: Canon Canoscan 9000F
Övrigt: Nintendo Switch, NES Mini, SNES Mini, Nintendo New 3DS, NES, Famicom AV, Famicom Disk System, PS3, PS5, AppleTV 4K, Synology NAS DS923+ (32GB), iPhone 14 Pro 128GB, LG OLED 55C2,