Posílejte formulář přes AJAX
29.11.2005
V poslední době při programování mého rozsáhlého AJAXového projektu jsem narazil na několik problémů, které jsem musel vyřešit. Jedním z nich bylo i poslání dlouhého formuláře přes AJAX tak, abych se co nejméně nadřel
.
Zjištění hodnot všech elementů input
Relativně velkým problémem se pro mě stalo projít všechny podelemnty input, jež obsahují nějaké jméno, a načíst jejich obsah do nějaké proměnné. Zkuste se proto podívat na krátký javascriptový kód, kterým jsem to vyřešil.
var data = '';
var f_el = document.myform.getElementsByTagName('input');
var f_length = f_el.length;
for(i=0;i<f_length;i++){
data += f_el[i].name + '=' + f_el[i].value + '&';
}
Jak to odeslat přes AJAX?
Dalším drobným problémem bylo, jak tyto data odeslat přes XMLHttpRequest tak, aby to PHP nebo ASP pohodlně zpracovalo. Rozhodl jsem se proto použít jednoduché kódování application/x-www-form-urlencoded, které v PHP načte všechna data do superglobální proměnné $_POST.
function form_save(){
xmlrequest.onreadystatechange = function() {processForm();};
xmlrequest.open("POST", 'save.php', true);
xmlrequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xmlrequest.send(data);
}
Doplňkové informace
Protože tento kód samozřejmě není kompletní, další podrobnosti můžete nalézt na webu AppleDev - The XMLHttpRequest Object. Tento příklad je spíše jakési nakopnutí pro vývojáře AJAXových aplikací, co vědi o co jde a nenapadá je, jak elegantně řešit odeslání formuláře.
mala drobnost od Martin 'Bilbo' Petricek
29.11.2005 #Ma to jeden hacek: Co kdyz v nekterem formularovem poli bude treba ampersand? Vstup je treba osetrit
)
)
Takze nahradime
data += f_el[i].name + '=' + f_el[i].value + '&';
za
data += f_el[i].name + '=' + escape(f_el[i].value) + '&';
Na tohle spousta programatoru casto zapomina a je dobre to cas od casu pripomenout
Drobnosti od Jakub Vrána
29.11.2005 #Pro ošetření dat doporučuji encodeURIComponent().
Pro obsluhu události není nutné vytvářet další funkci:
xmlrequest.onreadystatechange = processForm;
K větší univerzálnosti by se hodilo i poslání <select> a <textarea> a naopak neposílání "reset" a všech "submit".
od Llaik
02.12.2005 #Zdravim Genia, snad tentokrat ten komentar projde
http://php.vrana.cz/zobrazeni-prubehu-uploadu.php
Zadny Perl, haleluja.