NESPUSTÍVEJTE SKUTEČNÉ NÁZVY UDÁLOSTÍ POMOCÍ JQUERY!

Někdy nám sady nástrojů JavaScriptu poskytnou tolik funkcí, že se z nich můžeme zamotat, pokud si nedáme pozor. Čím více funkcí v rámci sady nástrojů používáme, tím větší je příležitost, aby jedna sada změn nebo doplňků ovlivnila jinou. To platí zejména tehdy, když svůj kód udržujete po dobu let. Jednou chybou, kterou často vidím, je použití trigger jQuery , metoda, která umožňuje vývojářům spustit registrovanou událost. Je skvělé, že to můžete udělat, ale NESPUŠTĚJTE NÁZVY SKUTEČNÝCH UDÁLOSTÍ!

Poznámka: Jsem si vědom toho, že tuto funkci poskytují jiné sady nástrojů – používám pouze jQuery jako příklad kvůli jeho popularitě a nedávnému problému, který jsem viděl. To se může stát s jakoukoli sadou nástrojů. MooTools používá fireEvent , atd.

Následuje ukázkový příklad použití trigger ke splnění úkolu:

// Set up a click event
jQuery('.tabs a').on('click', function() {
	// Switch to the tab, load some content, whatever	
});

// Trigger a click on the last one
jQuery('.tabs a').last().trigger('click');

Výše uvedené by otevřelo danou kartu v tomto indexu. Naprosto chápu, proč lidé používají trigger pro tento typ věcí; je to obvykle proto, že funkce pro spuštění uvedeného otevření není globálně dostupná a spuštění události je snadné a vždy dostupné. Problém je, že použití skutečných jmen událostí jako spouštěče může ...spustit... nějaké šílené sračky. Řekněme, že toto je přidáno někde jinde na webu:

// Listen to all clicks in the body
jQuery('body').on('click', 'a', function() {
	// Do some logic

	// Condition met, do something drastic!
	if(conditionMet) {
		// Reload the page?
		// Open a submenu?
		// Submit a form?
		// ... you get the idea
	}
});

Nyní máme problém -- kliknutí spouštěče karty poslouchá něco zcela samostatného a teď máme potíže. Fuj. Nejlepší řešení, pokud potřebujete použít trigger poskytuje vlastní název události spolu s nativní událostí:

// Set up a click event with an additional custom event
jQuery('.tabs a').on('click tabs-click', function() {
	// Switch to the tab, load some content, whatever	
});

// Trigger a fake click on the last one
jQuery('.tabs a').last().trigger('tabs-click');

Spouštěč události nyní nebude způsobovat konflikty s ostatními posluchači na stránce. Vyhrazený vývojář ve mně říká, že se možná budete chtít vyhnout trigger (a jeho další protějšky ze sady nástrojů) dohromady, ale přidání vlastního názvu události je to nejmenší, co byste měli udělat!

Alternativní:triggerHandler

Pokud používáte konkrétně jQuery, můžete také použít triggerHandler jQuery metoda, která spouští událost, ale pouze ty, které jsou registrované prostřednictvím jQuery, a s následujícími upozorněními:

  • .triggerHandler() metoda nezpůsobí výchozí chování události (jako je odeslání formuláře).
  • Zatímco .trigger() bude fungovat se všemi prvky odpovídajícími objektu jQuery .triggerHandler() ovlivní pouze první odpovídající prvek.
  • Události vytvořené pomocí .triggerHandler() nevytvářejte bubliny v hierarchii DOM; pokud je cílový prvek nezpracovává přímo, nedělají nic.
  • Místo vracení objektu jQuery (aby bylo umožněno řetězení), .triggerHandler() vrátí jakoukoli hodnotu, kterou vrátil poslední obslužný program, který způsobil provedení. Pokud nejsou spuštěny žádné ovladače, vrátí undefined

.triggerHandler() metoda je způsob, jak jQuery předcházet problémům, které trigger může vytvořit.