Autor Zpráva
Igor
Profil *
Poprvé zkouším pracovat s AJAXem pomocí JQuery a narážím na tento problém:

Při kliknutí na span se odešlou data z předchozího formulářového prvku
<textarea>nějaké data s diakritikou</textarea><span onclick='$.post("index.php?action=ax&save=1", { tabName: "pokus", id: "1", col:"id", val:$(this).prev().val() } );'>Uložit</span>


Problém je v tom, že když server obdrží data tak text není v původním znění, ale jsou v něm nahrazené některé znaky, jako <> a písmeno í:

&iacute;.&lt;br&gt;

Jak uvést text do původního stavu (převést to zpět) pokud to jde?
Igor
Profil *
Po menší úpravě metody post:

$.post("index.php?action=ax&save=1", 
{ tname: "basic", rid: "3", col:"id", val:$(this).prev().val() },
function(data) {},
"html");


Specifikoval jsem datový typ, jenže žádná změna.

Vrácený řetězec např.:

Jedn&aacute; se tvrd&yacute; vzor, skloňujeme podle něj tedy tvrd&aacute; př&iacute;davn&aacute; jm&eacute;na. Ta pozn&aacute;me podle tvrd&eacute;ho zakončen&iacute; v 1. p&aacute;du jednotn&eacute;ho č&iacute;sla mužsk&eacute;ho rodu na -h&yacute; (drah&yacute;), -ch&yacute; (plach&yacute;), -k&yacute; (měkk&yacute;), -r&yacute; (star&yacute;), -d&yacute; (hrd&yacute;), -t&yacute; (mrzut&yacute;), -n&yacute; (pr&aacute;zdn&yacute;)

Co dělám špatně?
pcmanik
Profil
Igor:
Pozri si dokumentaciu a nezapisuj inline js, pouzi selektory.
Igor
Profil *
pcmanik:
Na dokumentaci se dívám už dost dlouho (.post, .get, Specifying the Data Type for AJAX Requests, ) a zas až tak jasná mi nepřijde. Možná je to tím, že mi uniká něco co tam není. Třeba těch příkladů se mi tam zdá málo, takže mi stále něco uniká.

Co myslíš tím "nezapisuj inline js"?
pcmanik
Profil
Igor:
jQuery je stavane na css selectoroch resp. tomu spanu pridaj nejake id povedzme ulozit cize <span id="ulozit">Uložit</span>
Kvoli lepsiemu vykonu mozes dat aj textaree id-cko povedzme id="text"
A jQuery zapises ako

$('#ulozit').click(function(){
	$.post("index.php?action=ax&save=1&","text="+$('#text').val());
});


V indexe budes mat $_POST['text']
Chamurappi
Profil
Reaguji na pcmanika:
jQuery je stavane na css selectoroch
Které jsou pomalejší než přímý zápis. Nepotřebuje je, podle popisu nemá žádný důvod je použít.

resp. tomu spanu pridaj nejake id
Proč je id lepší než onclick? Anonymní handler na pojmenovaném elementu je lepší než anonymní handler na anonymním elementu?

Kvoli lepsiemu vykonu mozes dat aj textaree id-cko
Jak to zlepší výkon? Nalezení předchozího potomka je pomalejší než nalezení elementu podle ID? Proč by mělo být?
Moderátor Chamurappi: Otázka se dále řeší odděleně v Je hledání sourozence v DOMu rychlejší než hledání podle ID?

"text="+$('#text').val()
Z jakého důvodu jsi nahradil jeho strukturovaný zápis parametrů za spojení řetězce s neošetřeným uživatelským vstupem? Vždyť by mu přestalo fungovat posílání textů s ampersandem, ne?


Reaguji na Igora:
když server obdrží data tak text není v původním znění
To mi připadá nepravděpodobné. Máš někde ukázku?
pcmanik
Profil
Chamurappi:
Které jsou pomalejší než přímý zápis. Nepotřebuje je, podle popisu nemá žádný důvod je použít.
Na id, tag a class sa pouzivaju nativne metody, len v pripade ze sa nedaju nastupuju neefektivne metody. Taktiez sa pouziva QuerySelector

Proč je id lepší než onclick? Anonymní handler na pojmenovaném elementu je lepší než anonymní handler na anonymním elementu?
Je dobre oddelovat javascript od zbytku html, a drzat si ho samostatne, pridava to na prehladnosti a ulahcuje buduce zmeny, preto.

Z jakého důvodu jsi nahradil jeho strukturovaný zápis parametrů za spojení řetězce s neošetřeným uživatelským vstupem? Vždyť by mu přestalo fungovat posílání textů s ampersandem, ne?
Moja chyba, to som si neuvedomil.
Igor
Profil *
Chamurappi:
Díky za zapojení.

Tak text před odesláním:

Na topole nad jezerem seděl vodník pod večerem: Sviť, měsíčku, sviť, ať mi šije niť. Šiju, šiju si botičky do sucha i do vodičky: sviť, měsíčku, sviť, ať mi šije niť.

