nette.ajax.js – alt. obsluha pro AJAX s jQuery

cubic
Člen | 45
+
0
-

Procházel jsem to tady jen zběžně, snad už tady tahle chyba nebyla.

https://github.com/…772628bd40b2

S úpravou je problém v IE8.
Mám v e-shopu košík. První formulář je výběr dopravy, ajaxový, v něm radio buttony. Uživatel klikne, odešle se request a invaliduje se druhý formulář s výběrem platby závislé na dopravě. Pokud chce teď uživatel vybrat druh platby, IE8 vrací chybu „Objekt tuto akci nepodporuje“ a ukazuje na zmíněný řádek.
První formulář projde bez problémů, oba se přitom odesílají stejně a jsou až na URL a jiné radio buttony totožné. Tipuji tedy, že to má souvislost s invalidací.

Jakmile jsem z onsubmit(e) smazal e, vše funguje správně ve všech prohlížečích.

t0x1c
Člen | 151
+
0
-

Čau chci se zeptat. Dal jsem si na web lazy load img. Když udělam filtraci pomoci ajaxu a reloadne se snippet tak mi lazy load nefunguje a obrazky se vubec nenačtou. Musím nějak reloadnout i DOM?

David Ďurika
Člen | 328
+
0
-

Zdravim, potreboval by som pomoc s nasledovnou ulohou:
mam gird a chcem aby sa mi obnovoval kazdych X sekund cez ajax snippety

<script>
	setTimeout(function(){get_fb();}, 5000);

	function get_fb(){
		var feedback = $.ajax({
			type: "POST",
			url: "/vendor/?do=invalidateGrid",
			async: false
		}).complete(function(){
					setTimeout(function(){get_fb();}, 5000);
				}).responseText;
	}
</script>

len neviem ako toto zele zapracovat do nette.ajax aby sa mi tie snippety realne replacovali v DOM

dakujem

mcmatak
Člen | 490
+
0
-

Formulář získávám ajaxem, snippet překreslí formulář, už se to tu řešilo mockrát a mockrát sem to četl, ale nikde nevidím odpověď.

Pletu se nebo tento doplněk postrádá livequery? A formulář vložený do stránky pomocí $(element).html(html) nebude reagovat na ajaxové odeslání?

muselo by se znovu po každém takovém natažení volat nette.init? a nezpůsobí toto násobné volání, že se formulář nebo validace provedou dvakrát?

