jquery.data()はGreasemonkeyスクリプトで動作しますか?
-
22-07-2019 - |
質問
greasemonkeyユーザースクリプトでjqueryを使用しています。私は配列に基づいて選択に多くのオプションを追加し、次のようにjquery.dataで要素に対応するオブジェクトを貼り付けようとしています:
$.each(some_array, function(item){
// These next 2 statements seem awkward to me and I was also hoping
// a jquery master could show me a slicker way to perhaps
// combine them into something simpler
$('select').append('<option>dummy</option>');
$('select option:last-child').data('obj', item);
});
次に、選択時にオブジェクトを元に戻したい:
$('select').change(function(){
var theObj = $('option:selected', this).data('obj');
});
しかし、私のgreasemonkeyユーザースクリプトでは、theObjは未定義です。ラッパーやunsafeWindowなどでモンキービジネスが行われていることを知っています。これが機能しない理由を誰かが知っていることを望んでいました。
解決 2
機能させるために必要なのはこれだけであることがわかりました:
$.each(some_array, function(item){
$('select').append('<option>dummy</option>');
$('select option:last-child').each(function(index, elem){
$(elem.wrappedJSObject).data('obj', item);
});
});
$('select').change(function(){
var theObj = $('option:selected', this.wrappedJSObject).data('obj');
});
すべては XPCNativeWrappers と関係しています。 jqueryコードのどこでこれらのラッパーで動作しないコードを使用していたのかわかりません(少し見えましたが、それほど難しくありませんでした)。ただし、これは間違いなく大きなセキュリティ問題を引き起こすため、これを重要なことには入れません。
他のヒント
theObjは、ページの最初の選択ボックスの最後のオプションが選択されない限り、未定義である必要があります。これは、データがすべての選択ボックスの最後のオプションに追加されるだけで、ページの最初の選択オプションに対して取得されたためです。
スタイルガイドとして、「これ」の使用を検討する必要があります。もっと。例えば
$('select').change(function(){
var theObj = $('select option:selected').data('obj');
});
はずです:
$('select').change(function(){
var theObj = $('option:selected',this).data('obj');
});
または
$('select').change(function(){
var theObj = $(this).find('option:selected').data('obj');
});
質問をあまりよく理解していないかもしれませんが、答えを試してみましょう。
配列を反復処理できます。その際、そのオブジェクトを使用します。次に例を示します
var array_items = [0,1,2,3,4,5];
$.each(array_items, function(item) {
$('select').append('<option>dummy</option>');
$('select option:last-child').data('obj', item);
});
どの「リスト」を正確に知るのが難しいあなたの質問です。
所属していません StackOverflow