2010-09-02 68 views
6

我有一个使用ajax动态创建的表单(因为表单元素的数据必须来自数据库),我想序列化表单的元素以提交阿贾克斯。我目前只是测试使用代码从jQuery网站我的理论只是为了看看,如果我可以拿起表单元素,这就是问题所在:jQuery serializeArray不拾取动态创建的表单元素

$(document).ready(function() { 
    $('#btnCustomSearch').live('click', function() { 
      $('#results').html(''); 
      alert($('#customSearchTable :input').serializeArray()); 
      // get all the inputs into an array. 
      var fields = $('#customSearchTable :input').serializeArray(); 
      jQuery.each(fields, function(i, field) { 
       $("#results").append(field.name + " = " + field.value + ", "); 
      }); 

      // now we'll reformat the data as we need 

      // here we'll send the data via ajax 

    }); 
}); 

我需要做一些改变的数据之前提交和这个代码还没有被写入,但我发现,页面上的任何输入元素在页面加载时都被拾取正确,任何使用Javascript填充的元素都被正确拾取,但是任何使用ajax创建的内容将被忽略。

我知道这通常使用“活”解决,但我不清楚如何解决这与serializeArray()。使用Ajax额外的表单元素被添加到#customSearchTable,这些是没有被拿起。

任何帮助非常感谢。

感谢

+1

这个方法并不在乎什么时候添加元素,看起来他们没有被正确添加为表单元素,你能发布那些代码吗?例如,他们有他们的'name'属性吗? – 2010-09-02 11:45:42

+0

尼克,非常感谢,你是对的,动态生成的表单元素缺少名称属性.... DOH!非常感谢!! – Cydaps 2010-09-02 12:10:33

回答

7

我会在评论多一点这里阐述:

当你调用.serializeArray()它通过循环只是作为一个<form>屈服会或尽可能接近反正去提交的元素。关键部分is here

.filter(function() { 
    return this.name && !this.disabled && 
     (this.checked || rselectTextarea.test(this.nodeName) || 
     rinput.test(this.type)); 
}) 

正如<form>提交将不包括元素没有name attribute,将.filter()呼叫使用this.name将筛选出来的人的那些元素被序列化。

+0

感谢Nick,希望澄清它对于有同样问题的其他人。 – Cydaps 2010-09-03 07:41:50

+0

为'