Ajax nefunguje při každém requestu, každý druhý je ne-ajaxový

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Semik
Backer | 135
+
0
-

Zdravím. Používám komponentu NiftyGrid (https://componette.org/search/?…) a ajax nefunguej při každém requestu. Po každém ajaxovém requestu proběhne jeden normální. První request tedy udělá něco co zabrání tomu dalšímu a normální request do logicky neutralizuje.

Nevíte co by to mohlo způsobovat ?

„PHP 5.4.4 | Apache/2.4.2 (Win32) PHP/5.4.4 | Nette Framework 2.0.12 (released on 2013–08–08)“
JQuery 1.10.2, netteForms, twitter bootstrap

Foowie
Člen | 269
+
0
-

Můj tip: první ajax request překreslí snippet s tlačítkem/odkazem a díky tomu ztratí tento odkaz svojí „ajaxovost“.

Semik
Backer | 135
+
0
-

Foowie napsal(a):

Můj tip: první ajax request překreslí snippet s tlačítkem/odkazem a díky tomu ztratí tento odkaz svojí „ajaxovost“.

To mě samozřejmě napadlo, nicméně odkaz je v pořádku, má stále ajaxovou třídu.

Oli
Člen | 1215
+
0
-

Reseni nemam, jen vim, ze me tohle delalo taky, kdyz jsem pouzil jQuery verzi, ktera uz nepodporuje live. Prepsal jsem live na on v niftygrid.js a delalo me to to taky. Treba te to dovede k reseni :) rad bych taky vedel, jak to opravit.

jiri.pudil
Nette Blogger | 1029
+
0
-

On možná odkaz pořád má ajaxovou třídu, ale už nemusí mít navěšené handlery pro patřičné události (zjistíš snadno ve vývojářských nástrojích prohlížeče). Pokud je to tak, zkus přepsat to navěšování události na document, tzn. místo:

$('.selector').on('click', handler);

takto:

$(document).on('click', '.selector', handler);
Semik
Backer | 135
+
0
-

Máte recht, chrome dev tools ukázal že je nemá. Přepsáno na document a již funguje.

Díky za rady.

jiri.pudil napsal(a):

On možná odkaz pořád má ajaxovou třídu, ale už nemusí mít navěšené handlery pro patřičné události (zjistíš snadno ve vývojářských nástrojích prohlížeče). Pokud je to tak, zkus přepsat to navěšování události na document, tzn. místo:

$('.selector').on('click', handler);

takto:

$(document).on('click', '.selector', handler);
Semik
Backer | 135
+
0
-

Nicméně stále ještě nefunguje dobře jedna věc a to zaškrtávání přes select-all. Opět zaškrte a odškrtne jen jednou, poté nereaguje. I bez předchozí requestu.

Nejspíš asi bude chyba v:

$(document).on("click", ".grid-select-all", function() {
        var checkboxes =  $(this).parents("thead").siblings("tbody").children("tr:not(.grid-subgrid-row)").find("td input:checkbox.grid-action-checkbox");
        if($(this).is(":checked")){
            $(checkboxes).attr("checked", "checked");
        }else{
            $(checkboxes).removeAttr("checked");
        }
    });

Edit: Tak tím to nejspíš nebude. Poprvé to atribut přidá a odebere, při dalším kliku už nepřidá (ověřeno v ChromeDevTools).

Editoval Semik (14. 9. 2013 14:52)

Semik
Backer | 135
+
0
-

Nejspíš bude problém v jQuery, protože mi to dělá i na prostém samplu, kde odkazem chci zaškrtnout checkbox a udělá to pouze jednou. Logicky by to mělo asi dělat všem s touto verzí.

akadlec
Člen | 1326
+
0
-

Při překreslení snippetu se ti prostě „ztratí“ události, buď je musíš s každým překreslením zavěsit znova a nebo je musíš zavěsit dynamicky pomocí $.ON()

Semik
Backer | 135
+
0
-

akadlec napsal(a):

Při překreslení snippetu se ti prostě „ztratí“ události, buď je musíš s každým překreslením zavěsit znova a nebo je musíš zavěsit dynamicky pomocí $.ON()

Takto je právě mám, viz výše $(document).on('click', '.selector', handler); A stejně.

MzK
Člen | 127
+
0
-

Zrovna s tímto bojuji: Jak a kam mohu zapsat

<script>
$(document).on('click', '.selector', handler);
</script>

když v tom handler má být něco jako?

<script>
$(this.linkSelector).off('click.nette', rh).on('click.nette', rh);
</script>

viz

Tuším, že by se to hodilo za snippets.after ale tam nemám proměnnou rh (requestHandler)

A když to zkouším přes:

<script>
snippets.after(function ($el) {
	$el.find('form').each(function () {
		window.Nette.initForm(this);
	});
	//console.log($el.find('a.ajax'));
	$el.find('a.ajax').each(function () {
		$(this).on('click', function(payload) {
			$.nette.success(payload);
		});
	});
});
</script>

Tak spippety stejně nemají daný eventy a další click na odkaz už není Ajaxový :-(

Když dám místo: $.nette.success(payload); prosté $.get(this.href);, tak se sice odešle ajaxový požadavek, vrátí se snippety, ale ty se nikde nenahradí v šabloně.

Pls o nakopnutí, kam vecpat jakou metodu, aby se na nově přijaté snippety navěsily eventy pro class=ajax na clicknutí.
jQuery 1.10.2.
Nette: 2.1.0-RC4

Gaprielko
Člen | 42
+
0
-

tak ja riesim rovnaky problem a tiez si neviem rady.. tiez som zistil, ze to nenaviazanie handlerov mi suvisi s tym, ze ci na vkladany HTML fragment pouzijem fade effekt, alebo nie.. pokial ho nepouzijem, ajax mam pri kazdom poziadavku, ak fade pouzijem, ide to chybne.

Dalej, mozno to s tym nejako suvisy, ale ked mam odkaz, ktorym ajaxovo vlozim nejaky HTML fragment s tym, ze dany odkaz nie je prekresleny (je mimo fragmentu), tak spinner zobrazovany po kliknuti mi nezmizne (nevykona sa complete). Ale ak na vkladany HTML fragment pouzijem fade efekt (hoc len 1ms dlhy), tak complete sa vykona a spinner zmizne.. ovsem dalsi request z vlozeneho HTML fragmentu je neajaxovy

Dostal som sa tak do kruhu, bud pouzijem fade efekt a spinner mi zmizne, ale nepojde dalsi request ajaxovo, alebo nepouzijem fade a spinner mi nezmizne, no som ajaxovy :)

Vie niekto poradit, co s tym? Tento problem mam, ako pisem vyssie, len ked odkaz na ktory klikam nie je prekresleny novym HTML fragmentom.

Editoval Gaprielko (13. 1. 2014 11:37)

Gaprielko
Člen | 42
+
0
-

este doplnim.. ak pouzivam fade efekt, tak snippet complete sa nevykona.. v skripte to mam takto:

<script>
$.nette.ext('snippets').applySnippet = function ($el, html) {
    // fade effect
    if ($('.ajax-fade '+$el.selector).exists()) {
        $el.fadeTo("fast", 0.01, function () {
            $el.html(html).fadeTo(200, 1);
        });
    } else {
        $el.html(html);
    }
};
$.nette.ext('snippets').complete(function (payload) {
    $.nette.load();
    alert('snippet complete');

    // initialize all forms for live validation
    payload.find('form').each(function() {
        Nette.initForm(this);
    });
});
</script>