2011-11-08 10 views
0

フォーム要素を追加してプロパティを変更できる動的フォーム作成者を作成しています。私はXMLやJSONの複雑さなしにクライアント側にこのデータを格納する方法を見つける必要があります。ユーザーはテキストボックスからラジオにテキストエリアまでの50のフォーム要素を追加できます。各要素には異なる数の変更可能な変数があります。私は、各項目と隠しを追加するためにjqueryのを使用しています隠しフォーム要素を使用して配列を使用してJqueryでデータを格納および取得する方法

type:text, size:30, required:yes, top:30, left:30 

type:textarea, cols:30, rows:5, top:50, left:60 

私は現在のように隠されたフィールド値に格納しています。

var typeVariable = 'type:input'; 

var startPosLeft = 'left:' + Math.round($(newElem).offset().left$('.container').offset().left); 

var startPosTop = 'top:' + Math.round($(newElem).offset().top - $('.container').offset().top); 

var newElemValue = typeVariable + ',' + startPosTop + ',' + startPosLeft; 

// creates hidden form elements to store data 
$('<input>').attr({'type': 'text', value:newElemValue, 'name':'hidden' + newNumDivs, id:'hID' + newNumDivs}).appendTo('.hiddenDiv'); 
  1. AJAXのトンを行うことなく、データを格納および取得するための最良の方法は、

  2. 私のような文字列から特定の要素を呼び出すことができますどのように
  3. 呼び出し、このです:

    タイプ:テキスト、サイズ:30、必要な:はい、トップ:30、左:30

私がします'text:'は 'type:text'ではありません。

この文字列の特定の要素を更新するにはどうすればよいですか?もしサイズ:サイズ30の変更:50私は隠しフィールドに格納され、このデータを変更し、

type:text, size:50, required:yes, top:30, left:30 
+0

jSONは、これらの値をクライアント側に保存する最も良い方法です。また、データベースに永続化するためにサーバーに簡単に送信できるという利点もあります。なぜなら、表記法はあなたが現在使用しているものとあまり変わらないので、あなたがjSONの使用に非常に不利な理由がありますか? – rkw

+0

私はjSONに精通しておらず、できるだけシンプルに保つために努力していたからです。私は--String(typeVariable [1])のようなものを試していました。split( ':')[1]; – user1009749

+0

JSONを使用して情報を保存しないでください。私の答えに応じてJavaScriptオブジェクト/配列を使用してください。その後、サーバーに送信したいときは(JSONとしてオブジェクトをシリアライズし、従来のフォームまたはAjax経由で送信できます)。上記で使用しようとしている個々の入力と文字列がすべて「できるだけシンプル」になる方法はありません。私の答えはすべて基本的なJavaScriptです。初心者としてはまだ理解できないかもしれませんが、あなたはそれを学ぶ必要があります。 – nnnnnn

答えて

1

あなたはJavaScriptの配列、配列の各要素に、その情報の全てを格納する必要がありますに挿入しない方法ユーザーが作成しているフォーム要素の1つを表す適切なプロパティを持つオブジェクトです。既存のアイテムの要素を簡単に追加したり、プロパティを更新したりすることができます。ユーザーは、あなたがJSONに配列をシリアライズし、従来のフォームフィールドやAjaxを経由して提出することができ提出する準備ができている

// create empty array 
var formElements = []; 

// add a new element to the array 
formElements.push({ 
    type : "text", 
    size : 50, 
    required : "yes", 
    top : 30, 
    left : 30 
}); 

// individual items in the array can have different properties, 
// e.g., where the one above had "size" this one has "cols": 
formElements.push({ 
    type : "textarea", 
    cols : 30, 
    rows : 5, 
    top : 50, 
    left : 60  
}); 

// later access the rows property of the 2rd element: 
var rows2nd = formElements[1].rows; 

// later change the size property of the 1st element: 
formElements[0].size = 50; 

// loop through the array and log the type of each element: 
for (var i=0; i < formElements.length; i++) { 
    console.log(formElements[i].type); 
} 

更新日最新のコメントで尋ねられます。 (入れ子の中括弧に注意してください)

var formElements = {}; 

formElements["textTemplate"] = { 
    type : "text", 
    size : 50, 
    required : "yes", 
    top : 30, 
    left : 30 
} 
formElements["textareaTemplate"] = { 
    type : "textarea", 
    cols : 30, 
    rows : 5, 
    top : 50, 
    left : 60 
}; 

それとも、1つのステートメントですべてを定義することができます:

var formElements = { 
     "textTemplate" : { 
           type : "text", 
           size : 50, 
           required : "yes", 
           top : 30, 
           left : 30 
          },  
     "textareaTemplate" : { 
           type : "textarea", 
           cols : 30, 
           rows : 5, 
           top : 50, 
           left : 60 
          } 
}; 

その後にあなたは、配列の代わりにオブジェクトを使用する「配列要素に名前を付ける」ために、 「textareaTemplate」のために、たとえば、「トップ」プロパティを取得あなたが言う:オブジェクト内のすべてのアイテムをループ

formElements["textareaTemplate"]["top"];` 
// or in dot notation 
formElements.textareaTemplate.top; 

は言う:

var currentItem; 
for (var key in formElements) { 
    currentItem = formElements[key]; 
    alert(currentItem["top"]); 
} 

詳細はhttps://developer.mozilla.org/en/JavaScript/Guide/Working_with_Objectsを参照してください。

+0

ありがとうございます。私が持っている唯一の質問は、formsElements.pushは0 +から新しい配列要素を作成し続けますか?だから、私は20のテキストフィールドと20のリストメニューがある場合は、1つの項目が追加されるたびにformElements [0] - [1] - [2]などが作成されますか? – user1009749

+0

追加の配列レベルが可能ですか?例:[cols:30: 'Columns'、 、 – user1009749

+0

はい、 '.push()'は配列の最後に項目を追加するだけです(配列が空の場合は要素0から始まります)。あなたの2番目のコメントの例では、あなたがしようとしていることはよく分かりませんが、配列内に配列を入れ子にしたり、別のオブジェクトや配列のプロパティを持つオブジェクトを配置したりできます。あなたは好きです。数値インデックスを使用して項目にアクセスする配列と、キー/値のペアとなるオブジェクトの違いを理解する必要があります。 https://developer.mozilla.org/ja/JavaScript/Guide/Working_with_Objects – nnnnnn

関連する問題