Autor Zpráva
TFSi
Profil
Zdravím,
snažím se spáchat odesílání formuláře přes AJAX, ale vzhledem k tomu, že mé znalosti JS jsou pouze elementární, tak se mi už pěknou dobu nedaří.
Vygooglil jsem si tento skript:

<script type="text/javascript">
function poslat(){
var ajax = (window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : false));
if(!ajax){
alert("Tak tady to nepoběží!");
return true;
}
ajax.onreadystatechange= function () {zpracuj(ajax); } ;
//metoda GET
ajax.open("GET", "/store/md5.php?text="+document.form0.text.value, true);
ajax.send(null);
//totéž metodou POST
//ajax.open("POST", "store/md5.php", true);
//ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
//ajax.send("text="+document.form0.text.value);

return false
}
function zpracuj(ajax){
var txt;
if (ajax.readyState == 4){ //bylo odpovězeno
if(ajax.status == 200 || ajax.status==0){
txt=ajax.responseText;
document.getElementById("md5").innerHTML = " = " + txt;
}
else alert("Chyba: "+ ajax.status +":"+ ajax.statusText);
}
}
</script>
<form name="form0" method="get" action="/store/md5.php">
MD5:<br />
<input type="text" name="text" />
<span id="md5"></span><br />
<input type="submit" onclick="return poslat()" />
</form>

který na původní stránce funguje bez problémů, ale po zkopírování na mou stránku začne házet chybu:
syntax error
ajax.onreadystatechange= function () ;

a jako místo chyby je označen ten středník na konci.

Mohl by jste mi, prosím, někdo poradit co dělám špatně, že tam to funguje a mě ne?
joe
Profil
Neměl by tento řádek
ajax.onreadystatechange= function () {zpracuj(ajax); } ;

být třeba takhle
ajax.onreadystatechange= new Function ('zpracuj(' + ajax + ')') ;

?
Chamurappi
Profil
Reaguji na joa:
Určitě neměl. Jednak je to velikánské FUJ (zrovna jsem o tom psal vedle), jednak proměnná „ajax“ převedená do řetězce ztrácí veškerou funkčnost.
joe
Profil
Chamurappi
Ale já jsem proměnnou ajax nedal do řetězce... V řetězci je jen metoda zpracuj() s parametrem ajax. Pokud by ta metoda nebyla jako řetězec, tak by se zavolala jen jednou a to právě při provádění tohoto řádku nebo ne?
TFSi
Profil
joe
Díky za snahu, vracelo to ještě horší chybu než to originální.

Nakonec jsem ze zoufalství zkusil z řádku
ajax.onreadystatechange= function () {zpracuj(ajax); } ;

udělal
ajax.onreadystatechange= function() zpracuj(ajax);  ;