OK, vidím, že v jquery 1.9 je hodně změn, a jestli se nepletu .on( by mělo fungovat stejně jako .live( ?

nicméně proč to nefunguje :)

EDIT: takže to co povětšinou všichni, kdo měli tady stejný problém, hledají, je tohle http://api.jquery.com/delegate/

Editoval mcmatak (10. 10. 2013 3:17)

mcmatak
Člen | 490
+
0
-

jediné na co jsem přišel, že po každém vložení html fragmentu do stránky musím volat

<?php
$.nette.load();
?>

nejde tomu nějak předejít?

EDIT: pokud přijde html skrz snippet a bude požadavek zpracováván klasickým nette.ajax.success pak je nette.load() voláno v rámci toho, pokud, ale máme vlastní handler, který vkládá html na stránku, pak je nutné volat $.nette.load()

Editoval mcmatak (9. 10. 2013 1:25)

mcmatak
Člen | 490
+
0
-

řešil už někdo navazující akce? nějaké callbacky konkrétního formuláře, něco v tomto duchu, ale lépe provedené

<?php

	$.nette.ext('callbacks', {
		success: function(payload) {
			if (payload.callbacks) {
				$.each(payload.callbacks, function (i, callback) {
					var callbackName = callback[0];
					var callbackArgs = callback[1];
					console.log(callbackName);
					console.log(callbackArgs);
					// jen priklad, jak by to melo fungovat, bud by funkce mohla byt v nejakem data-callback-callbackName nebo by se to mohlo hledat v window[callbackName], nebo?
					callbackName(callbackArgs);
				});
			}
		}
	});

?>

EDIT: tak tohle je moje výsledné řešení, někdo nějaký koment jestli na to nejdu moc složitě?

https://forum.nette.org/…-danem-prvku#…

Editoval mcmatak (9. 10. 2013 13:30)

kuty.cz
Člen | 33
+
0
-

Ahoj,

nemáte někdo problém s odesíláním v IE? V FF i chromu funguje bez problémů, ale v IE8 mam problém, že se po kliknutí na odkaz odešle jak ajaxový požadavek, tak dojde i ke klasickýmu přesměrování na danou URL.

Díky, T.

EDIT: tak problém jsem už vyřešil, již je to jako Issue 57 na GitHubu.

Editoval kuty.cz (14. 10. 2013 15:06)

matopeto
Člen | 395
+
0
-

Zdravim,

nenapisal niekto z vas, alebo nevie ako na extension, ktora by umoznovala i upload suborov? (napr pomocou http://jquery.malsup.com/form/#…)

presiel som cele toto tema, ale nejako som to tu nenasiel.

akadlec
Člen | 1326
+
0
-

matopeto přímo extension dle mě nejde. Jinak já o tom psal tady: https://forum.nette.org/…pomoci-ajaxu

matopeto
Člen | 395
+
0
-

vdaka to som videl, ale nepride mi velmi dobre prepisovat zdorjaky a radsej by som pouzil extension, ak by to nejako islo…

akadlec
Člen | 1326
+
0
-

A to je právě ten problém že IMHO to jednoduše přes extension nejde protože se mění celý způsob jak jsou data odesílána.

@vojtech.dobes: co si myslíš o tom zaintegrovat tu knihovnu pro posílání data ajaxem do nette.ajax? Třeba tak jak jsem to udělal já nebo jiným použitelným způsobem? Samo by se to tam mohlo dodělat tak aby ta knihovna byla volitelná a nette.ajax fungoval i bez ní.

songoo
Člen | 13
+
0
-

Pri ajaxovom forme s required polozkou mi info hlaksu o nevyplnenom inpute zobrazilo 2× + js error „nette "e = e || event“ . Ako som sa tu docital, natiahol som z najnovsieho nette novy netteForms.js, a error hlaska nenastala. Problematicke 2× zobrazenie alertu ale ostalo, tak som sa tu dalej docital z reakcie ze nemam pouzit custom clasu ale ponechat formularu len „ajax“ , to problem hned vyriesilo + programoval to asi vestec kedze fungoval rovno aj redirect ;_) .

Aby som sa dopracoval k otazke, ak by som sa chcel vratit k custom ajax classe pre formular ako upravit nasledujuci js aby mi validacny alert nevyhodilo 2× ?

<script>
$("form.customAjaxForm").submit(function () {
    $(this).ajaxSubmit(function(payload){
        if(typeof(payload.redirect) !== 'undefined')
            window.location = payload.redirect;
    });
    return false;
});
</script>

Len bokom k bootsrapu a modalom , boostrap modaly same o sebe su kusocek divoke(margin na body) + vcelku magicky drzia obsah, js nachadza obsah z prveho modalu aj ked firebug/html ukazuje uplne nieco ine(), ale to len tak bokom osvecil sa bootbox .

MW
Člen | 615
+
0
-

Poradí mě prosím někdo, jak správně na confirm dialog?
Ted načítám toto, a to proto, aby to fungovalo pro ajax i neajax..

Jak to sloučit a popřípadě správně použít prosím ? Myslel jsem, že stačí ext pro tento doplněk, ale to me ignoruje neajaxove požadavky. Díky !

$.nette.ext({
    before: function(xhr, settings) {
	if (!settings.nette) {
	    return;
	}
	var question = settings.nette.el.data('confirm');
	if (question) {
	    return confirm(question);
	}
    }
});

$.nette.ext('data-confirm', {
    load: function() {
	$("a[data-confirm]").click(function(e) {
	    if (!confirm($(this).data('confirm'))) {
		e.stopImmediatePropagation();
		return false;
	    }
	});

    }
});
duskohu
Člen | 778
+
0
-

skus toto, alebo trosku vylepsene toto

akadlec
Člen | 1326
+
0
-

A nebo pokud to chce i nějaké ověření tak toto: https://componette.org/search/?… ale pro nette2.1 je potřeba nějaké úpravy.

MW
Člen | 615
+
0
-

duskohu napsal(a):

skus toto, alebo trosku vylepsene toto

zkousim to a dostavam „dialog.modal is not a function“ :-(

duskohu
Člen | 778
+
0
-

pise ti to preto lebo volas: $(‚#dConfirm‘).modal(‚show‘); ono to je pre TW bootstrap Takze si este potrebujes implementovat TWB modal ono to je pisane v nazve toho suboru: „Confirm dialog for Bootstrap – use nette.ajax.js“

MW
Člen | 615
+
0
-

Ta TWB by byl :-)
Pouzivam toto.

Ovšem handle se nezavola ani po OK ani po CANCEL..
Pokud dam odkazu class=„ajax“ tak se zas zavola pokazde :/

Tusite někdo?

Díky !

duskohu
Člen | 778
+
0
-

Ok

  1. class ajax sa tu nepouziva, ked chces aby siel ajax request na handle na to je data atribut tento, tym padom sa vykona toto
  2. pokal nechces aby to nebol ajax request tak data-ajax=„on“ vobec nepouzijes tym padom sa vykona toto
  3. pokial to chces naviazat na formular tak tie data atributy naviazes na odosielacie tlacitko a po odoslani sa vykona toto, v tomto pripade ajaxizaciu zabespecis tak ze formular bud bude, alebo nebude mat class ajax. Ale pozor ak ma formular viacej tlacitok tak pri spracovani formulara sa bude spracovavat callback na prvom tlacitku
  4. Takze si skus odoslat poziadavku najprv bez ajaxu tz. ze nepouzijes data-ajax=„on“ zisti ci sa ti handle vykona, potom si zapni ajax pomocou data-ajax=„on“ (nepouzivaj class=„ajax“!!!) zapni si firebug a zisti ci sa poziadavka vykonala
MW
Člen | 615
+
0
-

Super, diky !

jannemec
Člen | 78
+
0
-

Trápím se s jediným – jak zobrazit spinner na místě události (kliknutí)?
Díky

akadlec
Člen | 1326
+
0
-

@jannemec: jednoduše, v akci spuštění ještě přidat spočtení offsetu kliknutého elementu a podle toho upravit pozici spinneru

jannemec
Člen | 78
+
0
-

akadlec napsal(a):

@jannemec: jednoduše, v akci spuštění ještě přidat spočtení offsetu kliknutého elementu a podle toho upravit pozici spinneru

Mohl bych poprosit o příklad – zamotal jsem se v tom …

MW
Člen | 615
+
0
-

jannemec napsal(a):

akadlec napsal(a):

@jannemec: jednoduše, v akci spuštění ještě přidat spočtení offsetu kliknutého elementu a podle toho upravit pozici spinneru

Mohl bych poprosit o příklad – zamotal jsem se v tom …

this.spinner.css({
	left: settings.nette.e.pageX,
	top: settings.nette.e.pageY
});
MW
Člen | 615
+
0
-

Zdravím,

lze nejak jednoduse zařídít, aby se me spinner zobrazoval i při odeslání neajaxoveho formulare?
Napr. upload souboru? Resil jsem někdo něco takového?

MultiFileUpload se me zatím nechce používat.. resp. to je zbytecne pro tento jeden pripad.. a potrebuji nejak upozornit uzivatele, ze se něco deje…

Diky!

Jack06
Člen | 168
+
0
-

Je prosím nějak vyřešený už ten toggle při modalovém formuláři načteném přes ajax? Díky

Gaprielko
Člen | 42
+
0
-

zdravim.. uz skor skom tu pisal o probleme so skryvanim spinnera, no stale sa mi to nepodarito vyriesit.. ide o to, ze mam formular, ktory chcem ajax-ovo odosielat.. na stlacenie tl. zobrazim spinner a data z formulara sa mi zapisu pod neho do tabulky, pricom formular neinvalidujem, len danu tabulku.. vsetko ide ok, ale nezmizne mi spinner, funkcia complete sa mi nevykona v spinner extension, vie niekto poradit?

daliborcaja
Člen | 57
+
0
-

Zjistil jsem dva problémy s extension history:

  1. Při překreslování snippetu z cache nedojde k zavolání callbacků z beforeQueue , afterQueue a completeQueue což je dle mého názoru špatně.
  2. Při ručním volání ajaxu ( $.nette.ajax({ url: href }); ) nefunguje historie, nezmění url atd. Nevím jestli to je záměr nebo chyba.
akadlec
Člen | 1326
+
0
-

Neřešil někdo z vás history plugin a chrome? V chrome se mi totiž při načtení spouští tato init část history extension:

var snippetsExt;
if (this.cache && (snippetsExt = $.nette.ext('snippets'))) {
	this.handleUI = function (domCache) {
		$.each(domCache, function () {
			snippetsExt.updateSnippet(this.id, this.html, true);
		});
		$.nette.load();
	};
}

Když tu samou stránku otevřu ve FF tak je to ok. Problém je v tom že se mi překreslí snippety a tudíž se z nich odstraní navěšené akce.

daliborcaja
Člen | 57
+
0
-

akadlec napsal(a):

Neřešil někdo z vás history plugin a chrome? V chrome se mi totiž při načtení spouští tato init část history extension:

Ano, na to samé jsem narazil a z toho důvodu mám prozatím ve svých projektech cache = false. Řešil jsem to o jeden příspěvek výše v bodu 1:

Při překreslování snippetu z cache nedojde k zavolání callbacků z beforeQueue , afterQueue a completeQueue což je dle mého názoru špatně.

Používám totiž tyto callbacky na navěšení akcí na prvky ve snippetech, jelikož je třeba provést vždy při překreslení snippetů. Ale bohužel u cache se to neprovede.

Editoval daliborcaja (7. 1. 2014 12:48)

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

@daliborcaja

Při překreslování snippetu z cache nedojde k zavolání callbacků z beforeQueue , afterQueue a completeQueue což je dle mého názoru špatně.

Toto by mělo být nyní vyřešeno.

Stejně tak jsem konečně opravil spouštění popstate v Chrome hned po načtení stránky – dejte vědět, jestli to řeší nějaké potíže. K dispozici je pre-release verze 1.2.3-RC1.

Editoval vojtech.dobes (14. 1. 2014 16:07)

maxim
Člen | 12
+
0
-

Dobry den, mam mensi problem.
Do bootstrap.php sem umistnil: /AJAX/

<?php

require __DIR__ . '/../vendor/autoload.php';

$configurator = new Nette\Configurator;

$configurator->setDebugMode(TRUE);  // debug mode MUST NOT be enabled on production server
$configurator->enableDebugger(__DIR__ . '/../log');

$configurator->setTempDirectory(__DIR__ . '/../temp');

$configurator->createRobotLoader()
	->addDirectory(__DIR__)
	->addDirectory(__DIR__ . '/../vendor/others')
	->register();

$configurator->addConfig(__DIR__ . '/config/config.neon');
$configurator->addConfig(__DIR__ . '/config/config.local.neon');

/*AJAX*/
$configurator->onCompile[] = function ($configurator, $compiler) {
    $compiler->addExtension('ajax', new VojtechDobes\NetteAjax\Extension);
};

$container = $configurator->createContainer();

return $container;
?>

No nahodne mi vyhadzuje fatal error:
Class ‚VojtechDobes\NetteAjax\Extension‘ not found

Oznaci radek: $compiler->addExtension…

Nevedel by mi nekdo pomoct toto vyresit? Za kazdu radu diki
Zaujimave je, ze tento fatal error sa vyskytuje nahodne.
Neskor som spozoroval, ze sa to vyskytne pri zmene nazvu projektu.
Po vymazani radku, spusteni projektu a nasledne vraceni radku vse jede jak ma.
No zmenite nazev (odpozorovane) a problem je tu.

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

@maxim: Kde máš zdrojový kód toho rozšíření uložený? Ve které složce relativně k bootstrap.php? Načítá ji nějaký loader?

Jan Suchánek
Člen | 404
+
0
-

Při invalidaci snippetu hlásí Firefox chybu:

NS_ERROR_ILLEGAL_VALUE:
}, document.title, this.href);

Mám snipetem obalenou tabulku (50 řádků) s stránkováním. Je to správně?

if (this.href && this.href != window.location.href) {
	history.pushState({
		nette: true,
		href: this.href,
		title: document.title,
		ui: findSnippets()
	}, document.title, this.href);
}
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Důvodem chyby by mohl být limit na serializovanou podobu state. Řešením by asi bylo kontrolovat délku výsledného objektu a případně vyhodit srozumitelnější chybu. Anebo spíš necachovat snippety. Můžeš zkusit zjistit, jestli to stejnou chybu dělá i s findSnippets() nahrazeným za prázdné pole?

Jan Suchánek
Člen | 404
+
0
-

vojtech.dobes: pokud nastavím prázdné pole, chybu js Firefox (OSX) nevyhazuje.

Ostatní prohlížeče (Safari, Chrome, Opera) fungují perfektně i s tím redirectem či bez něj.
V stránkovadle jsem zkoušel obojí s nette.history.js:

	public function handlePage($page = 1)
	{
		$this->page = $page;

		if(!$this->presenter->isAjax()){
			$this->presenter->redirect("this");
		}
		$this->redrawControl();
	}

nebo

	public function handlePage($page = 1)
	{
		$this->page = $page;

		if($this->presenter->isAjax()){
			$this->redrawControl();
		}

		$this->presenter->redirect("this");
	}

Editoval jenicek (4. 2. 2014 15:09)

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

Ok, díky za potvrzení.

uestla
Backer | 796
+
0
-

Ahoj, je prosím nějaký způsob, jakým předat při volání AJAX requestu vlastní data?

// jQuery
$.getJSON(url, {
	key: val,
});

// nette.ajax
$.nette.ajax({
	url: url,
	// ?
});

Díky předem.

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

Rozhraní je stejné jako u obyčejného $.ajax().

$.nette.ajax({
	url: url,
	data: {
		key: val
	}
});
Petrik.a.dost
Člen | 72
+
0
-

Dobrý den,

chtěl bych se zeptat jestli mohu použít $.get(this.href) a když ano tak jak, na ajaxový požadavek a na překreslení snipetu. Používám totiž plugin fancytree a když si vygeneruji seznam ve kterém mají položky odkaz s třídou ajax, tak ajaxové volání nefunguje a nepřišel jsem na to, jak zavolat ajax při události click na odkazu, fancytree ji asi nepředává a nevím jak ho nastavit, aby ji předával (nemáte někdo s tímto pluginem zkušenost, aby fungovalo ajaxové volání?). Takže jsem použil:

<script>
$.('a.ajax').on('click', function(){
	$.get(this.href);
});
</script>

,ale nespustí se mi služba na překreslení snipettu. Poradíte mi prosím někdo?

Vím, že to z poloviny s nette úplně nesouvisí a za to se omlouvám.

Předem děkuji za odpověď.

Petr

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

$.get() je pouhou zkratkou pro $.ajax({type: 'get'}), a $.nette.ajax() je zapouzdřením $.ajax(), přičemž zachovává plnou kompatibilitu.

Takže:

$.nette.ajax({
	url: this.href
});

Mám ale dojem, že hledáš spíš load událost. Přesuň inicializaci toho fancytree do extenze:

$.nette.ext({
	load: function () {
		// inicializace pluginu patří sem
	}
});
Petrik.a.dost
Člen | 72
+
0
-

Zdravím, moc děkuji za radu, ale fancytree stále ajaxový požadavek nefungoval nicméně jsem to otočil a v inicializaci fancytree jsem inicializoval nette.ajax a už to fungovalo… takže vaše rada mi napověděla díky moc… Petr

simPod
Člen | 383
+
0
-

Zdravím, úplně jsem nepochytil fungování tohoto pluginu, může mi někdo prosím vysvětlit, co dělá tento kód? Jako pro blbce, díky.

$.nette.ext('name', {
    success: function () {
        fce();
    }
});
akadlec
Člen | 1326
+
0
-

vytvoří extension „name“ která po úspěšném dokončení ajaxového requestu který je zpracován pomocí nette.ajax.js zavolá funkci „fce“

simPod
Člen | 383
+
0
-

Aha aha… no a jak to extension pak pouziju? Resp. rekneme, ze udelam 2:

$.nette.ext('name', {
    success: function () {
        fce();
    }
});
$.nette.ext('name2', {
    success: function () {
        fce2();
    }
});

a ted mam nejaky konkretni formular, ktery se submituje pres nette.ajax.js. Jak tomu reknu, ze ma pouzit extension ‚name2‘, aby se po uspesnem requestu spustila fce2()? Nebo jsem vubec nepochopil jak se ty extensions pouzivaji? Diky moc.

akadlec
Člen | 1326
+
0
-

Ano nepochopil si to ;) Extensiony se zaregistrují hned a to cos uvedl se spustí při každém úspěšném volání ajax requestu. Takže pokud se ti form submitne pomocí nette.ajax.js tak se ti spustí obě extensions, ted obě funkce fcefce2

