Autor Zpráva
CZghost
Profil
Zkouším využít AJAX od JQuery, přičemž mám dva skripty PHP, které AJAX volá:
function bindAjax() {
    $("#switch1").bind("change",function(){
        if($("#switch1").checked){
            $("#formCont").load(
                "ajax1.php",
                "switch="+$("#switch1").val(),
                function(response,status,XMLHttpRequest){
                    if(status=="error"){
                        alert("An error has occured:\n"+XMLHttpRequest.status+" "+XMLHttpRequest.statusText);
                    }
                }
            );
        }
    });
    $("#text").bind("change",function(){
        if($("#switch1").checked){
            $("#result").load(
                "ajax2.php",
                "switch="+$("#switch1").val()+"&text="+$("#switch1").val(),
                function(response,status,XMLHttpRequest){
                    if(status=="error"){
                        alert("An error has occured:\n"+XMLHttpRequest.status+" "+XMLHttpRequest.statusText);
                    }
                }
            );
        }
    }
}
Kód jsem maximálně zjednodušil, ve skutečnosti mám radia dva: switch1 s hodnotou encode a switch2 s hodnotou decode a kód jsem ošetřil pro každý radio zvlášť.
Dále mám textové pole, které má posílat text k (de)kódování. Ten první ajax pouze mění hodnotu placeholderu podle zadaného radia, druhý ajax koná buď kódování pomocí funkce urlencode nebo dekódování pomocí funkce urldecode, podle zvoleného radia.
<input type="text" name="text" id="text" placeholder="Your text to be (decoded|encoded)..." />
Výpis placeholderu provádím pomocí switche, (de)kódování také.

Už jsem to zkoušel, bohužel to nefunguje. Neví někdo, jak to mám provést? Tohle je jediné řešení, na které jsem přišel a které selhalo.
CZghost
Profil
Možná jsem špatně formuloval dotaz. Potřebuju nějak zprovoznit kód, který je již výše (kón není celý, každá část je ošetřena na #switch1 a #switch2, ale bohužel to nefunguje. Obsah stránky se nechce měnit. Potřebuju vědět, co dělám špatně, protože to nikde nevidím.
Chamurappi
Profil
Reaguji na CZghosta:
"switch="+$("#switch1").val()+"&text="+$("#switch1").val(),
Tohle je správně?

$("#text").bind("change",function
Existuje v tu chvíli #text? Pokud celý <input> při různých příležitostech přemazáváš, tak na něm samozřejmě nastavené odchycené události nezůstane.

$("#switch1").bind("change"
V Exploreru zaškrtnutí nevyvolává událost onchange hned, lepší je chytat kliknutí.

Ten první ajax pouze mění hodnotu placeholderu podle zadaného radia
Co to? Proč na změnu jednoho slova používáš AJAX? Mimochodem, placeholder nefunguje v Explorerech 9 a nižších.

druhý ajax koná buď kódování pomocí funkce urlencode nebo dekódování pomocí funkce urldecode, podle zvoleného radia
Na to také nepotřebuješ žádnou spolupráci serveru.
CZghost
Profil
Chamurappi:
Já jsem chtěl jen vyzkoušet, jestli jde použít ajax vícekrát a co všechno php dokáže.

Existuje v tu chvíli #text? Pokud celý <input> při různých příležitostech přemazáváš, tak na něm samozřejmě nastavené odchycené události nezůstane.
#text existuje už od začátku, jinak by se nic nezobrazilo. Myslíš, že to nefunguje, protože se obsah includuje?

Co to? Proč na změnu jednoho slova používáš AJAX? Mimochodem, placeholder nefunguje v Explorerech 9 a nižších.
Zkouším ajax, všechno to dělám jako experiment, nikam na web to dávat nebudu. Placeholder nefunguje v devítkách? To je mi novinka. Devítku teď ale moc lidí nemá, ne? Myslíš, že to mám ošetřit o pro uživatele devítky a nižších, když desítka a jedenáctka fungují téměř totožně jako devítka?

Na to také nepotřebuješ žádnou spolupráci serveru.
Serverové počítače bývají kolikrát výkonnější než běžný počítač návštěvníka, výsledky v PHP jsou ohromné. Myslíš, že mám přeci jen radeji použít JS?

Tohle je správně?
Jé, tohodle jsem si nevšiml :D Děkuju za upozornění :)
Chamurappi
Profil
Reaguji na CZghosta:
Myslíš, že to nefunguje, protože se obsah includuje?
Myslím, že to nefunguje, protože <input>, na který navěšuješ události, už dávno neexistuje. Místo něj je nějaký nový element, který možná stejně vypadá a možná má i stejné id, ale už to není ten <input>, který číhá na change.

Devítku teď ale moc lidí nemá, ne?
Osmička je mnohem rozšířenější než devítka, v ní samozřejmě placeholder také nefunguje.
Krom toho placeholder zneužíváš, má sloužit k ukázání možné hodnoty, nikoliv k popisu políčka, popis patří do <label>u.

Myslíš, že to mám ošetřit o pro uživatele devítky a nižších, když desítka a jedenáctka fungují téměř totožně jako devítka?
Nerozumím, jaký vliv na rozhodnutí o ošetření má fakt, že jsou si devítka, desítka a jedenáctka podobné.

Serverové počítače bývají kolikrát výkonnější než běžný počítač návštěvníka
To je možné, ale když ti tam přijde milion návštěvníků, tak i kdyby měli třiosmšestku, tak mají ke zvládnutí převodu v rozumném čase lepší předpoklady než tvůj jeden serverový počítač.
Krom toho se s vysláním HTTP požadavku pojí mnohonásobně větší režie, než se samotným převodem nativní JS funkcí encodeURIComponent.

Teď jsem si uvědomil vtipný detail — k tomu, abys mohl řetězec nepoškozený předat na server, ho stejně musíš URL-nekódovat na straně klienta. Ve výše uvedeném kódu to neděláš, takže třeba texty s ampersandem budou zlobit a na diakritiku se také nedá moc spoléhat.
CZghost
Profil
Chamurappi:
Místo něj je nějaký nový element, který možná stejně vypadá a možná má i stejné id, ale už to není ten <input>, který číhá na change.
To znamená, že i když odkazuje na element s tím id, tak ho nenajde, protože je místo něj jiný element se stejným id, tudíž javascript je natolik hloupý, že ten nový element nedokáže nalinkovat. Takhle jsi to myslel? Asi bug, nebo s tím autor nepočítal.

Osmička je mnohem rozšířenější než devítka, v ní samozřejmě placeholder také nefunguje.
To má po nějaké té době ukončení podpory XP ještě někdo tento systém, že si nemůže nainstalovat novější Explorer? Pravdou je, že na naší škole jsou ještě Windows 98, ale ty nejsou připojeny na internet. XPčka se na naší škole také budou v brzké době měnit, nehledě na to, že jich je tam už málo.

ale když ti tam přijde milion návštěvníků, tak i kdyby měli třiosmšestku, tak mají ke zvládnutí převodu v rozumném čase lepší předpoklady než tvůj jeden serverový počítač.
Tak to by u mého webu nehrozilo :) Třiosmšestku neznám, to jsou Windows?

k tomu, abys mohl řetězec nepoškozený předat na server, ho stejně musíš URL-nekódovat na straně klienta. Ve výše uvedeném kódu to neděláš, takže třeba texty s ampersandem budou zlobit a na diakritiku se také nedá moc spoléhat.
Tomu nerozumím...
Chamurappi
Profil
Reaguji na CZghosta:
tudíž javascript je natolik hloupý, že ten nový element nedokáže nalinkovat
Ne, chybu dělá autor skriptu. JavaScript není CSS, nepíšeš tam šablonu chování pro elementy odpovídající určitým pravidlům, ale přímo ovlivňuješ to, co už v DOMu existuje. Funkce $ ti vyhledá všechny elementy odpovídající uvedenému pseudoselektoru v okamžiku, kdy ji voláš — nahází si je do jakéhosi pole. Ty s takto nalezenými elementy něco provedeš, přiřadíš jim třeba odchytávání události onchange. Když později celý obsah rodiče elementu s id="text" nahradíš za nový HTML kód (a je fuk, jestli AJAXem, nebo něčím jiným), tak ten element, na který jsi při načtení stránky přiřazoval odchytávání události, už neexistuje. A žádné další hledání elementu s id="text" a přiřazení události na něj už nevoláš…

To má po nějaké té době ukončení podpory XP ještě někdo tento systém, že si nemůže nainstalovat novější Explorer?
Proč by mělo ukončení podpory uživatelům nějak zvlášť vadit? Krom toho Explorer 8 byl výchozím prohlížečem ve Windowsu 7 a uživatelé nemusí chtít nebo mít možnost ho aktualizovat…

Třiosmšestku neznám, to jsou Windows?
Uf. To jsem už tak starý :-)
Toto věru starobylé zaklínadlo si můžeš nastudovati na Wikipedii.

Tomu nerozumím...
Když sestavuješ řetězec "switch="+$("#switch1").val()+"&text="+$("#text").val(), co se stane, pokud je v hodnotě $("#text").val() ampersand? Pokud tam napíšu „Randall & Hopkirk“, sestavíš "switch=něco&text=Randall & Hopkirk" a co pak uvidíš v tom tvém ohromně rychlém PHP jako hodnotu parametru text? Tipnul bych si, že jen "Randall ". K tomu, abys mohl správně sestavit parametry v URL formátu, už musíš vstup URL-enkódovat.
Aha, teď koukám, že se mi samo opravdu „enkódovat“ na „nekódovat“, to je dobré :-)

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:

Prosím používejte diakritiku a interpunkci.

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