Něco jako nette.js s jQuery

#1 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Něco jako nette.js s jQuery

Aktuální informace o ajaxu a ajaxových formulářích

Editoval Honza M. (15. 6. 2009 17:04)

Online

 

#2 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5835

Re: Něco jako nette.js s jQuery

Super! Díky!

ad obarvování: je to lepší?

 

#3 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

formuláře

Editoval Honza M. (15. 6. 2009 17:05)

Online

 

#4 před 3 lety

enoice
Nette guru
Registrovaný: 1. 9. 2006
Příspěvky: 333

Re: Něco jako nette.js s jQuery

Honza M. napsal(a):

Tak za tohle děkuju ještě víc :)

Editoval enoice (9. 2. 2009 15:16)

 

#5 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5835

Re: Něco jako nette.js s jQuery

Můžu to použít (samozřejmě s uvedením tvého autorství) v examples?

 

#6 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Jasně, od toho to tu je, aby se to používalo.

Online

 

#7 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Hm… U ajaxového formuláře jsem zapomněl, že tam může být taky nějaká validace. Přidal jsem teda jednu podmínku navíc, která spustí validaci, co je v parametru onsubmit.

Online

 

#8 před 3 lety

zdvori
Člen
Registrovaný: 9. 1. 2009
Příspěvky: 12

Re: Něco jako nette.js s jQuery

Zatim nefunguje pro MultipleSelectBox, kde se jako hodnota posila pole. V nasledujicim kodu v „values“ jeste je:

CONTACTS[] = 1
CONTACTS[] = 2

ale v
sendvalues uz je logicky jen posledni:

CONTACTS[] = 2
<script>
var values = form.serializeArray();

                for (var i = 0; i < values.length; i++) {
                        sendValues[values[i].name] = values[i].value;
                }

</script>

 

#9 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Chvíli jsem nad tím děsně koumal, ale nakonec jsem přidal podporu multi selectu.

Online

 

#10 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: Něco jako nette.js s jQuery

Honzo, feature request ,)

Keď chcem spraviť pekný prechod medzi updatom snippetu, napríklad fade, použijem:

<script>
                        if (data.snippets) {
                                for (var i in data.snippets) {
                                        $("#" + i).fadeOut('fast', function() {
                                          $("#" + i).html(data.snippets[i]);
                                          $("#" + i).fadeIn('fast');
                                        });
                                }
                        }
</script>

Nedá sa to spraviť nejak tak, aby som si mohol takýto efekt nastaviť bez toho aby som sa babral do tvojho pluginu? Dík.

Editoval Jod (21. 2. 2009 12:50)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#11 před 3 lety

Etch
Člen
Registrovaný: 24. 9. 2008
Příspěvky: 194

Re: Něco jako nette.js s jQuery

Honzo taky ti sem přidám něco do mlýnku. Možná, že by bylo dobré použít jiný selector při updatu snippetů, protože tak jak to máš ty se připravuješ o možnost využití stejného „snippetu“ dvakrát:

<?php
@{? $grid->renderPaginator()}
@{? $grid->render()}
@{? $grid->renderPaginator()}
?>

Toto by sice fungovalo, ale překreslovalo by se pouze horní stránkování. Proto by se tam pro překreslování snippetů hodil více například následující kód :

<script>
        if (data.snippets) {
                for (var i in data.snippets) {
                        $("[id='"+ i +"']").html(data.snippets[i]);
                }
        }
</script>

Ten již zajistí, že se vždy přepíší všechny potřebné snippety.

Editoval Etch (23. 2. 2009 19:14)

 

#12 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Id by mělo teoreticky být unikátní. Pokud není, stránka je nevalidní a jsou s tím tyhle problémy.

Ideální by bylo, kdyby snippety byly označeny třídu a ne přes id. Anebo hlídat unikátnost toho id. To by mělo drobnou nevýhodu v tom, že by se takový vícenásobný snippet při aktualizaci přenášel vícekrát. K tomu se ale nějak musí postavit David, změna selektoru je spíše takový hack.

Online

 

#13 před 3 lety

Etch
Člen
Registrovaný: 24. 9. 2008
Příspěvky: 194

Re: Něco jako nette.js s jQuery

