1

解決済み - さまざまなアプローチ、thx みんな、私は再び学びました

HTML

<div class="container">

  <div class="row">
    <div class="c1">value1</div>
    <div class="c2">value2</div>
    <div class="c3><input type="number" value="3" class="i1" /></div>
  </div>

  <div class="row">
    <div class="c1">value3</div>
    <div class="c2">value4</div>
    <div class="c3><input type="number" value="1" class="i1" /></div>
  </div>

</div>

このコードを使用して値を抽出します (これを少し変更したバージョンはこちら) 。

var fields = [ 'c1', 'c2','i1'];

var data = [];

$('.container .row').each(function(i, tr) {
    var row = {};
    for (var f = 0; f < fields.length; ++f) {
        row[fields[f]] = $(tr).find('.' + fields[f]).text()
    }
    data.push(row);
    console.log(data);
});

これは完全に機能しますが、すべてのデータに対してではありません

c1 = 値1

c2 = 値 2

i1 =


c1 = 値3

c2 = 値4

i1 =

i1は入力であるため、text()必要な機能はありません。 の値を取得して追加するval()方法を知りたいので、最終的な出力は次のようになります。i1row[fields[f]]

(行 1) c1 = 値 1

c2 = 値 2

i1 = 3


(行 2)

c1 = 値3

c2 = 値4

i1 = 1

  1. 使用if/elseしても機能しません。どちらか一方が機能します
  2. 別の .find() を追加すると壊れます
  3. function(){} を使用しても機能しません。
  4. append または appendTo の使用が機能しない
  5. この場合、これは機能しないようです

これを行う方法があるはずです。誰が私を助けることができますか?

4

3 に答える 3

2

要素が型であるかどうかを確認する if 句を追加してみてくださいinput。その場合は で値を取得しval()、そうでない場合は で値を取得しますtext()

for (var f = 0; f < fields.length; ++f) {
    var el = $(tr).find('.' + fields[f]);
    row[fields[f]] = el.is(":input") ? el.val() : el.text();
}
于 2012-06-02T00:02:12.403 に答える
2

最も単純なアプローチは次のとおりです。

var fields = ['c1', 'c2', 'i1'];

var data = [];

$('.container .row').each(function(i, tr) {

    var row = {};
    for (var f = 0; f < fields.length; ++f) {
        row[fields[f]] = $(tr).find('.' + fields[f]).text() || $(tr).find('input.' + fields[f]).val();
    }
    data.push(row);
    console.log(data);
});​

JS フィドルのデモ

この方法では、text()または、テキストがない場合は、代わりval()に特定のクラス名の要素の を割り当てます。

于 2012-06-02T00:05:28.457 に答える
2

これは動作します - http://jsfiddle.net/alnitak/82Tep/のデモ

var fields = {
    c1: 'text',
    c2: 'text',
    i1: 'val'
};

var data = $('.container .row').map(function(row, tr) {
    var obj = {};
    $.each(fields, function(key, func) {
        obj[key] = $('.' + key, tr)[func]();
    })
    return obj;
}).get();

OPが内部次元の配列ではなくオブジェクトを必要としていることに気付いていなかったため、以前のバージョンは正しくありませんでした。

このアプローチには、実際のコードを変更せずに、これらの要素で他のjQuery 関数を呼び出すことができるという利点がありますfields。マップを変更して、呼び出したい関数を指定するだけです。

于 2012-06-02T00:05:56.420 に答える