Něco jako nette.js s jQuery

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

jej moje chyba =) to napovídání funguje, stačilo nastavit na data type HTML…

ViliamKopecky
Nette hipster | 230
+
0
-
$("a.ajax").live("click", function (event) {
    event.preventDefault();
    $.get(this.href);
});

má to drobnou vadu nevím jak ji vyřešit. Na tomto chování se to pokusím znázornit.

  • levé tlačítko – OK – ajaxový požadavek
  • pravé tlačítko – Opera vyvolá contextmenu, Firefox vyvolá ajaxový požadavek
    • Opera může přes contextmenu otevřít odkaz do nového tabu/okna
  • kolečko (které standardně otevírá do novýho tabu) vyvolá u obou jen ajaxový požadavek.

Tohle chování mi nepřijde uplně ideální… Rád bych aby to fungovalo tak jak má:

  • levé – ajax
  • pravé – menu
  • prostřední – tab.

Jenže jak? :)

Ondřej Mirtes
Člen | 1536
+
0
-

Trochu jsem googlil a event.button nabývá různých hodnot podle toho, jaké tlačítko bylo zmáčknuto, tak to zkus prozkoumat :)

ViliamKopecky
Nette hipster | 230
+
0
-

díky, navedl jsi mě na správné místo…

$("a.ajax").live("click", function (event) {
        if (event.which != 1) {
            return true;
        }
        event.preventDefault();
        $.get(this.href);
        return false;

});

Editoval enoice (24. 11. 2009 18:19)

uestla
Backer | 799
+
0
-

Zdravím – chci se optat a možná i dát menší feature request…

Ve skriptu AJAX formulářů se kontroluje, jestli objekt, na kterém je metoda ajaxSubmit() volána, je odesílací tlačítko a nebo formulář samotný. Formulář jde ale odeslat ještě inputem typu image – s tím je ale zároveň spojeno i odeslání x-ové a y-ové souřadnice…

Nemá někdo spásný nápad, jak by se do skriptu dala zapracovat i možnost AJAXově odeslat formulář i pomocí obrázkového tlačítka?

Pouhé následující „vylepšení“ stávajícího skriptu je jenom poloviční záplata:

- 16:		if (this.is(":submit")) {
+ 16:		if (this.is(":submit, :image")) {

Tím se akorát zajistí možnost odeslání, nikoli však předání souřadnic (bez čehož bych takovéhle polovičaté řešení považoval za nesystémové).

peci1
Člen | 60
+
0
-

uestla napsal(a):

Zdravím – chci se optat a možná i dát menší feature request…

Ve skriptu AJAX formulářů se kontroluje, jestli objekt, na kterém je metoda ajaxSubmit() volána, je odesílací tlačítko a nebo formulář samotný. Formulář jde ale odeslat ještě inputem typu image – s tím je ale zároveň spojeno i odeslání x-ové a y-ové souřadnice…

Nemá někdo spásný nápad, jak by se do skriptu dala zapracovat i možnost AJAXově odeslat formulář i pomocí obrázkového tlačítka?

Pouhé následující „vylepšení“ stávajícího skriptu je jenom poloviční záplata:

Ahoj, zrovna jsem narazil na ten samy problem…
Pokud nepotrebujete souradnice kliknuti (coz je jen ta polovicni zaplata), staci tenhle hotfix:

- 16:		if (this.is(":submit")) {
+ 16:		if (this.is(":submit, :image")) {

-19:
+19: 	        if (this.is(":image")) {
+20:                sendValues[this.attr("name")+".x"] = "0";
+21:                sendValues[this.attr("name")+".y"] = "0";
+22:            }
  • je jeste treba dodat do kodu, ktery zajaxovani formularu provadi, aby bral i input:image.

Po dlouhem patrani jsem ale nalezl i vice „systemove“ reseni (to ovsem samozrejme vyzaduje trochu vetsi zasah).
(zmeny jsou na radcich s * na zacaatku)

 jQuery.fn.extend({
*	ajaxSubmit: function (callback, data) {
		var form;
		var sendValues = {};

		// submit button
*		if (this.is(":submit") || this.is(":image")) {
			form = this.parents("form");
                        sendValues[this.attr("name")] = this.val() || "";
*                       if (this.is(":image")) {
*                           if (data && data['submittedBy'] &&
*                                   data['submittedBy'] == 'mouse') {
*                               sendValues[this.attr("name")+".x"] = data['x'];
*                               sendValues[this.attr("name")+".y"] = data['y'];
*                           } else {
*                               sendValues[this.attr("name")+".x"] = "0";
*                               sendValues[this.attr("name")+".y"] = "0";
*                           }
*                       }

		    // form
    		    } else if (this.is("form")) {
                        form = this;

		    // invalid element, do nothing
		    } else {
			return null;
		    }

To by byla prvni cast zmen, ted jeste jak detekovat souradnice kliknuti. Na stranky, kde chci zajaxovat formulare, vkladam bezne tenhle kod:

$(function () {
        //send on forms
        $("form").livequery("submit", function () {
                $(this).ajaxSubmit(function (payload) {
                 jQuery.nette.success(payload);
                });
                return false;
        });
        //send by button
        $("form :submit").livequery("click", function () {
                $(this).ajaxSubmit(function (payload) {
                 jQuery.nette.success(payload);
                });
                return false;
        });
});

Tenhle kod je treba upravit na nasledujici:

$(function () {
*       var submittedBy = {};
        //send on forms
        $("form").livequery("submit", function () {
                $(this).ajaxSubmit(function (payload) {
                 jQuery.nette.success(payload);
                });
                return false;
        });
        //send by button
        $("form :submit").livequery("click", function () {
                $(this).ajaxSubmit(function (payload) {
                 jQuery.nette.success(payload);
                });
                return false;
        });
*       $("input:image").livequery("click", function (e) {
*               data = {'submittedBy':submittedBy[$(this).attr('name')]};
*               if (data['submittedBy'] == 'mouse') {
*                   data['x'] = Math.floor(e.pageX - $(e.target).offset().left);
*                   data['y'] = Math.floor(e.pageY - $(e.target).offset().top);
*               }
*
*               $(this).ajaxSubmit(function (payload) {
*                jQuery.nette.success(payload);
*               }, data);
*               return false;
*       });
*
*       $("input:image").livequery("mousedown", function (e) {
*           submittedBy[$(this).attr('name')] = "mouse";
*       });
*
*       $("input:image").livequery("keypress", function (e) {
*           submittedBy[$(this).attr('name')] = "key";
*       });
});

Mozna by se (alespon prvni cast) tenhle fix dal zaradit do verze v extras.

Endrju
Člen | 147
+
0
-

Ahoj, nevim zda jsem neco podobneho uz necetl ale nemuzu to najit. Daloby se udelat efekt, kdyz pouzivam „DependentSelectBox“:„https://componette.org/search/?q=dependentselectbox“ udelat, aby se ve chvili volani ajaxoveho pozadavku (tedy do zavisleho selectboxu se zrovna nacitaji nova data), tak aby se nad formularem zobrazil spinner, formular lehce pohasnul a byl po tu dobu „neaktivni“? aby se do nej nedalo klikat..? :)

Diky

Endrju
Člen | 147
+
0
-

Ahoj Honzo.. paradni pocin.

Hele chci se zeptat, jak by se dalo udelat, aby se mi ajax spinner zobrazil i pri odesilani formulare? U ajaxovych odkazu ho uz mam, ale nevim jak s formulari.

No a idelane aby se to chovalo takto: U odkazu aby se zobrazil spinner tam, kde jsem na odkaz kliknul (to uz mam viz) a u formularu, aby se zobrazil uprostred daneho formulare (nebo prekreslovane oblasti), formulari se nastavil nejaky efekt – treba fadeTo(0.5) a aby se do nej nedalo behem odesilani pozadavku klikat (neni ale nutne).

Pouzivam Nette 0.9.6 (php5.2) a skripty Ajax s jQuery (jquery.nette.js), Ajaxové formuláře (jquery.ajaxform.js)jquery-1.4.3.min.js

Dekuju moc !

stefi023
Člen | 71
+
0
-

Ahoj, chtel jsem se zeptat, zda nekdo neresil ve funkci updateSnippet situaci, kdy chce updatovat snippet, pouze kdyz je jiny nez puvodni. Zkousel jsem nejruznejsi podminky, zkousel jsem trim()y, lengthy a jiny vylomeniny ale nikdy jsem nedokazal dostat z podminky true, ze by se stary obsah snipetu rovnal nove vlozenemu. Kdyz to prozenu pres trim(), a length maji stale rozdilne delky, i kdyz v konzoli vypadaji naprosto stejne a po prekopirovani a udelani diffu take…
diky za info
PS: chapu ze je to spis otazka na jQuery, ale verim ze tu je nekdo kdo bude mit nejaky napad

arron
Člen | 464
+
0
-

Zkousel jsi nejaky hash?

stefi023
Člen | 71
+
0
-

Hash jsem nezkousel, ale predpokladam, ze pokud nemaji stejnou delku tak nikdy stejny hash mit nebudou…nebo se mylim?

kashpi
Člen | 48
+
0
-

Kvůli DependedSelectBoxu jsem musel použít tento skript. Ale nastal mi problém. Ve svém projektu využívám jQuery-ui a konkrétně, když používám tahání obsahu přes ajax v tabech, tak mi to přestalo po nalinkování toho souboru fungovat. Jak ho oddělám tak to zase funguje. Takže mi buď funguje jedna věc a nebo druhá ale nikdy ne obě :( Víceméně ten obsah se natáhne přes ajax, ale nevypíše se. Když si přes Firebug konzolu nechám vypsat co se děje, tak data dostane, ale tab pořád píšeš error. Už jsem zkoušel i různý pořadí souborů, ale pořád nic. Nevíte někdo co s tím?

ptacek.pavel
Člen | 27
+
0
-

Ahoj,
myslím, že by nebylo úplně od věci doplnit globální event poté, co jsou snippety aktualizovány. Zachoval bych si tím možnost, že používám stále pohodlně $.get(url) a přitom na každém jednotlivém elementu po načtení můžu spustit buď globální nebo lokální event:

<script>
function ajaxForm() { $(this).ajaxSubmit(); return false; }

$('button.nejaky').on('click', ajaxForm).on('nette.ajaxSuccess.global', function() { /* globalni event volany pri dokonceni jakehokoli snippetu */ });

$('#snippet-loginform').on('nette.ajaxSuccess.local', function() { /* lokalni loaded event na tomto konkretnim snippetu */ });
</script>

Knihovna by vypadala takto:

<script>
jQuery.extend({
    nette: {
        updateSnippet: function (id, html) {
            $("#" + id).html(html).trigger('nette.ajaxSuccess.local'); /* ZMENENO */
        },

        success: function (payload) {
            // redirect
            if (payload.redirect) {
                window.location.href = payload.redirect;
                return;
            }

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

	    // Call global event
            $.event.trigger('nette.ajaxSuccess.global')
        }
    }
});

jQuery.ajaxSetup({
    success: jQuery.nette.success,
    dataType: "json"
});
</script>

Netestováno

tivvit
Člen | 36
+
0
-

Ahoj,

pokusil jsem se upravit script pro použití v unobtrusive javascriptu pro jquery 1.9 (kde stará verze nefunguje kvůli odstranění metody .live)

$(document).on("click", function (event) {
	if ($(event.target).is('a.ajax')) {
		event.preventDefault();
		$.get(event.target.href);
	}
});

prosím o kontrolu a případné mergnutí do stránky addonu

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

Eh :) … když už léčit zkamenělinu, tak aspoň vhodně :) :

$(document).on('click', 'a.ajax', function (event) {
	event.preventDefault();
	$.get(this.href);
});

Nicméně doporučuju použít nette.ajax.js.

Editoval vojtech.dobes (18. 4. 2013 13:04)

Nich
Člen | 49
+
0
-

Mám takový malý problém s tím, že chci filtrovat data, která se budou posílat. Potřebuji odfiltrovat všechny formulářové prvky jejichž rodič <tr>classu 'nopost'.

<form id="myForm" ... >
    <table>
        <tr class="nopost">
            <td><input /></td>
        </tr>
        <tr>
            <td><input /></td>
        </tr>
        ...
    </table>
</form>

Zkusil sem tedy menší zásah do addonu:

// get values
//var values = form.serializeArray();

var values = $('*', '#'+this.attr('id')).filter(function() {
    return !$(this).closest('.nopost').length;
}).serializeArray();

// tohle  funguje
// var values = $('*', '#'+this.attr('id')).serializeArray();

Post se odesílá správně (se správně vyfiltrovanými daty), ale na straně presenteru se už nic nestane. Po odkomentování 2. řádku (původního) nebo posledního a zakomentování 4–6 vše funguje v pohodě. Netušíte někdo, kde by mohl být zakopaný pes? Vadí nějak nette, že v postu nejsou všechny formulářové prvky?

EDIT: orig. soubor pro srovnání: https://files.nette.org/….ajaxform.js

EDIT 2:
Zkoušel sem sledovat co odchází v POSTu a co přichází jako response a zajímavé je, že při odeslání nevyfiltrovaných dat mi příjde jako odpověď:

{
  "name": "Content-Type",
  "value": "application/json"
},

v contentu jsou potom jen dané snippety.

Ale pokud data profiltruju, tak dostávám zpět:

{
  "name": "Content-Type",
  "value": "text/html; charset=utf-8"
},

no a v contentu je potom celá stránka (beze změn od odeslané). Nevím proč je to takhle, ale příjde mi, jako by se obslužná metoda

public function launchFormSubmitted($form)

vůbec nezavolala při vyfiltrovaném POSTu.

Tady jsou k nahlédnutí request a response:

Editoval Nich (24. 4. 2013 0:42)