Ano id by mělo být unikátní, ale dokud se tohle nevyřeší není moc na výběr. Označování snippetů pomocí ID jim podle mého názoru bere jednu z jejich silných zbraní. Osobně bych asi taky radši označoval snippety pomocí class.

 

#14 před 3 lety

Ondrej
Člen
Registrovaný: 22. 10. 2008
Příspěvky: 128

Re: Něco jako nette.js s jQuery

Etch napsal(a):

<?php
@{? $grid->renderPaginator()}
@{? $grid->render()}
@{? $grid->renderPaginator()}
?>

Zrovna toto jsem resil, snazil jsem se i generovat nazev snippetu dynamicky v sablone napr. renderPaginator(‚bottom‘), ale nic nefungovalo spravne, takze jsem to nakonec vyresil takto:

<?php
 {snippet paginator}
 @{? $grid->renderPaginator()}
 {/snippet}
 @{? $grid->render()}
 {snippet bottom_paginator}
 @{? $grid->renderPaginator()}
 {/snippet}
?>

Ten, kdo tvrdí, že něco nejde udělat, by neměl překážet tomu, kdo to udělá…

 

#15 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Keď chcem spraviť pekný prechod medzi updatom snippetu, napríklad fade:

Přerozdělil jsem původní plugin do několika funkcí, jedna z nich je jQuery.updateSnippet. To v praxi znamená, že se dá snadno nahradit. Třeba takto:

jQuery.extend({
        updateSnippet: function (id, data) {
                $("#" + id).fadeOut("fast", function () {
                        $(this).html(data).fadeIn("fast");
                });
        }
});

No a už se to hezky mění s efektem fade.

Online

 

#16 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: Něco jako nette.js s jQuery

Díky moc, si borec :)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#17 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: Něco jako nette.js s jQuery

Po callbacku je treba znova zaregistrovať niektoré veci, ktoré nejdú cez jQuery.live ako napr texyla, alebo

// external links
$('a.external').attr('target', '_blank');
// hidden files
$('.hidden').attr('style', 'display: none');

Ak to ide nejak inak tak fajn, ja som si to spravil zatiaľ tak, že pridám do ajaxCallback za updaty snippetov funkciu jQuery.registerAfterUpdate() ktorá zostane prázdna

registerAfterUpdate: function () {

},

A vo svojom scripte volám niečo takéto:

jQuery.extend({
        // updateSnippet

        registerAfterUpdate: function() {
                // texyla
                $.texyla();
                // external links
                $('a.external').attr('target', '_blank');
                // hidden elements
                $('.hidden').attr('style', 'display: none');
        }
});

Editoval Jod (1. 3. 2009 13:00)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#18 před 3 lety

Ola
Nette guru
Registrovaný: 21. 10. 2008
Příspěvky: 478

Re: Něco jako nette.js s jQuery

BTW:

$('.hidden').hide();

;)

 

#19 před 3 lety

czend@
Nový člen
Registrovaný: 16. 3. 2009
Příspěvky: 2

Re: Něco jako nette.js s jQuery

zdravim ve spolek, jsem novacek a v tomhle se zatim poradne topim, nemate proto prosim nekdo nejaky uz funkcni kousek kodu, ktery by pokryval tuhle problematiku? neco ve stylu datagridu apod. predem moc diky, PS: sorry za OT

 

#20 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: Něco jako nette.js s jQuery

Zrovna asi před týdnem jsem si s tím hrál a zkošel na to napasovat DataGrid, tak tady máš:

 

#21 před 3 lety

czend@
Nový člen
Registrovaný: 16. 3. 2009
Příspěvky: 2

Re: Něco jako nette.js s jQuery

wau, tak tomu rikam rychlost reakce :) diky moc, prohrabnu to a snad se neco ujme :)

 

#22 před 3 lety

phx
Moderator
Registrovaný: 17. 4. 2008
Příspěvky: 879

Re: Něco jako nette.js s jQuery

Pekny, ale bez JS se neudrzi vybrany select:) Cimz to je dost neuzivatelsky.

 

#23 před 3 lety

Jod
Nette guru
Registrovaný: 24. 9. 2008
Příspěvky: 808

Re: Něco jako nette.js s jQuery

Jj, ale stačilo by pridať perzistentný parameter len :)


Všetko je v Akrabat.forms v examples distribúcie. Zomg, puff..

 

#24 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: Něco jako nette.js s jQuery

Po odeslání formuláře se selectem stačí přesměrovat (pokud nejde o ajaxový požadavek) a parametry se dostanou z POSTu do GETu a je po problému. Fixnul jsem to v tom archívu i v demu.

 

#25 před 3 lety

phx
Moderator
Registrovaný: 17. 4. 2008
Příspěvky: 879

Re: Něco jako nette.js s jQuery

:) Supr…

Dokonale:))

 

#26 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Není to dokonalé… Roman tam ještě nedal točítko :-D

Online

 

#27 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: Něco jako nette.js s jQuery

:D nejdriv musim prijit na to jak prenest to puvodni univerzalni do jQuery

 

#28 před 3 lety

jasir
Nette guru
Registrovaný: 4. 12. 2008
Příspěvky: 768

Re: Něco jako nette.js s jQuery

Ahoj, vypadá to, že ajax v nefunguje v IE – zřejmě potíže s jquery.live.
Ve své aplikaci jsem live() zkusil nahradit pluginem livequery, zdá se, že to šlape.

 

#29 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Hm… docela nečekaná zrada. Myslel jsem, že když je to od jQuery, tak to bude fungovat všude.

Online

 

#30 před 3 lety

jasir
Nette guru
Registrovaný: 4. 12. 2008
Příspěvky: 768

Re: Něco jako nette.js s jQuery

No, ono je u toho live() v dokumentaci uvedeno:
„Currently not supported: blur, focus, mouseenter, mouseleave, change, submit“, čili v tom
je zřejmě zakopaný pes. Snad to brzy dopracují. To livequery funguje prakticky stejně (akorát to funguje :)

 

#31 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Tak aspoň, že funguje click.

Online

 

#32 před 3 lety

A.
Člen
Registrovaný: 16. 4. 2008
Příspěvky: 124

Re: Něco jako nette.js s jQuery

Hezka prace Honzo M.!


Kuk.

 

#33 před 3 lety

LeonardoCA
Člen
Registrovaný: 12. 6. 2008
Příspěvky: 44

Re: Něco jako nette.js s jQuery

romansklenar napsal(a):

Zrovna asi před týdnem jsem si s tím hrál a zkošel na to napasovat DataGrid, tak tady máš:

v datagrid.js po funkci registerAfterUpdate je navíc čárka, která v IE shodí funkčnost javascriptů

jQuery.extend({
        //grafický efekt u překreslení všech snippetů
        updateSnippet: function (id, html) {
                $("#" + id).animate({ opacity: 0.5 }, "fast", "swing", function () {
                        $(this).html(html).animate({ opacity: 1 }, "fast", "swing");

                        jQuery.registerAfterUpdate();
                });
        },

        registerAfterUpdate: function() {
                // schovat odesílací tlačítka formulářů (nutno po každém překreslení snippetu)
                $("form.ajaxform :submit").hide();
        },
});

jinak v další verzi jquery 1.3.3 by už snad mělo fungovat vše i bez použití livequery

 

#34 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Vymyslel jsem ještě lepší ajaxování. Místo $.netteAjax bude možné použít normální funkce $.get, $.post a podobně. Jen pomocí funkce $.ajaxSetup nastaví nějaký defaultní callback, který se postará o snippety a tak.

jQuery.extend({
        updateSnippet: function (id, html) {
                $("#" + id).html(html);
        },

        netteCallback: function (data) {
                // redirect
                if (data.redirect) {
                        window.location.href = data.redirect;
                }

                // snipeti
                if (data.snippets) {
                        for (var i in data.snippets) {
                                jQuery.updateSnippet(i, data.snippets[i]);
                        }
                }
        }
});

jQuery.ajaxSetup({
        success: function (data) {
                jQuery.netteCallback(data);
        },
        dataType: "json"
});

Použití je stejné, jen funkci $.netteAjax zaměníte za libovolnou standardní funkci, třeba $.get. Rozdíl nastane v případě, že budete chtít při dokončení ajaxového požadavku zavolat vlastní callback. Pokud budete chtít provést snippetování a podobně, tak je potřeba explicitně zavolat funkci $.netteCallback:

