jQuery $(’:input’)。serializeArray(); 使用Native API的function

我怎样才能使用JavaScript编写这个jQuery函数(或者更确切地说,产生相同的结果)?

$(':input').serializeArray(); 

function文档 。

看看jQuery的实现 :

 function serializeArray() { return this.map(function () { // Can add propHook for "elements" to filter or add form elements var elements = jQuery.prop(this, "elements"); return elements ? jQuery.makeArray(elements) : this; }).filter(function () { var type = this.type; // Use .is(":disabled") so that fieldset[disabled] works return this.name && !jQuery(this).is(":disabled") && rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) && (this.checked || !manipulation_rcheckableType.test(type)); }).map(function (i, elem) { var val = jQuery(this).val(); return val == null ? null : jQuery.isArray(val) ? jQuery.map(val, function (val) { return { name: elem.name, value: val.replace(rCRLF, "\r\n") }; }) : { name: elem.name, value: val.replace(rCRLF, "\r\n") }; }).get(); } 

当然,这假设this是一个jQuery对象,其方法如.filter().map() 。 这些方法也可用于ECMAScript 5中的Arrays,因此如果您不需要支持IE <9,则此代码可能在this是一个HTMLElements数组的情况下工作 – 在删除或重写jQuery处理的极端情况之后。 如果您需要支持旧浏览器,那么您可能应该只使用jQuery。

jQuery :input选择器相当于:

 var elements = document.querySelectorAll('input, button, textarea, select'); 

元素将是匹配元素的静态集合。 可以使用每个不同的标记名称使用getElementsByTagName构建类似的数组。

.serializeArray创建一个ojbects数组,如:

 [{name: value},{name:value},...]; 

要序列化元素 ,请遵循HTML5规范§4.10.22表单提交中的算法。 请注意,jQuery不提交提交按钮(这与W3C规范和浏览器行为相反),您可能希望模仿(或不)。

在SajithNair的评论中有一个很好的联系 ,它并不完美,但是一个非常好的开始(比如98%)。

基本策略是循环成员并处理每种不同的类型,从成功的控件创建对象(即具有名称和值但未被禁用的对象,并检查无线电和复选框输入并选择选项中的选项,记住处理多个选择)其唯一成员是具有元素值的元素名称。

如果存在多个具有相同控件的控件,则会有多个具有相同命名属性但可能具有不同值(或不相同)的对象。

执行此操作的代码并不困难,但编写和测试完全有点冗长乏味。 当你遇到困难时,请去寻求帮助。

这是一个适用于大多数表单的相当简单的方法:

 [].slice.call(document.querySelectorAll('input[name]:not([disabled]), textarea[name]:not([disabled]), select[name]:not([disabled])')).reduce(function(a,b,i){ var val= String({checkbox:1,radio:1}[b.type] ? b.checked : b.value).replace(/\r?\n/g, "\r\n"); a[b.name]= a[b.name] ? a[b.name].concat(val) :val; return a; }, {}); 

它不像真实表单那样处理命名提交或图像类型,但这些输入的适用性实际上只在点击时才知道,因此对手动序列化器没有意义。 您可以使用几个onclicks来模拟图像输入和命名提交的传统function,如果这真的是你的需要,它可能不是……

此版本使用键的平面对象:值对,或键:[value1,value2]数组用于重复。