2011-03-04 67 views
4

我一直在使用一個簡單的每一個功能的反序列化形式的所有輸入:jQuery的形式反序列化的

data = { key : val, ... }; 
    form = $('#formId'); 
    $.each(data, function(val,i) { 
    form.find('*[name="' + val + '"]').val(data[val]); 
    }); 

,但我似乎無法得到它的非標準表單元素的工作(即廣播按鈕/複選框)。我一直在玩不同的例子幾個小時,並且無法使用它。任何人都知道這個優雅的解決方案?

+1

。您調查數據鏈插件(http://api.jquery.com/鏈接/)? – 2011-03-04 17:34:40

+0

尋找非插件解決方案,但感謝您的建議 – wajiw 2011-03-04 17:36:52

回答

3

試試這個:

example

HTML:

<form id="formId"> 
    a: <input name="a" /><br /> 
    b: <input name="b" /><br /> 
    c: <input type="checkbox" name="c" /><br /> 
    d: <select name="d"><option value="d1">d1</option><option value="d2">d2</option></select><br /> 
    e: <input type="radio" value="1" name="e" /><br /> 
    e: <input type="radio" value="2" name="e" /><br /> 
    e: <input type="radio" value="3" name="e" /><br /> 
    f: <input type="checkbox" name="f" /><br /> 
</form> 

JS:

var 
    data = { a: "value for a", b: "value for b", c: false, d:"d2", e: "2", f:true }, 
    form = $('#formId'); 

    $.each(data, function(i, el) { 

     var 
      fel = form.find('*[name="' + i + '"]'), 
      type = "", tag = ""; 

     if (fel.length > 0) { 

      tag = fel[0].tagName.toLowerCase(); 

      if (tag == "select" || tag == "textarea") { //... 
       $(fel).val(el); 
      } 
      else if (tag == "input") { 
       type = $(fel[0]).attr("type"); 
       if (type == "text" || type == "password" || type == "hidden") { 
        fel.val(el); 
       } 
       else if (type == "checkbox") { 
        if (el) 
        fel.attr("checked", "checked"); 
       } 
       else if (type == "radio") { 
        fel.filter('[value="'+el+'"]').attr("checked", "checked"); 
       } 
      } 
     } 
    }) 
+0

此代碼不會循環通過同名多個元素,但它足夠接近。謝謝! – wajiw 2011-03-06 18:25:26

1

也許像this這樣的插件可以提供幫助。

$('#form-id').deserialize([{'name':'firstname','value':'John'},{'name':'lastname','value':'Resig'}]); 

看起來好像它在幾年內還沒有更新。

+0

真的在尋找非插件解決方案,但我會檢查出來。謝謝! – wajiw 2011-03-04 17:36:15