2011-11-05 53 views
1

我有這樣jQuery的 - 多重選擇 - 獲得序列元素

<form id="myform"> 
<input type="hidden" name="a" value="a1"/> 
<input type="hidden" name="b" value="b2"/> 
<select name="c"><option value="c3" selected="true"/></select> 
<input type="text" name="d" value="d4"/> 
</form> 

形式現在,我想所有的輸入列表和形式

var mydata = new Array(); 
    $('#myform').find('input, select').each(function() 
    { 
    mydata.push($(this).val()); 
    }); 

結果我選擇元素我得到的是:a1,b2,d4,c3 但我想得到的是:a1,b2,c3,d4(與UI中顯示的順序相同)。

注:我可以給一些虛擬類(比如:mydatafields)所有的輸入和選擇要素及用途:

$('mydatafields').forEach() 

有點像,但我檢查是否有更好的解決方案。

在此先感謝。

+3

似乎工作您在Chrome和IE 9打算的方式 - HTTP ://jsfiddle.net/P5pAY/1/。你使用什麼瀏覽器(不知道它有什麼不同)? –

+0

另外,你使用的是什麼版本的jQuery? @ JamesHill的小提琴顯示了您對jQuery 1.2.6的相同錯誤,但適用於更高版本。 – nrabinowitz

回答

3

最有效的方法是在元素中添加臨時屬性(例如類名稱),然後循環遍歷每個元素,最後刪除它。

var mydata = []; 
$('#myform').find('input, select').addClass('temporaryClassName'); 
$('.temporaryClassName').each(function() { 
    mydata.push($(this).val()); 
}).removeClass('temporaryClassName'); 

的另一種方法包括選擇使用以往:input輸入元件,並篩選所需的元素。對於這個例子,過濾並不是嚴格需要的。爲了教育目的,我列入了該行。

var mydata = []; 
$('#myform').find('input, select').each(function() { 
    if(!/^input|select$/i.test(this.nodeName)) return; //Filter non-input/select 
    mydata.push($(this).val()); 
}); 
alert(mydata) 
0

嘗試:輸入選擇器。它應該將它們全部視爲輸入

0

你不需要這個jquery ....這是一個非jQuery的方法來解決這個問題。

var arr = []; 
window.onload = function() { 
    getChildElements(document.getElementById("myform"), arr); 
    console.log(arr); 
}; 

function getChildElements(element, arr) { 
    var elements = element.childNodes; 
    for (var i = 0, l = elements.length; i < l; i++) { 
     if (elements[i].type == "select-one") { 
      getChildElements(elements[i], arr); 
     } else if (elements[i].nodeType == 1) { 
      arr.push(elements[i]); 
     } 
    } 
} 

但是如果你希望它使用jQuery工作只是改變元素與定義...

var elements = element.childNodes || element[0].childNodes;