martin.knor
Člen | 17
+
0
-

Inicializuju nette.ajax pred </body> a pri ajaxovem pozadavku mi nefunguje spinner, protoze pozadavek volam hned pri nacitani stranky a spinner se inicializuje az na konci body. Mozna by bylo fajn pridat do start podminku a pripadne spinner vytvorit, neco jako:

co vy na to?

Funguje i při volání ajaxu při načítání stránky.

<script>
(function($, undefined) {

$.nette.ext('spinner', {
	start: function () {
		this.initSpinner();
		this.spinner.show(this.speed);
	},
	complete: function () {
		this.spinner.hide(this.speed);
	}
}, {
	createSpinner: function () {
		return $('<div>', {
			id: 'ajax-spinner',
			css: {
				display: 'none'
			}
		});
	},
	initSpinner: function() {
		if (this.initialized) return;
		this.spinner = this.createSpinner();
		this.spinner.appendTo('body');
		this.initialized = true;
	},
	spinner: null,
	speed: undefined
});

})(jQuery);

</script>

Editoval martin.knor (17. 3. 2014 18:42)

sKopheK
Člen | 207
+
0
-

Zabloudil jsem sem při hledání řešení na problém dvojitého odesílání formuláře a zjistil jsem, že mám dva roky starou verzi :). No nic, nahrál jsem novou, ale koukám, že musím dost věcí poupravit, abych byl tam, kde předtím. Bohužel readme na githubu moc nepomáhá, přijde mi, že není synchronizované s aktuální verzí. Např. event before dostává namísto uvedeného xhr, settings `nyní `settings, ui, e, event start naopak už settings nedostane.

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

To není pravda, argumenty jsou předávány přesně jak je v readme uvedeno. Odkaž prosím zdrojový kód, kde je to špatně.

sKopheK
Člen | 207
+
0
-

Omlouvám se, zase jsem stáhl nějakou divnou verzi Dvojité odeslání se nedělo, tak jsem myslel, že mám novější, holt sem asi omylem vlezl do slepé větve.

Narazil jsem na problém u URL předáváné v settings.url. Při kliknutí na odkaz je tam absolutní URL, při odeslání formuláře však pouze relativní, resp. to, co je v parametru action.

Editoval sKopheK (2. 4. 2014 9:30)