Autor Zpráva
Majo
Profil *
Potreboval by som poradiť.
Na stránke mám niekoľko formulárov (nie vždy rovnaký počet) ktoré zatiaľ spracovávam klasicky, t.j. znovunačítaním otvorenej stránky a spracovaním údajov iba z toho formulára, ktorý bol odoslaný tlačítkom.
Ja by som ale chcel, aby mi po odoslaní ľubovolného formulára odoslalo údaje iba z neho a tieto sa spracovali na pozadí, teda bez znovu načítania aktuálnej stránky.

Problémy mám s týmto:
1) ako zistím že bol formulár odoslaný
2) ako zistím, ktorý to bol formulár
3) ako zistím údaje práve z tohto formulára (ide o dva selecty a dve hidden polia)
4) ako tieto údaje odošlem do iného súboru php
Všetky tieto akcie bude pravdepodobne zabezpečovať samotný javascript, prípadne jquery. Alebo nie?

ďakujem vopred za každú radu.
mattyZEM
Profil
Majo:
2) ako zistím, ktorý to bol formulár
<form name="" action="" method="">

3) ako zistím údaje práve z tohto formulára (ide o dva selecty a dve hidden polia)
if(isset($_POST['nazev_formu'])){}
Majo
Profil *
mattyZEM:
ďakujem, ale ja viem ako spracovať formulár už v php skripte, ale neviem ako práve tieto údaje odoslať cez ten javascript, alebo jquery.
Chamurappi
Profil
Reaguji na mattyZEMa:
Nesmysl, name formuláře se neposílá.


Reaguji na Maja:
1) ako zistím že bol formulár odoslaný
Sleduj událost onsubmit.

3) ako zistím údaje práve z tohto formulára
Poskládáš si value formulářových prvků (v kolekci elements) do požadavku tak, jak si je při odesílání skládá prohlížeč.

4) ako tieto údaje odošlem do iného súboru php
XMLHttpRequestem, známým též jako AJAX.

Všetky tieto akcie bude pravdepodobne zabezpečovať samotný javascript, prípadne jquery.
I jQuery je jen JavaScript, nic víc.

Nepoužívám frameworky, řešil bych to asi takto:
function zajaxujFormulare(callback)
{
  for(var i = 0, f; f = document.forms[i]; i++)  // projdeme všemi formuláři
  {
    f.onsubmit = function()
    {
      var xhr = vyrobXMLHttpRequest();  // -- tuhle funkci si vyrobíš podle návodů k AJAXu, které si dohledáš
      if(!xhr) return true;  // není-li AJAX, odešleme normálně

      var hodnoty = [];
      for(var i = 0, e; e = this.elements[i]; i++)  // projdeme všemi formulářovými prvky tohoto formuláře
      {
        // posíláme pouze zaškrtnutá zaškrtávátka a přepínače, nebo jiné prvky s name
        if(e.name && (e.checked || e.type != "radio" && e.type != "checkbox") && !e.disabled)
          hodnoty.push(encodeURIComponent(e.name) + "=" + encodeURIComponent(e.value));
      }
      var uri = f.action, data = hodnoty.join("&");  // cílová adresa a připravená data

      xhr.open(f.method, f.action);
      if(f.method.toUpperCase() == "GET")  // je-li metoda GET, přidáme data k adrese
      {
        uri += "?" + data;
        data = null;
      }
      else  // je-li POST, nastavíme MIME typ dat
      {
        xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
      }

      if(callback)  // chceme-li zpracovávat odpověď od serverového skriptu…
      {
        var formular = this;
        xhr.onreadystatechange = function()
        {
          if(xhr.readyState != 4) return;
          callback(formular, xhr.responseText);
        };
      }
      xhr.send(data);
      return false;  // stornujeme výchozí akci — odeslání formuláře prohlížečem
    };
  }
}

Do patičky stránky pak dáš:
<script>
  zajaxujFormulare();
</script>

Přeješ-li si zpracovat to, co ti pošle server, přidej funkci:
function zpracovaniOdpovedi(formular, text)
{
  alert("Vyhodnocení formuláře se jménem " + formular.name + ": " + text);
}
… a do volání callback:
<script>
  zajaxujFormulare(zpracovaniOdpovedi);
</script>
mattyZEM
Profil
Chamurappi:
Nesmysl, name formuláře se neposílá.
Nicht? Já myslel že ano, tak to promiňte :) moje chyba.
Majo
Profil *
Chamurappi:
Ďakujem. Som v javascripte začiatočník, ale skúsim sa s tým pohrať. Snáď to pochopím.

Nebolo by ale lepšie a rýchlejšie riešiť to predsa len pomocou toho jquery? Bol by som vďačný aj za túto možnosť.
Upresňujem, že z toho formulára budem potrebovať odoslať a spracovať iba dva select-y a jedno hidden pole. Tieto selecty a hidden majú rovnaké meno vo všetkých formulároch,mení sa iba ich hodnota. Nič iné, žiadne prepínače, začiarkávacie políčka, vstupné input texty a pod.

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: