nette.ajax.js – alt. obsluha pro AJAX s jQuery
- pidiclovek
- Člen | 91
Vojtěch Dobeš napsal(a):
Podpora je skutečně jen přes datový atribut v HTML. Nicméně tento atribut je zpracováván až v rozšíření
snippets
. Její chování si lze však přepsat k obrazu svému:$.nette.ext('snippets')applySnippet = function ($el, html, back) { // ... };
Perfektní, funguje jako víno. Vyřešil jsem přidáním přepínače do globálního kontextu rozšíření. Díky Vojto!
- petr.kubin
- Člen | 1
Ahoj,
jak vytvořit vlastní ajax handler pro odeslání formuláře?
Když použiju predfinovaný (class .ajax), tak nejsem schopen dát na prvek
překresleného formuláře .focus().
A když použiji:
$.nette.ajax({
url: $form.attr('action'),
method: 'POST',
complete: function(data) {
$this.focus();
}
});
Tak jsem schopen dát .focus() na prvek, jenže formulář se nepřekreslí, neivaliduje se snippet.
- Vojtěch Dobeš
- Gold Partner | 1316
petr.kubin napsal(a):
Ahoj,
jak vytvořit vlastní ajax handler pro odeslání formuláře?Když použiju predfinovaný (class .ajax), tak nejsem schopen dát na prvek překresleného formuláře .focus().
A když použiji:$.nette.ajax({ url: $form.attr('action'), method: 'POST', complete: function(data) { $this.focus(); } });
Tak jsem schopen dát .focus() na prvek, jenže formulář se nepřekreslí, neivaliduje se snippet.
Vypadá to, že neodesíláš data toho formuláře. Udělej to raději takto:
// e by měl objekt události, ve které tento kód voláš
$form.netteAjax(e).always(function(data) {
$this.focus();
});
- tom
- Člen | 171
Jestli se to tady řešilo tak se omlouvám, nenašel jsem. Chtěl bych rozlišit 2 typy ajaxových volání, jeden typ by obsahoval zobrazení spinneru a druhý ne. Napadlo mě pro to využít extension, kdy si definuji 2. Jak potom ovlivním kterou z nich použiji? Nyní mám pocit, že se mi aplikují obě dvě.
Díky
- Vojtěch Dobeš
- Gold Partner | 1316
Což třeba takto?
$.nette.ext('spinner', {
init: function () {
this.spinner = this.createSpinner();
this.spinner.appendTo('body');
},
before: function (xhr, settings) {
if (typeof settings.spinner === 'undefined') {
if (settings.nette && settings.nette.el) {
settings.spinner = settings.nette.el.is('[data-ajax-spinner]');
}
}
},
start: function (xhr, settings) {
if (!settings.spinner) {
return;
}
this.counter++;
if (this.counter === 1) {
this.spinner.show(this.speed);
}
},
complete: function () {
this.counter--;
if (this.counter <= 0) {
this.spinner.hide(this.speed);
}
}
}, {
createSpinner: function () {
return $('<div>', {
id: 'ajax-spinner',
css: {
display: 'none'
}
});
},
spinner: null,
speed: undefined,
counter: 0
});
Použití:
$.nette.ajax({
url: ...,
spinner: true
});
<a n:href="signal!" class="ajax" data-ajax-spinner>Signal with spinner!</a>
- flexroad
- Člen | 117
Ahoj…
pokud pridam do url kterou chci volat ajaxem dvojtecku, prestane se link
volat ajaxem.
dvojtecky pouzivam jako parsovaci znak napriklad pri nastavovani filtru.
Poradite mi nekdo, co mam upravit, aby to bralo i url s dvojteckou?
http://domena.com/neco/
→ jede normalne
http://domena.com/…/cena-od:10/ → po kliku refreshne
celou stranku :(
diky,
@flexroad
- Vojtěch Dobeš
- Gold Partner | 1316
Dej si na ty odkazy následující datový atribut:
<a class="ajax" n:href="..." data-ajax-validate='{"url":false}'>
nette.ajax.js
ve výchozím chování (extenze
validation
) filtruje URL které obsahují dvojtečku, protože
jde s největší pravděpodobností o absolutní externí odkazy.
- flexroad
- Člen | 117
Ahoj, resil nekdo NS_ERROR_ILLEGAL_VALUE ve firefoxu? Nasel jsem jen rok stary post.
Je divne, ze pokud to testuju na lokalnim stroji, chybu firefox nevraci a pokud to poslu na server, firefox po druhem ajaxovem volani zhavaruje na vyse uvedene chybe…
Nejake napady? Muze to byt verzi PHP? Apache? Nejakym rozdilnym nastavenim?
Diky,
@flexroad
- flexroad
- Člen | 117
flexroad napsal(a):
Ahoj, resil nekdo NS_ERROR_ILLEGAL_VALUE ve firefoxu? Nasel jsem jen rok stary post.
Je divne, ze pokud to testuju na lokalnim stroji, chybu firefox nevraci a pokud to poslu na server, firefox po druhem ajaxovem volani zhavaruje na vyse uvedene chybe…
Nejake napady? Muze to byt verzi PHP? Apache? Nejakym rozdilnym nastavenim?
Diky,
@flexroad
Tak uz jsem nasel verzi history.ajax.js, ktera funguje i s FireFox… link
- flexroad
- Člen | 117
akadlec napsal(a):
@flexroad hele je to problém history extension a FFka kterému přeteče paměť.
Jj. Cetl jsem o tom… Kazdopadne vyse uvedeny upraveny nette.history.js to resi… Ale moc do podrobna jsem to nestudoval.
Editoval flexroad (13. 5. 2015 12:45)
- Pavel Janda
- Člen | 977
Zdravím,
dynamické snippety – rád bych se na něco zeptal, dřív musím však uvést konkrétní příklad:
Template:
{snippet foos}
{foreach $foos as $i => $foo}
{snippet foo-{$i}}
<h{!$i}><a class="ajax">{$foo}</a></h{!$i}>
{/snippet}
{/foreach}
{/snippet}
<a href="{link bar!}" class="ajax">bar</a>
Presenter
public function handleBar()
{
$this->template->foos = [1 => 'Hu', 3 => 'Bleble'];
$this->redrawControl();
}
Tedy, snippet, v něm dynamické snippety. Pokud chci přidat/odebrat/prostě změnit kolekci dynamických snippetů, lze toho docílit jinak, než překreslením všech snippetů?
Pokud ne, cesta smazání snippetu je jednoduchá – v payload si pošlu id smazané věci a tu odeberu z DOMu, ale co přidání? Těžko se hledá rodičovský element posílaného snippetu, abych ho k němu appendoval. Nelíbí se mi posílání jména snippetu spolu s nějakou třídou rodiče a s tím související psí kusy.
Napadá někoho nějaké geniální myšlenka?
Nebo jsem za blbce a někde jen stačí uvést třeba dvojtečka a celé se to
začne chovat jinak?
Dosavadní řešení:
Editoval Beton (21. 5. 2015 16:17)
- xxmiky
- Člen | 1
Ahoj,
přišel jsem na problém v IE8 a nette.ajax.js, ale nevím, jestli nemám něco špatně v aplikaci, či jestli jsem nenarazil na bug v nette.ajax.js
V nette.ajax.js, řádky 367 – 371:
<script>
if (analyze.form.get(0).onsubmit && analyze.form.get(0).onsubmit((typeof ie !== 'undefined' && ie < 9) ? undefined : e) === false) {
e.stopImmediatePropagation();
e.preventDefault();
return false;
}
</script>
Vyskytlo se mi to, když mám AJAXové submitování formuláře v modal okně a následné překreslení komponenty v modalu. V Chrome a FF se mi komponenta v pohodě překreslí a vypíše mi to flash message.
V IE8 (bohužel jinak nejde, ale tady to chodit musí) se mi refreshuje celá stránka a ne pouze komponenta. Je to díky této chybě v javascriptu, kdy se potom nevykoná AJAX post, ale pouze post a tím následný refresh stránky.
Webpage error details
User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; Tablet PC 2.0)
Timestamp: Mon, 25 May 2015 12:33:14 UTC
Message: Object doesn't support this action
Line: 367
Char: 5
Code: 0
URI: http://fsi3/js/nette.ajax.js?v=
Message: Object doesn't support this action
Line: 367
Char: 5
Code: 0
URI: http://fsi3/js/nette.ajax.js?v=
Z debugování javascriptu mi vyšlo, že v IE8 nejde funkce onsubmit(undefined), uvedená v IFu na řádce 367:
(typeof ie !== 'undefined' && ie < 9) ? undefined : e
z porovnání vyjde toto a to hází bohužel výše uvedenou chybu
analyze.form.get(0).onsubmit(undefined)
Tak jsem se chtěl zeptat, jestli je nette.ajax.js funkční i v IE8 či případně nemám já něco špatně. Pokud mám špatně, nemohl byste někdo poradit?
Díky
- raketoplan2005
- Člen | 147
Ahoj, napsal jsem si extension na vlastní spinner, která zároveň disaebluje nějaká formulářivá pole.
Problém je v tom, že se ale spouští se vším co má class ajax, tedy např. i s filtrováním v gridu.
Jak by se mělo rozšíření správně zapnout jen na jednom formuláři na kterém ho potřebuji?
Děkuji
- raketoplan2005
- Člen | 147
@akadlec: To jsem samozřejmě udělal a našel
váš post. S tím se mi to ale nedaří. Když zavolám
addConditionalExtension
tak nemám v settings.nette.el
nic z atributu data-ajax-on.
{
"el": {
"0": {
"0": {},
"1": {},
"2": {},
"3": {},
"sizzle-1432656043440": {
"parentNode": [
38,
8,
true
]
},
"nette-submittedBy": {}
},
"context": {
"0": {},
"1": {},
"2": {},
"3": {},
"sizzle-1432656043440": {
"parentNode": [
38,
8,
true
]
},
"nette-submittedBy": {}
},
"length": 1
},
"isForm": true,
"isSubmit": false,
"isImage": false
}
Editoval raketoplan2005 (26. 5. 2015 18:03)
- raketoplan2005
- Člen | 147
Do stránky kde to rozšíření potřebuji si připojím soubor s tímto obsahem:
(function ($, undefined) {
addConditionalExtension('blockform', {
init: function () {
this.spinner = this.createSpinner();
this.spinner.appendTo('body');
},
start: function () {
this.counter++;
if (this.counter === 1) {
this.spinner.show(this.speed);
}
this.form.hide();
},
complete: function () {
this.counter--;
if (this.counter <= 0) {
this.spinner.hide(this.speed);
}
this.form.show();
this.input.val('');
}
}, {
createSpinner: function () {
return $('<i>', {
id: 'ajax-spinner',
class: 'fa fa-spinner fa-pulse',
css: {
display: 'none',
}
});
},
spinner: null,
speed: undefined,
counter: 0,
form: $('#mainform'),
input: $('#datainput')
});
})(jQuery);
Funkci addConditionalExtension pak mám v main.js který se připojí dříve. Funkce se normálně zavolá, ale v el mám to co jsem postoval v příspěvku 157109. Myslím že neumím správně použít nebo předat setings té události prepare.
Editoval raketoplan2005 (27. 5. 2015 9:48)
- MW
- Člen | 626
Zdravím,
prosím o radu.
Mám u gridu tento potvrzovací dialog:
<a n:href="doLoadBackup, 'file' => $backup[name]"
data-confirm="modal"
data-confirm-title="Potvrzení akce"
data-confirm-text="Obnovit?"
data-confirm-ok-class="btn-danger"
data-confirm-ok-text="Obnovit"
data-confirm-cancel-class="btn-success"
data-confirm-cancel-text="Zrušit"
class="btn btn-danger btn-mini"
data-ajax="on"><span class="glyphicon glyphicon-share-alt"></span> Obnovit</a>
pokud nastavím class ajax, tak akce proběhne pokazde a spinner se zobrazí
ihned po kliknutí.
pokud nenastavím ajax, tak to funguje, ale zase se nezobrazí spinner.
Lze to nejak dat dohromady? Tedy
Klinutí → potvrzovací dialog → potvrzení → spinner.
Moc diky!
- stemba
- Člen | 20
Ahoj,
s AJAXem pro Nette začínám a potřeboval bych vědět, jak upravit nebo
dopsat nějakou funkci k obsluze snippetu, která by se provedla před a po
jeho překreslení. Konkrétně jde o to, že potřebuji vytvořit popup okno
(div), které se vytvoří při kliknutí na odkaz s určitým attributem nebo
css třídou a jehož obsah se načte pomocí snippetu. Po jeho překreslení
potřebuji spustit javascriptový efekt, který zviditelní a případně
skryje div.
Díky
- Vojtěch Dobeš
- Gold Partner | 1316
Uucroutu napsal(a):
Ahoj,
používám rozšíření spinner.
Nicméně mám místa, kde nechci spinner zobrazit.
Jak pomocí class „.nospinner“ zakázat jeho zobrazení?
Pokud odkaz .ajax obsahuje i .nospinner, tak se spinner neukáže, jinak se zobrazí.
Upravil bych si extenzi následovně:
start: function (xhr, settings) {
if (settings.nette && !settings.nette.el.is('.nospinner')) {
return;
}
this.counter++;
if (this.counter === 1) {
this.spinner.show(this.speed);
}
}
complete: function (xhr, status, settings) {
if (settings.nette && !settings.nette.el.is('.nospinner')) {
return;
}
this.counter--;
if (this.counter <= 0) {
this.spinner.hide(this.speed);
}
}
- Šaman
- Člen | 2659
Ahoj, zkouším nainstalovat JSka pomocí boweru a narazil jsem na
zvláštní chování:
V repozitáři
je vyžadována závislost "nette-forms": "~2.2"
, což z composeru
chápu jako 2.2.x
, ale i 2.x.x
. Ale bower mi při
instalaci tvrdí, že výsledkem tohoto je aktuálně verze 2.2.7
,
což není kompatibilní s požadavkem nette-forms 2.3
.
Tady je můj bower.json
, který vyhodí kolizi:
{
"name": "pokusy",
"dependencies": {
"jquery": "~2.1.4",
"bootstrap": "~3.3.5",
"nette-forms": "~2.3.6",
"nette.ajax.js": "~2.1.0"
}
}
- iguana007
- Člen | 970
Ahoj, rád bych poprosil @VojtěchDobeš o doplnění infa do
dokumentace, že AJAX nefunguje v případě, že URL obsahuje port za
doménou. Právě jsem na tom propálil skoro dva dny, než jsem náhodou
narazil na zmínku o portu zde na fóru. Sice jsem zároveň našel info
o tom, jak validaci URL vypnout pomocí data atributu, toto ovšem nefunguje
u formulářů, proto bych se rád zeptal, zda-li nevíte, jak validaci URL
vypnout i u formulářů?
Díky
- iguana007
- Člen | 970
@enumag definice je imho tady: https://github.com/…ette.ajax.js#L277
Zkoušel jsem i takto, ale nepomohlo:
$.nette.init();
$.nette.ext('validation', null);
- nanuqcz
- Člen | 822
Funguje vám history.nette.ajax.js, pokud voláte AJAXový požadavek ručně?
Příklad:
Takto mi přepis URL v prohlížeči funguje bez problému:
<a n:href="Homepage:foo" class="menu ajax">Foo</a>
Ale takto (s ručním voláním) již ne. AJAXový požadavek se provede správně, snippety se překreslí, ale URL zůstává stále stejná:
<a n:href="Homepage:foo" class="menu">Foo</a>
<script>
jQuery(function(){
jQuery('a.menu').click(function(e){
var $link = jQuery(this);
jQuery.nette.ajax({
url: $link.attr('href'),
off: ['spinner'],
start: function () {
$specialSpinner.show(200);
},
complete: function () {
$specialSpinner.hide(200);
}
});
e.preventDefault();
});
});
</script>
Když jsem dumpoval history.nette.ajax.js, zjistil jsem, že
skončí na tomto řádku: https://github.com/…tory.ajax.js#L72
, protože settings.nette
je undefined
.
Ale jak chybu opravit, případně jestli je chyba u mě, nebo v nette.ajax.js, na to jsem nepřišel.
Poradí někdo? Díky :-)
EDIT: Jak už to bývá, člověk na řešení přijde hned po sepsání dotazu sám :-D
Špatné volání nette ajaxu:
jQuery.nette.ajax({
...
});
Správné volání nette ajaxu:
jQuery.nette.ajax({
...
}, this, e);
Editoval nanuqcz (15. 4. 2016 11:57)
- karel.juricka
- Člen | 4
Nevím jistě jestli je to problém nebo očekávané chování, ale pokud formuláři nastavím class ajax, tak tím znefunkčním netteForms.js validaci. Procházel jsem celé fórum, zkoušel pochopit parametry apod. ale nepodařilo se mě přijít na elegantní řešení, kde by ta validace běžela a současně by se ajax poslal až pokud by prošla.
Podařilo se mi udělat řešení, kdy jsem si chyby vytáhl na serveru a pak poslal zpátky a zobrazil chyby, ale rád bych věděl, zda něco přehlížím a lze, aby fungovala při ajaxovém zpracování i čistá form validace nette přes JS.
Díky za info
- karel.juricka
- Člen | 4
Ano, nalinkované mám obě, nejnovější verze. Žádné JS navíc tam nemám, zkusil jsem i naprosto osekat a stejný problém. Ono když držím ctrl a kliknu na odeslat, tak se mi normálně spustí nette js form validace. V opačném případě se začně hned posílat ajaxový dotaz (JS validaci to přeskočí) a chybu mohu odchytit jen na serveru.
- karel.juricka
- Člen | 4
Ano, za tuto informaci děkuji. Už jsem si večer připadal, že se snad snažím o nemožné. Proto budu ještě nad tím přemýšlet, nicméně pokud mi někdo dokáže odpovědět, budu rád.
Zkusil jsem úplně čistý test :
Nainstaloval jsem čistý sandbox. Doplnil nette.ajax.js a inicializaci. Zapl jednoduchý formulář, otestoval a narazil na stejný problém. Opět netteForms.min.js nevaliduje.
Editoval karel.juricka (17. 5. 2016 9:02)
- Šaman
- Člen | 2659
Ještě bych se zeptal – nefunguje ti ani JS validace při které vyskočí alert, nebo ti jde o vlastní validaci, která se defaultně vykresluje červeně vedle inputu? Ta první by měla fungovat normálně, ale pro tu druhou je potřeba při chybě překreslit formulář (a na to se zapomíná, překresluje se až v onSuccess, k tomu ale nedojde).
<?php
$form->onError[] = function($form) {
$this->redrawControl('form'); // sem si doplň vlastní snippet, nebo nech bez parametru
};
?>
Editoval Šaman (17. 5. 2016 9:14)
- karel.juricka
- Člen | 4
Rozumím, bohužel jde opravdu o tu JS validaci, která mě nefunguje – čistý JS alert. Serverové onError chybu zachytí, tím jsem schopen si ji poslat zpátky ajaxem a zobrazit, to je také řešení, které aktuálně používám. Ale zarazil mě ten problém s tou JS validací pokud je zaplý ajax a proto jsem zde napsal :)
- kuxa
- Člen | 5
Hezký večer, řeším jeden menší problém. Na webu všechny stránky
načítám přes AJAX. Mimo to ještě každých 15 vteřin pravidelně
updatuju jeden informační snippet. Ale problém je v tom, že jakmile se
pravidelný update spustí během běžícího requestu na načtení stránky
(který vyvolal uživatel), načítání stránky se abortne a
dokončí se pouze update.
A tak bych se chtěl zeptat, je nějak možné udělat požadavek asynchronní
(popř. pokud vás napadá jiné řešení…)? Děkuji moc!
- jiri.pudil
- Nette Blogger | 1029
Můžeš pro ten update vypnout rozšíření, které to abortování provádí:
$.nette.ajax({
off: ['unique'],
// ...
});
anebo si ho přepsat třeba do websockets
- Pepiik
- Člen | 10
Zdravím, pomocí javascriptu vytvářím další odkazy se třídou ajax,
ale už se na ně nenaváže událost click.nette.
v initu bych potřeboval
$(this.linkSelector).off('click.nette', rh).on('click.nette', rh);
zaměnit za toto
$(document).off('click.nette', rh).on('click.nette',this.linkSelector, rh);
Toto funguje, ale dá se toho nějak docílit bez přepisování knihovny? Díky
- Oggy
- Člen | 306
Ahoj.. pokud mám ajaxový formulář.
a chci navázat v javascriptu na event submit další js kód,
nevykoná se.
<script>
$(document).on('submit','form.addtocart', function() {
console.log('submit');
$('#cart-modal').foundation('open');
});
</script>
Pokud nemá form.ajax třídu, tak kód funguje.
Update, vyřešeno:
našel jsem stejný případ zde: https://forum.nette.org/…bmit-handler
Editoval Oggy (16. 6. 2016 19:41)