nette.ajax.js – alt. obsluha pro AJAX s jQuery
- cubic
- Člen | 45
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.
- David Ďurika
- Člen | 328
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 | 504
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 | 504
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 | 504
ř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
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
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
matopeto přímo extension dle mě nejde. Jinak já o tom psal tady: https://forum.nette.org/…pomoci-ajaxu
- akadlec
- Člen | 1326
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
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 | 626
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;
}
});
}
});
- akadlec
- Člen | 1326
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.
- duskohu
- Člen | 778
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“
- duskohu
- Člen | 778
Ok
- class ajax sa tu nepouziva, ked chces aby siel ajax request na handle na to je data atribut tento, tym padom sa vykona toto
- pokal nechces aby to nebol ajax request tak data-ajax=„on“ vobec nepouzijes tym padom sa vykona toto
- 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
- 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 | 626
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 | 626
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!
- Gaprielko
- Člen | 42
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
Zjistil jsem dva problémy s extension history:
- Při překreslování snippetu z cache nedojde k zavolání callbacků z
beforeQueue
,afterQueue
acompleteQueue
což je dle mého názoru špatně. - 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
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
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
@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
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
@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
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
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
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
Rozhraní je stejné jako u obyčejného $.ajax()
.
$.nette.ajax({
url: url,
data: {
key: val
}
});
- Petrik.a.dost
- Člen | 72
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
$.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
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
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.
- martin.knor
- Člen | 17
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
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
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
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)