Autor Zpráva
SteveO
Profil *
Zdravím, používám několik jQuery load() metod pro načítání obsahu do stránky.
Potřeboval bych nastavit hromadný callback, který se spustí po dokončení libovolné z těchto metod.
Zkrátka nějaký odchytávač spuštěných metod na stránce, je to možné udělat?
Googlil jsem, ale nic... Díky.


// Samozřejmě můžu zavolat stejnou funkci v callbacku každé metody zvlášť, ale to v tomhle případě není řešení.
blaaablaaa
Profil
Google: jquery on ajax complete
A prvni odkaz
$( document ).ajaxComplete(function() {
  $( ".log" ).text( "Triggered ajaxComplete handler." );
});
SteveO
Profil *
A kdybych to nechtěl pro .load, ale třeba pro .click?
Radek9
Profil
SteveO:
Můžeš nastavit click handler třeba na document nebo rodičovský element. Za předpokladu, že nějaký handler nezavolal stopPropagation, se zavolá i ten tvůj:

$(document).click(function () {
  // kód, který se provede po kliknutí kdekoli na stránce
})

Ukázka tady: jsfiddle.net/vysfnta3/2
SteveO
Profil *
To právě nechci... Chci aby se ten kód provedl pouze pokud dojde ke kliku na některý z elementů, ke kterým byl nějaký clickevent nastaven.
Mlocik97
Profil
SteveO:
tak v tom prípade iba zmeníte selector z document na nejaký konkrétny element kde je problém?

$("#mojelement").click(function () {
  // kód, který se provede po kliknutí na #mojelement
})

pre dynamicky pridaný element podstrčíte selector v parametri:

$(document).on('click', '#mojelement', function () {
  // kód, který se provede po kliknutí na #mojelement
})
SteveO
Profil *
Chci zachytit, že proběhl některý z nastavených onClicků. Ne libovolný klik na stránce, ale pouze ten, u kterého bylo něco nastaveno.
Nebo výše - že proběhl některý z nastavených onLoadů (tam se to vyřeší tím ajaxCompletem).
Mlocik97
Profil
SteveO:
ah, moje chyba, ten komentár som nezmenil, kód čo som poslal hore sa provede len pri kliknutí na #mojelement teda napríklad po kliknutí na:

<button id="mojelement">neco</button>


SteveO:
www.w3schools.com/jquery/tryit.asp?filename=tryjquery_hide_p
SteveO
Profil *
Ale já chci, aby se nějaký kód provedl vždycky, i když budu třeba 10 různých onclicků na 10 různých elementech.
Prostě chci zachytit, že došlo k nějakému kliknutí, ke kterému byla předtím nastavena událost.
Mlocik97
Profil
SteveO:
tak použijete class, ktorý nastavíte viacerým elementom. Trebárs aj tým desiatim.

$(".mojelementy").click(function () {
  // kód, který se provede po kliknutí na .mojeelementy
})
$("#inyelement").click(function () {
  // kód, který se provede po kliknutí na #inyelement
})


<div class="mojeelementy">jedna</div>
<div>dva</div>
<div class="mojeelementy">tri</div>
<div id="inyelement">štyri</div>


kód kde mám prvý koment sa vykoná po kliknutí na text "jedna" aj na text "tri".
SteveO
Profil *
To všechno samozřejmě vím, ale nechci ty elementy nějak hromadně určovat.
Potřebuju prostě jen spustit určitý kód v okamžiku proběhnutí nějaké nadefinované události, bez toho, abych do kódů těchto událostí nějak zasahoval nebo si vytvářel pomocnou třídu nebo cokoli jiného. :-)
Mlocik97
Profil
SteveO:
fakt nerozumím čo chcete...


"Potřeboval bych nastavit hromadný callback, který se spustí po dokončení libovolné z těchto metod."

počkať vy chcete callback? tak to stačí aby si do parametru funkcie pridal ďalšiu funkciu

$("#mojelement").click(function () {
  $("#neco").fadeOut('slow', function () {
    $("#druhy").fadeIn();
  });
})

