2013-02-08 58 views
2

我有一個多選框的HTML表單。我無法弄清楚如何通過POST請求將值發送到我的PHP應用程序與AJAX。如果我使用GET請求並使用單個選擇框,但在使用多個選擇框時不起作用,那麼它工作得很好。這個想法是讓用戶保持控制(或者用mac命令)並選擇一個或多個類別。取決於選擇的類別將決定使用AJAX顯示哪些其他表單選項。該選擇框看起來是這樣的:通過POST請求通過AJAX發送HTML表單多個<select>框?

編輯:解決

<select multiple name="categories[]" onclick="sendCategories(this)"> 
<option value="0">Category 1</option> 
<option value="1">Category 2</option> 
<option value="2">Category 3</option> 
</select> 

我的JavaScript函數如下所示:

function sendCategories(sel){ 
    if (window.XMLHttpRequest) 
    { 
     xmlhttp=new XMLHttpRequest(); 
    } 
    else 
    { 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange=function() 
    { 
     if (xmlhttp.readyState==4 && xmlhttp.status==200) 
     { 
      document.getElementById("my_div").innerHTML=xmlhttp.responseText; 
     } 
    } 
    xmlhttp.open("POST","http://www.mysite.com/update_categories.php",true); 
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); 
    var values = $(sel).serialize(); 
    xmlhttp.send(values); 
} 

回答

4

你必須生成查詢字符串中的POST發送你自己的。這裏的HTML標籤的使用方法:

<select multiple name="categories[]" onchange="sendCategories(this);"> 

以及JavaScript函數:

function sendCategories(sel){ 
    var xmlhttp; 
    if (window.XMLHttpRequest) { 
     xmlhttp = new XMLHttpRequest(); 
    } else { 
     xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); 
    } 
    xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
      document.getElementById("my_div").innerHTML = xmlhttp.responseText; 
     } 
    }; 
    xmlhttp.open("POST","http://www.mysite.com/update_categories.php",true); 
    xmlhttp.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); 

    var values = [], i, j, cur; 
    for (i = 0, j = sel.options.length; i < j; i++) { 
     cur = sel.options[i]; 
     if (cur.selected) { 
      values.push(encodeURIComponent(cur.value)); 
     } 
    } 
    if (values.length) { 
     values = encodeURIComponent(sel.name) + "=" + values.join("&" + encodeURIComponent(sel.name) + "="); 
    } else { 
     values = null; 
    } 

    xmlhttp.send(values); 
} 

注意,我改變了事件從onclickonchange,但是這真的取決於你是否要這個功能運行當元素被點擊時,或者它的值被真正改變時...它可以減少一些不必要的調用。

這應該會生成一個查詢字符串,通常用於發送具有選定多個選項的<select>的值。

以下是一個演示如何正在這裏生成的查詢字符串一個的jsfiddle:http://jsfiddle.net/kKWQM/

+0

嗯......絕對會變暖。似乎這會工作,但由於某種原因,當我嘗試檢索服務器端的我的PHP應用程序的發佈請求,我仍然沒有得到任何東西。我試圖檢查這樣的值:print_r($ _ POST ['values']) – DJSK

+1

@ kyzer1978太棒了,很高興你越來越近!所以,我不確定你爲什麼使用'$ _POST ['values']' - 如果你看jsFiddle中的'alert',你會注意到querystring類似於:'categories [] = asdf&categories [] = FDSA&類別[] = aaa'。所以當訪問'$ _POST'時,應該使用的「鍵」是「categories []」。這意味着,你應該嘗試'$ _POST ['categories []']'。那有意義嗎?試試看,讓我知道會發生什麼。如果這不起作用,請嘗試'$ _POST ['categories']'。 'values'只是Javascript變量的名稱,與發送到服務器的內容沒有任何關係 – Ian

+1

@ kyzer1978它與「發送給服務器的內容無關」的原因是因爲我模擬了當多重'通常會提交'」,需要有一種方法來區分所選的所有值。因此,通常情況下,對於非多個「