0

我在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 等有一些猴子生意。我只是希望有人可能知道究竟是什么让这不起作用。

4

3 回答 3

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');
});
于 2009-01-12T21:54:36.250 回答
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 代码中的哪个位置使用了不适用于这些包装器的代码(我看起来有点但不太难)。不过,这肯定会带来一个很大的安全问题,所以我不会把它放在任何重要的事情上。

于 2009-01-15T03:23:09.300 回答
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);
});

很难确切知道您的问题中的“列表”是什么。

于 2009-01-13T18:56:12.303 回答