Должен ли jquery.data () работать в скриптах Greasemonkey? - PullRequest
0 голосов
/ 12 января 2009

Я использую jquery в скрипте пользователя greasemonkey. Я пытаюсь добавить несколько вариантов для выбора на основе массива, а также добавить соответствующий объект в элемент с 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 и т. Д. Я просто надеялся, что кто-то может знать, что именно делает это неэффективным.

Ответы [ 3 ]

1 голос
/ 15 января 2009

Я обнаружил, что все, что мне нужно, чтобы заставить его работать, это:

$.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 он использовал код, который не будет работать с этими обертками (я посмотрел немного, но не слишком сложно). Это определенно представляет большую проблему безопасности, поэтому я бы не стал вкладывать это во что-то важное.

1 голос
/ 13 января 2009

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');
});
0 голосов
/ 13 января 2009

Возможно, я не очень хорошо понимаю вопрос, но я дам ответ.

Вы можете перебирать массив, и при этом использовать этот объект. Вот пример

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);
});

Трудно точно понять, что такое "список" в вашем вопросе.

...