Text po odeslání:

Na topole nad jezerem seděl vodn&iacute;k pod večerem: Sviť, měs&iacute;čku, sviť, ať mi &scaron;ije niť. &Scaron;iju, &scaron;iju si botičky do sucha i do vodičky: sviť, měs&iacute;čku, sviť, ať mi &scaron;ije niť.

Nevím jakou funkcí to převést zpátky a tak zkouším toto:
$trArr = array (
       '&aacute;'=>'á',
       '&iacute;'=>'í',
       '&eacute;'=>'é',
       '&oacute;'=>'ó',
       '&uacute;'=>'ú',
       '&scaron;'=>'š',       
       '&zcaron;'=>'ž',
       '&yacute;'=>'ý',
       '&Uacute;'=>'Ú',
       '&deg;'=>'°',
       '&lt;'=>'<',
       '&gt;'=>'>'
);

$posted['val'] = strtr($posted['val'], $trArr); 


Což ale nepokrývá celý rozsah utf-8
RockFire
Profil
Pošli nám živou ukázku, čili to někam nahraj a pošli odkaz, takhle ti asi neporadíme, když už i Chamurappi neví :)
Chamurappi
Profil
Reaguji na pcmanika:
Na id, tag a class sa pouzivaju nativne metody
Které jsou ale pořád pomalejší než hrábnutí na this.

Je dobre oddelovat javascript od zbytku html
Zpravidla ano, ale u takovýchto jednorázovek to nemá cenu. Nevidím to tak černobíle.
Ídéčka i třídy působí v rámci dokumentu podobně jako v libovolném objektově orientovaném jazyce proměnná v globálním kontextu — musím si dávat pozor, co a jak nazývám, abych si později nevyrobil konflikt. Můžu mít jen jedno id="ulozit" a i kdybych místo id použil class, musel bych si pamatovat, že se jí mám vyhýbat, protože tahle class už má globálně daný účel (v rámci všech stránek, kde je přilinkovaný skript). To je v důsledku docela velká daň za to, že bude HTML kód hezky vypadat. Zatím jsem viděl jen málo projektů, které měly v ídéčkách či třídách jasný systém (např. podobný stromové hierarchii) — většinou je to jeden velký guláš. Idea, že by JavaScript měl být nevtíravý (unobtrusive), je sice pěkná, ale měla by být prostředkem k omezení rizika konfliktu, nikoliv potenciálním původcem.


Reaguji na Igora:
seděl vodn&iacute;k pod večerem: Sviť, měs&iacute;čku
Věřil bych, že takhle může z pohledu serveru vypadat text po obyčejném odeslání formuláře na stránce deklarující nečeské kódování v Internet Exploreru (ostatní prohlížeče by použily číselné entity). Že by tohle napáchala funkce $.post, mi ovšem připadá hodně nepravděpodobné. Prosím o odkaz na živou ukázku.
Igor
Profil *
Chamurappi:
Tak to vzdávám. Nemám to kam nahrát. Každopádně na stránce je kódování UTF-8
<meta http-equiv="content-type" content="text/html; charset="UTF-8">

a prohlížeč je FF 3.6.20

Jestli se má před odesláním dat přes post ještě přidat nějaká další hlavička to netuším.
RockFire
Profil
Povídání o živých ukázkách » „Nevím, kam to nahrát.
Igor
Profil *
Mohl bych položit ještě jednu otázku k odesílání dat pomocí Jquery .post(), .get()?

Vezmu příklad z manuálu:

$.get("test.php",
   function(data){
     $('body').append("Name: " + data.name); // John
              .append("Time: " + data.time); //  2pm
   }, "json");


Na tomto příkladu jsou použity selektory (pokud to říkám správně). Já bych však chtěl použít this, odkazující na rodiče, tedy na odkaz na který jsem kliknul. Zkoušel jsem takový pokus, který nefunguje, něco jako toto:

$.post("ax.php",  
   function(result){
     if (result=="Data succesfuly updated.") $(this).next().val("Sloupec 'popis' uložen.");   }, "json");


(ax.php teď obsluhuje požadavky AJAXu - ukládá požadovaný sloupec)
Igor
Profil *
Existuje nějaký způsob ja do té anonymní funkce dostat proměnnou z venčí?

onclick="that=this;
$.post("test.php",
function(data, that){
console.log(that) }, "json");
"

Toto nefunguje
Witiko
Profil
Igor:
Tápeš v základech, na posluchače se mimo zápisu přímo v html nenavěšuje řetězec, ale funkce. Více zde.

Tento zápis přiřazení funkce k události onclick v HTML:
<a id="odkaz" onclick="alert('Neklikej na mě!');">Kliknout</a>

Je prakticky ekvivalentem k zápisu v javascriptu:
document.getElementById("odkaz").onclick = function(event) {
  alert('Neklikej na mě!');
};

