AJAXリクエストからのJSON応答を解析するポップアップでjQueryコードを実行しています。その一環として、<tr>
要素の一連の要素と、親ウィンドウ内のテーブルを更新するために、.data()
関数を使用してデータ属性が割り当てられたアンカー要素を含む内容を動的に作成します。新しく作成した要素を親ウィンドウに追加するときの.data()値の保存
このコードは期待どおり動作します。行は正しい内容で作成され、メインウィンドウの表に追加されます。 1つの小さな問題があります。アンカー要素に添付されたデータは消えます。
JSONレスポンスは、この(関連部分はlocationList
配列である)のようになります。
{
"locationList": [{
"name": "All locations",
"locid": "-1",
"countryid": "-1",
"imtid": "-1"
}],
"countries": [
{
"value": "-1",
"text": "All"
},
{
"value": "258",
"text": "Ireland"
},
{
"value": "246",
"text": "Sub SA"
},
{
"value": "261",
"text": "United Kingdom"
}
],
"locations": [{
"value": "-1",
"text": "All"
}]
}
とJavaScriptは次のようになります。
var $locations = opener.$('#document-content-locations');
$locations.empty();
for(var i = 0; i < data.locationList.length; i++) {
var location = data.locationList[i];
var rowClass = (i % 2 == 0) ? "odd" : "even";
var row = $('<tr/>').addClass(rowClass);
row.append($('<td/>').text(location.name));
var link = $('<a/>').attr('href', '#').data({locid: location.locid, countryid: location.countryid, imtid: location.imtid}).text('remove').addClass('removelocation');
console.log(link.data());
row.append($('<td/>').append(link));
console.log(row.find('a').data());
$locations.append(row);
console.log($locations.find('a').data());
}
console.log
呼び出しが監視することです要素data
をさまざまな段階で使用します。コンソール出力:
Object { locid="-1", countryid="-1", imtid="-1"}
Object { locid="-1", countryid="-1", imtid="-1"}
Object {}
私は、何が起こっているは、要素(マイナスデータとイベント情報)をクローニング、むしろ単純にメインウィンドウのテーブルに要素を追加するよりも、.append()
への呼び出しがあることだと思うとメインウィンドウのテーブルに追加します。明示的に要素を複製しようとしましたが(データとイベントを保存するためにtrueを渡して)、その要素を追加しましたが、問題は解決しません。
.data()
関数を使用するのではなく、HTML5 data-*
の属性をHTMLのアンカーに使用して問題を解決できます。それは今のところうまくいきます。少数しかないので、簡単にスケーラブルではありません。
だから、私はいくつかの質問を持っている:
- が私の考え/仮定が正しい可能性が高いですか?
.append()
を新しく作成した要素をポップアップから呼び出すと、要素を複製する可能性のある親ウィンドウの 要素に追加する必要があります(これは理由がないようですが)。 -
.append()
(と同様の機能)に、実行の一部として作成するクローンのデータとイベントを保存するように指示します(私は考えません)これはデフォルトで行います)? - 問題を引き起こしている上記のコードに何か本質的に間違っているのですか?
私は、複数の要素を含むjQueryオブジェクトで '.append()'を呼び出すときにクローンを作成することができますが、私の場合は、セレクタ)を使用し、要素を移動するだけです。 –
ああ、私は十分にあなたの質問を読んでいなかったと思います。おそらく.append()はブラウザウィンドウ間でのみクローンを作成します。妥協として、** link.attr( 'data-json'、JSON.stringify(data))**のデータオブジェクトをシリアル化し、後で消費するときに逆シリアル化することができます** JSON.parse (link.attr( 'data-json'))** –