chcete neco takéto? (po skončení funkcie fadeOut sa zavolá druhá funkcia fadeIn..) prípadne použíť ".then" alebo "=>"
Keeehi
Profil
SteveO:
Nativní javascript to neumí. Pokud ten původní kód má v sobě něco jako element.onclick = function ... tak se k tomu nedostaneš. JS frameworky (jako třeba jQuery) to řeší tak, že když jejich pomocí navěsíš na element událost $(element).on("click", function .... tak si sami drží v paměti, takže je pak dokáží vrátit. Důležité je, že musí být zaregistrované skrz framework. Takže záleží na tom zdrojovém kódu který nechceš měnit, zda všude a důsledně váže události jen skrze jQuery. No a jak to pak z jQuery dostat, to evidentně záleží na použité verzi.

Jen trochu obsáhlejší povídání o tom co jsem zde přepsal najdeš coderwall.com/p/b1o2gw/getting-a-list-of-your-eventlisteners-so-you-can-trigger-it-programmatically

Kéž by tu byl Chamurappi
SteveO
Profil *
Mám třeba tyhle události:

$("#mujelement1").click(function () {});
$("#mujelement2").click(function () {});
$("#mujelement3").click(function () {});
$("#mujelement4").click(function () {});
$("#mujelement5").click(function () {});

A chci zachytit, že k některé z těchto 5 nadefinovaných událostí došlo. Bez toho, abych musel znát ID těch elementů nebo mít nějakou pomocnou třídu.

Prostě chci spustit kód ve chvíli, když se spustí nějaká onClick událost, která byla někdy dřív definována. Prostě něco jako "on-onclick" :)


Keeehi: Díky, s tímhle bych se k tomu asi dopracoval:

    1.3.x

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, value) {
        alert(value) // alerts "function() { alert('clicked!') }"
    })

    1.4.x (stores the handler inside an object)

    // inspect
    var clickEvents = $(element).data("events").click;
    jQuery.each(clickEvents, function(key, handlerObj) {
        alert(handlerObj.handler) // alerts "function() { alert('clicked!') }"
        // also available: handlerObj.type, handlerObj.namespace
    })
Keeehi
Profil
Mlocik97:
Jenže SteveO řeší úplně jiný problém. Respektive má určitá omezení a ta mu nedovolují použít tebou navrhované řešení. Představ si to asi takto. Nějaký vývojář vyvine třeba javascriptovou galerii obrázků. Je to kompletní dílo, které funguje samo o sobě. No a teď přichází SteveO a chce pro tuto galerii vytvořit nějaký plugin. Jenže ten tvůrce té galerie nevytvořil žádný systém pro přidávání pluginů. Takže SteveO by chtěl poslouchat který event v té galerii zrovna proběhl a ve správnou chvíli provést nějakou svojí akci. Důležité ale je právě to jeho omezení, že do samotného kódu galerie nemůže zasahovat ale chce to jen z venčí pozorovat.

Samozřejmě se dá namítnout že když zná ty elementy na které jsou v galerii navázané události tak si může na stejné elementy navázat svoje události a vyjde ho to nastejno. Jenže zde přichází to druhé omezení a to, že SteveO ty elementy nezná. On totiž reálně nedělá plugin ke galerii ale něco jiného co se váže k něčemu zřejmě méně rigidnímu než je galerie.
Mlocik97
Profil
Keeehi:
konečne niekto, kto mi zmysluplne popsal problém ktorý tazatel má.
SteveO
Profil *
Ještě doplním, že i když ty elementy třeba znám, tak se konkrétně na ně nechci omezit už kvůli budoucím potenciálním změnám - když se přidá další event, tak aby i na něj platilo to odposlouchávání.
blaaablaaa
Profil
SteveO:
Spíš to tady vypadá, že jde o špatný návrh/logiku. Můžeš napsat prakticky, k čemu to chceš použít? Třeba jde o špatný způsob a existuje elegantnější řešení, protože mi nepřijde, že bys řešil něco, co popisuje Keeehi.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0