Jquery-多个选择器-按顺序获取元素

Jquery-多个选择器-按顺序获取元素,jquery,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

我有一张这样的表格

<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>
我得到的结果是:a1,b2,d4,c3 但我想得到的是:a1、b2、c3、d4(与UI中显示的顺序相同)

注意:我可以为所有输入和选择元素提供一些虚拟类(比如:mydatafields),并使用:

$('mydatafields').forEach()
类似于,但我正在检查是否有更好的解决方案


提前感谢。

尝试:输入选择器。应该把它们都看作是输入

最有效的方法是在元素中添加一个临时属性(例如类名),然后循环遍历每个元素,最后删除它。
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)

您不需要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]);
        }
    }
}

在Chrome&IE 9-中,似乎按照您的预期工作。您使用的浏览器是什么(不确定它是否有区别)?另外,您使用的是什么版本的jQuery@JamesHill的fiddle显示了与jQuery1.2.6相同的错误,但适用于更高版本。
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]);
        }
    }
}
var elements = element.childNodes || element[0].childNodes;