// chci kromě normálního zpracování ještě zobrazit hlášku
$.get("someUrl", function (data) {
        jQuery.netteCallback(data);
        alert("hláška");
});

Na závěr přidám upravený kód pro ajaxové formuláře:

jQuery.fn.extend({
        netteAjaxSubmit: function (callback) {
                var form;
                var sendValues = {};

                // odesláno na tlačítku
                if (this.is(":submit")) {
                        form = this.parents("form");
                        sendValues[this.attr("name")] = this.val() || "";

                // odesláno na formuláři
                } else if (this.is("form")) {
                        form = this;

                // neplatný element, nic nedělat
                } else {
                        return null;
                }

                // validace
                if (form.get(0).onsubmit && !form.get(0).onsubmit()) return;

                var values = form.serializeArray();

                for (var i = 0; i < values.length; i++) {
                        var name = values[i].name;

                        // multi
                        if (name in sendValues) {
                                var val = sendValues[name];

                                if (!(val instanceof Array)) {
                                        val = [val];
                                }

                                val.push(values[i].value);
                                sendValues[name] = val;
                        } else {
                                sendValues[name] = values[i].value;
                        }
                }

                // odeslat ajaxový požadavek
                return jQuery.ajax({
                        url: form.attr("action"),
                        data: sendValues,
                        type: form.attr("method") || "get",
                        success: callback
                });
        }
});

Editoval Honza M. (8. 4. 2009 23:48)

Online

 

#35 před 3 lety

Ola
Nette guru
Registrovaný: 21. 10. 2008
Příspěvky: 478

Re: Něco jako nette.js s jQuery

Neměli by jste někdo kód (v jQuery), který by točítko přesunul na požadovaný místo? (teď to řešim tak, že schovám vše a zobrazim ho uprostřed) Za předpokladu že využuju ten kód od Honzy M.

 

#36 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Kód nemám, protože mi točítko uprostřed vyhovuje, ale udělalo by se to při kliknutí na odkaz asi takto (jestli jsem dobře pochopil z dokumentace ten jQuery offset).

$("a.ajax").click(function () {
        $.get(this.href);
        var ofs = $(this).offset();
        $("#tocitko").css({
                left: (ofs.left + 10) + "px",
                top: (ofs.top + 20) + "px"
        });
        return false;
});

Online

 

#37 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Vymazlil jsem točící kolečko u odkazu a dal příklad do nette extras.

Online

 

#38 před 3 lety

Ola
Nette guru
Registrovaný: 21. 10. 2008
Příspěvky: 478

Re: Něco jako nette.js s jQuery

Díky, to je to co sem potřeboval :)

Editoval Ola (21. 4. 2009 6:28)

 

#39 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5835

Re: Něco jako nette.js s jQuery

 

#40 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: Něco jako nette.js s jQuery

Píšeš tam jako ukázku:

// nastaví událost onclick pro všechny elementy A s třídou 'ajax'
$("a.ajax").live("click", function(event) {
        $.get(this.href); // zahájí AJAXový požadavek

        // zobrazí spinner, signalizující uživateli, že se něco děje
        $('<div id="ajax-spinner"></div>').css({
                position: "absolute",
                left: event.pageX + 20,
                top: event.pageY + 40

        }).ajaxStop(function() {
                $(this).remove(); // po skončení spinner smaž

        }).appendTo("body");

        return false;
});

To zobrazení toho ajaxloaderu nemusí být nutně v těle té funkce, může být i mimo a pak se bude provádět při každé detekci ajaxového požadavku, to je myslím jedna z jeho velkých předností :) možná by bylo zajívé pro čtenáře to tam zmínit (pokud to ještě jde upravit) než si to ráno budou lidi číst.

 

#41 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5835

Re: Něco jako nette.js s jQuery

romansklenar napsal(a):

To zobrazení toho ajaxloaderu nemusí být nutně v těle té funkce, může být i mimo a pak se bude provádět při každé detekci ajaxového požadavku, to je myslím jedna z jeho velkých předností :) možná by bylo zajívé pro čtenáře to tam zmínit (pokud to ještě jde upravit) než si to ráno budou lidi číst.

Teď asi nerozumím. Ajaxloaderem myslíš ten obrázek? A proč se nezobrazuje po ajaxStart() ?

 

#42 před 3 lety

