confirm.ajax.js i pro neajaxové odkazy?

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Šaman
Člen | 2659
+
0
-

Ahoj, jak mohu použít confirm.ajax.js z aktuální verze rozšíření nette.ajax.js univerzálně? Teď mi to funguje jen na prvky, které mají třídu ajax.

Můj vlastní script se sice spustí vždy, ale při ajaxových voláních se mi akce provede na pozadí aniž by to čekalo na odpověď konfirmačního okénka. (Ať už to navážu přímo, nebo $.nette.ext load. A before mi to nenaváže vůbec.)

/**
 * Potvrzení nebezpečných operací.
 */
$.nette.ext({
    load: function () {

		/**
		 * Potvrzovací dialog
		 * @example <a n:href="delete!, $entity->id" data-confirm="Opravdu smazat?">Odstranit</a>
		 */
		$('a[data-confirm], button[data-confirm], input[data-confirm]').click(function (e) {
			var question = $(this).attr('data-confirm');
			if (!question) {
				question = 'Opravdu?';
			}
			return confirm(question);
		});

	}
});
F.Vesely
Člen | 369
+
0
-

Ja pouzivam tohle a funguje:

$.nette.ext({
	before: function (xhr, settings) {
    	if (!settings.nette) {
        	return;
		}

		var question = settings.nette.el.data('confirm');
        if (question) {
        	return confirm(question);
        }
	}
});
Šaman
Člen | 2659
+
0
-

I pro neajaxové odkazy? Tohle je právě ten confirm.ajax.js, který mi bere jen a.ajax. Podezřívám z toho ten settings.nette, ten přece není u nezajaxovanych odkazů k dispozici…?

F.Vesely
Člen | 369
+
0
-

Jo uz te chapu, to asi bohuzel nepujde mit na jednom miste prave kvuli tomu settings.nette. Podle me budes muset mit jeste dalsi obsluhu pro neajaxove odkazy.

Šaman
Člen | 2659
+
0
-

Tak jsem si vytvořil druhý js pro potvrzování akcí. Musel jsem mu ale upravit podmínku, aby se při ajaxu nezobrazoval dialog dvakrát po sobě. Taky jsem to musel navěsit pomocí $.nette.ext({ load: function () … protože mám tato tlačítka ve snippetu. Výsledkem tedy je něco, co nefunguje buď když zapomenu inicializovat nette.init(), nebo zapomenu přilinkovat originální confirm.ajax.js a použiju třídu ajax (která v tu chvíli nedělá nic, jen blokuje můj confirm dialog). To je na můj vkus trochu moc věcí, které smrdí WTF momenty.

@VojtěchDobeš : Dá se nějak zjistit, jestli je přilinkovaný a inicializovaný nette.ajax? Nebo jak tenhle soubor upravit, aby pokrýval všechny situace? (Prvek může a nemusí mít třídu ajax, může a nemusí být použité nette.ajax a pokud ano, pak by to mělo fungovat na ajaxové i neajaxové odkazy i v případě, že jsou v překresleném snippetu).

Můj aktuální kód, který používám spolu s confirm.ajax.js:

/**
 * Potvrzení nebezpečných operací.
 */
$.nette.ext({
    load: function () {

		/**
		 * Potvrzovací dialog, který funguje jen na neajaxovbych odkazech a jen když je použito a inicializováno nette.ajax.js
		 * @example <a n:href="delete!, $entity->id" data-confirm="Opravdu smazat?">Odstranit</a>
		 */
		$('a[data-confirm]:not(.ajax), button[data-confirm]:not(.ajax),
			input[data-confirm]:not(.ajax)').click(function (e) {
			var question = $(this).attr('data-confirm');
			if (!question) {
				question = 'Opravdu?';
			}
			return confirm(question);
		});

	}
});

Editoval Šaman (1. 12. 2015 21:00)

F.Vesely
Člen | 369
+
0
-

Ja to nemam v load ale takto:

$("body").on('click','a[data-confirm]:not(.ajax)',function(){
	...
});
Šaman
Člen | 2659
+
0
-

Díky, tohle funguje. Takže jediný neošetřený stav jsou ajaxové odkazy pokud není funkční confirm.ajax.js.

Vojtěch Dobeš
Gold Partner | 1316
+
+1
-

Já bych se asi snažil vyhnout situaci, kdy nevím, jestli je nette.ajax.js přilinkovaný nebo ne. Každý kód by měl buď vědět, že ano, je to závislost, nebo ne, nic takového tu není.