jquery.data()应该在Greasemonkey脚本中工作吗?

时间:2009-01-12 19:05:47

标签: jquery greasemonkey

我在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用户脚本中,未定义了.bb。我知道有一些猴子业务正在进行包装,不安全的窗口等等。我只是希望有人可能知道究竟是什么让它无效。

3 个答案:

答案 0 :(得分:1)

除非选择了页面上第一个选择框的最后一个选项,否则

theObj应该是未定义的,因为数据仅添加到任何选择框上的所有最后选项,但是已针对页面上的第一个选定选项进行检索。

就像样式指南一样,你应该考虑更多地使用“this”。例如

$('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');
});

答案 1 :(得分:1)

我发现我需要让它发挥作用的是:

$.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代码中的哪个地方使用的代码不适用于这些包装器(我看起来有点但不太难)。这绝对是一个很大的安全问题,所以我不会把它放到任何重要的东西。

答案 2 :(得分:0)

我可能不太了解这个问题,但我会给出答案。

您可以遍历数组,并在此过程中使用该对象。这是一个例子

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

很难确切地知道你的问题中的“列表”。