Je možné v JavaScriptu uložit spouštěč po kliknutí a znovu jej použít později?

Na dynamické stránce chci zakázat a později znovu povolit sekce. Vizuálně jsou zašedlé, ale musí uživatelům zabránit v hraní si s sekcí až později.

U prvků používajících spouštěče po kliknutí by chtělo:

  • uložte aktuální spouštěč po kliknutí do atributu
  • odebrat aktuální spouštěč po kliknutí
  • přidat spouštěč, který není výchozí a nepropagovaný

pro opětovné povolení:

  • zbavte se spouštěče bez výchozího nastavení
  • znovu použijte dříve uložené pravidlo
  • vymazat atribut, kam byl uložen

Z dosavadních odpovědí:

domněnka: pomocí čisté úrovně JavaScriptu html5, bez delegování nebo nějakého jiného externího mechanismu, není možné extrahovat spouštěč při kliknutí z prvku.

Řešení

bylo velmi pokoušen delegacemi – a byl poražen tím, že nebyl schopen zabránit únikům paměti. nakonec to stejně udělal, s jednoduchým gc, aby to udělal.

rozšiřuje (add|remove)EventListener o (add|push|pop|remove)PopableEventListener, takže změna kódu je triviální. umožňuje mi posouvat a rozšiřovat posluchače na jakoukoli úroveň – skvělé pro změny kontextu formy jiné než pouze povolení/zakázaní.

zdroj:http://code.google.com/p/chess-spider/source/browse/http/scripts/popable.js

doc:http://code.google.com/p/chess-spider/wiki/PopableEventListener?ts=1303738300&updated=PopableEventListener

Redakce

Na rozdíl od většiny, co jsem viděl, by možnost přístupu k posluchačům v domku byla významným přínosem; kromě možnosti rozumně deaktivovat opětovné zapnutí by byla neuvěřitelně užitečná možnost přimět je k jinému rozsahu.

Odpověď

Nejlepší způsob, jak zvládnout stovky spouštěčů, je použít delegování událostí.

Poté prozkoumáte každé kliknutí, zda odpovídá vašemu spouštěči. Pokud se jedná o potomka zakázané sekce, zahodíte kliknutí.

Implementace jQuery by vypadala takto:

$('.trigger', document.body).live('click', function(e) {
  var target = $(e.target);
  if (target.parents('.disabled').length > 0) {
    // handle click
  }
});

Samozřejmě můžete použít jiné frameworky nebo prostý JavaScript, jak vám to nejlépe vyhovuje.