romansklenar
Moderator
Registrovaný: 20. 7. 2008
Příspěvky: 780

Re: Něco jako nette.js s jQuery

Vlastně jo, chybí tam ajaxStart, proto to nejede …už tam vidím něco co tam není.

$("a.ajax").live("click", function () {
        $.get(this.href);
        return false;
});

// zobrazí spinner, signalizující uživateli, že se něco děje
$('<div id="ajax-spinner"></div>').css({
        position: "absolute",
        left: event.pageX + 20,
        top: event.pageY + 40

}).ajaxStart(function () {
        $(this).show();
}).ajaxStop(function() {
        $(this).hide();
}).appendTo("body").hide();

 

#43 před 3 lety

David Grudl
Administrator
Registrovaný: 8. 2. 2005
Příspěvky: 5835

Re: Něco jako nette.js s jQuery

Už asi rozumím. A ty vyvoláváš Ajaxové požadavky i jiným způsobem, než přes tu knihovnu?

 

#44 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

David Grudl napsal(a):

Honzo, jsi na Zdrojáku

Hezký… :-)

Už asi rozumím. A ty vyvoláváš Ajaxové požadavky i jiným způsobem, než přes tu knihovnu?

Když se spinner zobrazuje pomocí ajaxStartu, tak se zobrazí při jakémkoliv požadavku daném přes jQuery. Což kromě kliknutí na odkaz může být třeba ajaxové odeslání formuláře.

Online

 

#45 před 3 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: Něco jako nette.js s jQuery

Ahoj Honzo!

Jednak musím říct: skvělá práce! :)

A teď dotaz :) –

Mám takovou situaci – vykresluju tabulku, podobnou DataGridu, která obsahuje výpis adresářové struktury, vše jede jak má, ale kvůli multifile uploadu používám knihovnu http://www.uploadify.com .. ta podporuje spuštění kódu po provedení uploadu, a to pomocí fce onComplete (viz http://www.uploadify.com/documentation/), do této fce, která se pouští po provedení uploadu jsem umístil $.get({link list! $path, $orderBy, $rename}) → aby došlo k obnovení dat v snippetu. Požadavek se provede (FireBug mi jej zobrazí a je vidět, že Nette vrátí validní JSON odpověď s aktuální tabulkou (vč. nově uploadnutých souborů), jenže Tvůj JS kód jej nepřekreslí…

Původně jsem si myslel, že to je asi v kolizi s tou uploadovací knihovnou, tak jsem ji dal pryč a zkusil pouze něco ve smyslu:

function akce() {
    $.get({link list! $path, $orderBy, $rename});
}

setTimeout("akce()", 5000);

A opět, JSON obsahoval správný výsledek, ale ten nepřepsal, to co bylo starší.

Ptám se tedy: nevíš, kde by mohla být chyba?

Díky!

 

#46 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

No nevím… Zavolá se vůbec ten $.netteCallback?

Online

 

#47 před 3 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: Něco jako nette.js s jQuery

Honza M. napsal(a):

No nevím… Zavolá se vůbec ten $.netteCallback?

Ha, neprovede, ale jinak se provádí (ať už pokud jde o ajaxlink nebo o ajaxform)…

 

#48 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

Tak ho zavolej… asi ho něco přepisuje.

Online

 

#49 před 3 lety

Tomik
Nette Evangelist
Registrovaný: 20. 3. 2005
Příspěvky: 566

Re: Něco jako nette.js s jQuery

Aha, tak už jsem na to přišel. Dík!

Nakonec místo $.get({link list! $path, $orderBy, $rename}); volám $.netteAjax({link list! $path, $orderBy, $rename}); – původně jsem myslel, že i ten $.get zavolá callback sám, ale evidentně ne. To je jedno, problém vyřešen! :)

Editoval Tomik (27. 4. 2009 22:18)

 

#50 před 3 lety

Honza Marek
Moderator
Registrovaný: 31. 3. 2007
Příspěvky: 1632

Re: Něco jako nette.js s jQuery

No když nahraješ novou verzi toho pluginu, která je na webu v extras, tak tam žádná funkce $.netteAjax není a $.get opravdu volá $.netteCallback sám.

Online

 
Stránky: 1 2 3 Next

RSS feed RSS tématu

Zápatí