Tvůj pomýlený zápis by tedy vypadal v javascriptu nějak následovně:
nějakýElement.onclick = function() {
  var that = this; // Nezapomínejme na deklarace proměnných
  $.post("test.php", function(data/*, that*/) { // Toto tu nemá co dělat
    // Tato lokální proměnná (argument) that by přepsata výše definovanou proměnnou that
    // textovým statusem ajax požadavku, jelikož zpětné volání je ve formátu
    // success(data, textStatus, jqXHR) viz. http://api.jquery.com/jQuery.post/
    console.log(that);
  }, "json");
}
Igor
Profil *
Vznikl mi nový problém při převodu objektu z Javascriptu a zpět na straně php.
Mám jednoduchý příklad zde: Example #1 json_decode() examples a ten mi funguje. Když ale použiju to svoje řešní tak to nefunguje. Takže popíšu problém.
Na straně klienta mám takový objekt:
{"cols_arr" : "help13",
"cols_object":
   {	
   "col" : "b.`help13`" ,  "val": ""
   }
}

(snad jsem to opsal správně)

Na straně klienta ho získávám přes getColumns() a převádím:
JSON.stringify(getColumns("$columns"))

Celé to odesílám AJAXEM jako součást .post(url, {val:{vraceny objekt } })

Na straně serrveru (php)
obdržím string $_POST["val"]:
 {\"cols_arr\":\"help13\",\"cols_object\":{\"col\":\"b.`help13`\",\"val\":\"\"}} 


a zkouším ho převést z JSONu:
$json = $_POST["val"]; //'{"a":1,"b":2,"c":3,"d":4,"e":5}';
var_dump(json_decode($json));
var_dump(json_decode($json, true));
die();


Výsledkem je
NULL
NULL

Tak toto vůbec nechápu, prosím poraďte...

Witiko:
Dneska jsem to tuž vyřešil trochu jinak, viz moje nové vlákno o Uzávěře (nevím, možná je to zbytečně složitě, ale jede to). Teď ale nevím na co si narážel když si řekl "na posluchače se mimo zápisu přímo v html nenavěšuje řetězec,". Protože nevím o jakém řetězci to mluvíš.
Witiko
Profil
Igor:
Protože nevím o jakém řetězci to mluvíš.
Mluvím o řetězci ve tvém příspěvku [#14]:
onclick="that=this; 
$.post("test.php", 
function(data, that){ 
console.log(that) }, "json"); 
"
Chamurappi
Profil
Reaguji na Witika:
To je nejspíš HTML atribut (s nedořešenými uvozovkami), nikoliv JS příkaz.
Igor
Profil
Witiko:
Už nevím jestli jsem ten kód jen částečně zkopíroval nebo blbě opsal. Ale teď to je jedno, už jsem to stejně přepsal. Uvozovky by teď měly být OK, jinak by to asi nejelo. Já vím, že se to "přiřazení funkce k události onclick v HTML" dělá dvěma způsoby. Ale protože vypisuji formulářové prvky hromadně pomocí php, tak mi to přijde jednodušší přidat to rovnou do html atributu.

Jinak k původnímu problému, co se týkalo toho kódování. Chyba byla opravdu v nesprávné deklaraci hlavičky a sice v jedné uvozovce navíc, což způsobovalo, že FF detekoval kódování automaticky, ostatní prohlížeče ne. Jinak ale přetrvává problém s kódováním někde mezi uložištěm a php, a sice znaky ěčř.
Igor
Profil
Haleluja, problem vyřešen.

$r = mysql_query("ALTER DATABASE `pozice` DEFAULT CHARACTER SET utf8 COLLATE utf8_czech_ci;");
// ale tento příkaz by změnil to co nastavilo COLLATE ...
//  $r = mysql_query("SET CHARACTER SET utf8"); // musí se nastavit až po výběru databáze


Takže vlastně, jak je tabulka jednou nastavená, tak už CHARACTER SET nenastavuji, to by rozkopalo to kódování tabulky, které již bylo správně nastaveno.
Witiko
Profil
Nemělo by tohle vlákno být vlákna 3, každé z nich pak v rozdílné sekci? Můžu se totiž mýlit, ale z mého pohledu je to nějak takto:

1) [#1] až [#15] je řešení toho, proč v nepozměněných datech odeslaných jQuery je diakritika nahrazena html entitami.
2) [#16] je slovy autora zcela rozdílný problém a sice parsování JSON objektu na straně PHP.
3) A v [#20] nás autor informuje o tom, že zjistil jak nastavit komunikaci MySQL a svého php scriptu tak, aby došlo k zachování správného kódování, aniž by jakkoliv objasnil jakou to má spojitost se zbytkem jeho dotazů.

Takže zdá se mi to, nebo se Igor do tohoto svého tématu svěřuje s čímkoliv má momentálně problém, nebo se případně jedná o problémy spojené s jedním a tím samým projektem a on je příliš líný je dělit do samostatných vláken, aby ještě někdy někomu mohly být k užitku?

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:

0