(odstranil jsem ty složené závorky) a už to funguje. Sice vůbec netuším jak a proč, ale hlavní je že to plní účel... ;)
es
Profil *
A nedalo by sa to jednoduchšie:
ajax.onreadystatechange= zpracuj;
a
function zpracuj(ajax){
upraviť na:
function zpracuj(){
?
Chamurappi
Profil
Reaguji na joa:
Ale já jsem proměnnou ajax nedal do řetězce...
Co je podle tebe výsledkem sloučení řetězce „zpracuj(“, proměnné „ajax“ a řetězce „)“? Já bych řekl, že z toho vyleze řetězec „zpracuj([object něco])“.

Pokud by ta metoda nebyla jako řetězec, tak by se zavolala jen jednou a to právě při provádění tohoto řádku nebo ne?
Ne. Definuješ-li funkci jako řetězec, tak funkčnost přiřazení nijak nezměníš, jen snížíš efektivitu a přehlednost kódu.


Reaguji na TFSi:
(odstranil jsem ty složené závorky) a už to funguje
Ukaž, prosím. Zápis bez složených závorek běhá (pokud vím) jen a pouze v nejnovější Mozille a musí fungovat přesně stejně jako zápis se závorkami.

Sice vůbec netuším jak a proč
To jsme dva. Nevěřím, že jsi popsaným zásahem vyřešil svůj problém.
joe
Profil
--- Sice píšu asi OT, ale téma budu sledovat a ještě musím reagovat, takžé mé příspěvky neberte v potaz :)

Chamurappi
Co je podle tebe výsledkem sloučení
Sloučením je řetězec, ale před převedením na řetězec se za "ajax" doplní jeho hodnota/objekt...

Takže když bych to apostrofy neukončoval, za "ajax" by se nic nedoplnilo.

A pokud se píše ... new Function ( ... v závorkách jsou uvozovky a tam je napsaná funkce, jako string. Už jsem se s tím několikrát setkal, ale nevím jestli to je dobře, nejsem takový odborník na JS :) Ale uvedu příklad, co jsem našel:

document.getElementById("nav_menu").onclick=new Function("minMaxThumb();");
celý kód je tady.
Chamurappi
Profil
Reaguji na joa:
před převedením na řetězec se za "ajax" doplní jeho hodnota/objekt
Zavolá se „ajax.toString()“ a výsledek (což bude v tomto případě doslova „[object něco]“) se dosadí do výsledného řetězce. Zkonvertuje se tedy do dvojice slov, která vyvolá syntaktickou chybu.

pokud se píše ... new Function ( ... v závorkách jsou uvozovky a tam je napsaná funkce, jako string
Ano, to je prasárna.

uvedu příklad, co jsem našel
Ten jde zapsat efektivněji a čistěji takto:
document.getElementById("nav_menu").onclick = function()
{
  minMaxThumb();
};
joe
Profil
Chamurappi
Aha, tak díky za vysvětlení, už mlčím! :-)
es
Profil *
Chamurappi
Ten jde zapsat efektivněji a čistěji takto:
document.getElementById("nav_menu").onclick = function()
{
minMaxThumb();
};

Alebo snáď aj:
document.getElementById("nav_menu").onclick = minMaxThumb;
Alebo mi niečo podstatné uniká?
Chamurappi
Profil
Reaguji na es:
Neuniká. Ale kdyby funkce „minMaxThumb“ vracela nějakou hodnotu (třeba false) a kdyby element s id="nav_menu" byl třeba odesílací tlačítko formulář, tak by se funkčnost lišila, protože moje a joova funkce nic nevrací.
es
Profil *
Chamurappi
Ten možný rozdiel vo funkčnosti mi je jasný, no v konkrétnom scripte joea funkcia minMaxThumb nič nevracia.
Zdá sa mi dosť zvláštne definovať funkciu, ktorá nerobí nič iné, len volá inú funkciu.
Snáď je lepšie tú prvú správne definovať.
TFSi
Profil
Chamurappi a spol:
nakonec - po dvou dnech je zakopaný pes nalezen:
problém se skrývá v parseru šablon, který mi { cokoliv } převede na blok určený k převodu... No a když nikde nemám nastaveno co se má převést, tak prostě ten blok zmizí a z
ajax.onreadystatechange= function () {zpracuj(ajax); } ;

vznikne
ajax.onreadystatechange= function ()  ;
:(

Takže AJAX jako takový funguje - omlouvám se za dezinformace a jdu to řešit na úroveň PHP ;)

TFSi
RAmses
Profil
Možná už zbytečné, ale nevidím důvod vytvářet anonymní funkci abych v ní pouze zavolal jinou funkci. Jsou dvě možnosti
ajax.onreadystatechange= function () {
    // javascript kontrolující stav požadavku a následná akce
} ;


nebo pokud by byla fce zpracuj univerzální
ajax.onreadystatechange= zpracuj(ajax);


To, že něco funguje ještě neznamená, že je to v pořádku
es
Profil *
RAmses
nebo pokud by byla fce zpracuj univerzální
ajax.onreadystatechange= zpracuj(ajax);

Nie, to je chyba, správne je:
ajax.onreadystatechange= zpracuj;

To priradí do vlastnosti onreadystatechange objektu ajax funkciu zpracuj.
x = zpracuj(ajax);
To zavolá funkciu zpracuj a jej návratovú hodnotu priradí do x.
Chamurappi
Profil
Reaguji na es:
v konkrétnom scripte joea funkcia minMaxThumb nič nevracia
Vskutku. Kdybych si toho všiml, tak bych obalující funkci nevyráběl.
Chtěl jsem pouze poskytnout ukázku čistšího zápisu ekvivalentního k „new Function("minMaxThumb();")“.


Reaguji na RAmsese:
nevidím důvod vytvářet anonymní funkci abych v ní pouze zavolal jinou funkci
Řekl bych, že je to jediná možnost, chci-li té jiné funkci předat nějaký vlastní argument (nebo utlumit její návratovou hodnotu).

To, že něco funguje ještě neznamená, že je to v pořádku
Přiřazuješ-li místo funkce výsledek jejího okamžitého zpracování, tak to ani nefunguje, ani to není v pořádku.
(Pokud tedy není funkce „zpracuj“ upravena tak, že vrátí funkci, což by bylo nezvyklé.)
RAmses
Profil
Ano, pokud fce zpracuj má návratovou hodnotu, pak je samozřejmě nutné použít anonymní funkci. Ovšem jak je zřejmé z TFSioho kódu, toto není ten případ, protože zde není návratová hodnota ale výstup na obrazovku.
es
Profil *
RAmses
Než opakovať v príspevku to, čo už bolo napísané inými, tak by bolo lepšie naučiť sa základy syntaxe JavaScriptu.
Chamurappi
Profil
Reaguji na RAmsese:
zde není návratová hodnota ale výstup na obrazovku
Ale má předávaný argument, proto je anonymní funkce nutná.
RAmses
Profil
es
Dík, vezmu si to k srdci
es
Profil *
Chamurappi
Ale má předávaný argument, proto je anonymní funkce nutná.
V tomto prípade áno, no dá sa to prerobiť tak, aby nebolo treba funkcii nič predávať.
Buď tak, že je objekt ajax globálny, ak netreba súčasne viac spojení,
alebo sa funkcia môže k objektu ajax dostať aj bez toho, aby ho bolo treba predávať.
RAmses
Profil
es
Já používám objekt ajax jako globální. Měl jsem problém s tím, že když jsem vícekrát klikl na mapové podklady(pro jejich přiblížení) tak docházelo k nenačtení podkladů a končilo to nějakým exception v prohlížeči. Udělal jsem tedy z proměnné ajax pole a při vytváření objektu jsem použil index, který byl také globální a zvětšoval se.

Je to prasácké řešení? Po tom kiksu s přiřazením funkce si už nejsem ničím jistý :)

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: