data-*
リンクに属性を添付し、イベントをリンクにバインドし、data-*
値をサードパーティの JS 分析 API に送信する小さな JS メソッドを構築しています。
<a href="#" class="js-analytics-proxy" data-trackme='{"obj": this, "rmethod": "track", "partial-path": "/foo/bar" }'
そしてJSファイルで
$('js-analytics-proxy').live('click', function() {
3rdParty.webTrack('site1', 'foo', $(this).data('trackme'));
});
問題は:
- デフォルトで
$(this).data('trackme')
は、String
- JSON文字列表記の有効なキー/値のペアではない
$.parseJSON(..)
ため、失敗します。"obj": this
- なんといっても
data-*
attr を「考え」て渡すと、JS の obj 名の文字列表現だけが渡されます。
私はそれdata-*
が「データ」のためのものであり、議論の余地があるthis
のはデータではなくコードであることを理解しています。また、obj: this key/val ペアを JS クラスに「ハードコーディング」することは避けたいと思います (基本的には data-* attr から取り出し、可能であれば JS メソッドの引数に追加します。
更新 1: 3rdParty JS ライブラリが期待しているため、これを使用しています。現在の実装には
onclick='3rdParty.webTrack("site1", "foo", {"obj": this, "rmethod": "track", "partial-path": "/foo/bar" }'
マークアップ全体。私たちは目立たないアプローチを検討しています。他の JS オブジェクトを渡す他のキーと val のペアが存在する場合もあります。オブジェクト: これは問題を説明するための孤立した例です
更新 2: これは危険に思えますが、"js:" で始まるプロパティの文字列値が評価されるという規則を作成できます。{ "js:obj": "this" }
もちろん、これにはeval{ "obj": this ...
を使用するすべての危険が伴います。これは、私が何としても避けたいことです。
「this」の文字列値を現在のスコープに単純に変更することもできますが、this
これは危険性が低くなりますが、IMO はあまりエレガントではありません。