2016-03-27 7 views
0

DOM要素(テーブルの行)に情報を保存します。私はjQueryのdata()関数を使ってそれを行うことができると思います。私はいくつかのテストコードを書いて、jQueryセレクタを使って要素から格納されたデータを取得できないことを知りました。出来ますか?多分私は何か間違っているのですか?私は次の出力を期待jQuery data():jQueryセレクタを使用して保存されたデータを取得できません

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>JQuery data() test</title> 
    <script src="https://code.jquery.com/jquery-latest.js" type="text/javascript"></script> 
</head> 
<body> 

<table id="myTable"> 
    <tbody> 
    <tr id="rowPrototype" style="display:none;"> 
     <td class="td1"></td> 
     <td class="td2"></td> 
    </tr> 
    </tbody> 
</table> 
<script> 
    var table = $("#myTable"); 
    for (var i = 0; i < 5; i++) { 
     var newRow = $("#rowPrototype").clone(); 
     newRow.removeAttr("style"); 
     newRow.removeAttr("id"); 

     $.data(newRow, "number", i); 
     console.log("Data added to row: " + $.data(newRow, "number")); 

     var tds = newRow.find("td"); 
     tds.text("test"); 
     table.append(newRow); 
    } 

    var trs = table.find("tr"); 
    trs.each(function() { 
     var tr = $(this).text(); 
     var data = $.data(tr, "number"); 
     console.log("number: " + data); 
    }); 
</script> 

</body> 
</html> 

:ここ

は簡単なコードである

number: undefined (row prototype) 
number: 0 
number: 1 
number: 2 
number: 3 
number: 4 

しかし、実際にある:

number: undefined 
number: undefined 
number: undefined 
number: undefined 
number: undefined 
number: undefined 

それでは、このコードが悪いですの?

UPD あなたはここでそれをテストすることができます。https://jsfiddle.net/rfrz332o/3/

+0

P.S. jquery-latestリンクの使用は悪い習慣であることは知っています。それは単なる例です。 – coolguy

+0

作業中のjsFiddleを提供することをお勧めします – Itay

+0

@Itay ok、私はリンクを追加しました – coolguy

答えて

2

$.data()は、実際のDOM要素が最初の引数であり、jQueryオブジェクトではありません。 jQueryオブジェクトを使用して$(selector).data()にすることができます。私はあなたがこれを変更することをお勧めしたい:

newRow.data("number", i); 
console.log("Data added to row: " + newRow.data("number")); 

そして、この変更:これに

var trs = table.find("tr"); 
trs.each(function() { 
    var tr = $(this).text(); 
    var data = $.data(tr, "number"); 
    console.log("number: " + data); 
}); 

を:これに

$.data(newRow, "number", i); 
console.log("Data added to row: " + $.data(newRow, "number")); 

table.find("tr").each(function() { 
    console.log("number: " + $(this).data("number")); 
}); 
+0

最初のものについて(これを保存した後のデータのロギング):この変更を行わなくてもうまくいきましたが、あなたの方が良いと思います。そして約2分の1、今それは正常に動作します、ありがとう! – coolguy

+0

修正:要素にデータを格納する私のやり方が正しくなかったことを知ったので、これらの変更は両方とも必要です – coolguy

1

$.data()DOM要素ではなく、jQueryオブジェクトを期待しています。 [i]を追加するか、$.data(newRow[i], "number", i);.get(i)を使用し、$.data()を使用してDOM要素を参照するすべてのjsを使用してください。

forループにも問題があります。実際セレクタiが含まれている場合iは、2に達する唯一tr要素と#myTable内の二つtdの要素がある場合td要素の最大屈折率は依然としてtableクローニング内1であるように、結果は、undefinedあろう。 $.data()または.data()が使用されます。同様に、内の要素tr; i

1に達したときに

jQuery.data(element, key, value)

要素

タイプ:要素

データに関連付けるDOM要素。

+0

@coolguy実際には '#myTable'内に2つの' td'要素しかありませんか? – guest271314

1

をあなたが台無しdataメソッドを使用します。動的に作成された行にデータを適用していませんでした。結果を確認するには、コンソールを確認してください。

<!DOCTYPE html> 
 
<html lang="en"> 
 
<head> 
 
    <meta charset="UTF-8"> 
 
    <title>JQuery data() test</title> 
 
    <script src="https://code.jquery.com/jquery-latest.js" type="text/javascript"></script> 
 
</head> 
 
<body> 
 

 
<table id="myTable"> 
 
    <tbody> 
 
    <tr id="rowPrototype" style="display:none;"> 
 
     <td class="td1"></td> 
 
     <td class="td2"></td> 
 
    </tr> 
 
    </tbody> 
 
</table> 
 
<script> 
 
    var table = $("#myTable"); 
 
    for (var i = 0; i < 5; i++) { 
 
     var newRow = $("#rowPrototype").clone(); 
 
     newRow.removeAttr("style"); 
 
     newRow.removeAttr("id"); 
 

 
     newRow.data("number", i); 
 
     console.log("Data added to row: " + newRow.data("number")); 
 

 
     var tds = newRow.find("td"); 
 
     tds.text("test"); 
 
     table.append(newRow); 
 
    } 
 

 
    var trs = table.find("tr"); 
 
    trs.each(function() { 
 
     var tr = $(this).text(); 
 
     var data = $(this).data("number") 
 
     console.log("number: " + data); 
 
    }); 
 
</script> 
 

 
</body> 
 
</html>

関連する問題