1. 程式人生 > >jquery動態新增元素無法提交解決方案

jquery動態新增元素無法提交解決方案

昨天寫了一個頁面,裡面涉及到動態的建立和修改表單控制元件(form controls),用到的修改新增元素的方式為jquery方法為append,和replaceWith方法,凡是原有的控制元件後臺都可以獲取到值,凡是動態改變的元素,都無法獲取值,這些控制元件當然都包含了name屬性,但無論如何檢查後臺就是獲取不到值。
提交方法用的jquery的post方法,表單表單元素通過serialize()方法進行序列化

$.post($('#form1').attr("action"), $('#form1').serialize(),
function(data) {
alert(data);
});

將表單的值序列化後提交,alert($('#form1').serialize())後發現,修改的元素並未序列化。以為是serialize()方法中有問題,就讀了其方法原始碼,並未發現明顯問題;其後感覺可能是replaceWith的方法的問題,讀過其原始碼後,亦沒有發現明顯問題。
後來通過firebug去比較原生的表單元素和動態新增的表單元素後,發現了控制元件的jquery物件都有一個屬性form,原生控制元件的form屬性為form1,而動態新增的為null。問題找到了,原來表單form1不能找到我新增的元素,也是就說新新增的元素不在form這顆DOM樹上。自然無法序列化,於是就更換了序列化時的選擇器,沒有通過form1,而是通過頁面這個整體DOM

$.post($('#form1').attr("action"), $(':input').serialize(),
function(data) {
alert(data);
});

來序列化控制元件,驗證後結果正確,貌似問題解決了。
當然依據這種思路還有一種解決辦法,就是給每一個動態就該的元素,新增form屬性,
$(element).attr("form",form's Id)

這樣也可以解決問題。但總感覺不太對,晚上下班回來繼續查,終於找到了端倪。
通過一個朋友的一篇文章[url]http://blog.csdn.net/liu510817387/article/details/7267733[/url]我檢查了下自己的<form>和<table>標籤的位置,發現果然有問題
<table>
<form id="form1"action="<c:url value='/gameentity/edit?'/>mentity_id=<c:out value='${mentity_id}'/>"method="post">
<tr class="title">……
原來是這個問題,修改過之後,完美解決問題。但是對於form和table這兩個標籤的位置為什麼會導致新新增無form屬性這個問題,依舊還不太理解。不過通過firebug可以看到,
<table>
<form id="form1" method="post" action="/city-mis/gameentity/edit"></form>
<tbody>
</table>
即form標籤已經縮為一團啦,也許導致新新增的元素,位於form之外啦。