Question

J'utilise jquery dans un script utilisateur greasemonkey. J'essaie d'ajouter un tas d'options à une sélection basée sur un tableau et de coller également l'objet correspondant dans l'élément avec jquery.data comme ceci:

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

Ensuite, j'aimerais que l'objet soit de nouveau sélectionné:

$('select').change(function(){
   var theObj = $('option:selected', this).data('obj');
});

Cependant, dans mon script utilisateur greasemonkey, theObj n'est pas défini. Je sais qu'il y a des affaires de singe avec des wrappers, unsafeWindow, etc. J'espérais juste que quelqu'un sache ce qui fait que cela ne fonctionne pas.

Était-ce utile?

La solution 2

J'ai constaté que tout ce dont j'avais besoin pour le faire fonctionner était le suivant:

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

Tout est lié aux XPCNativeWrappers . Je ne sais pas trop où, dans le code jQuery, il utilisait un code qui ne fonctionnerait pas avec ces wrappers (j'ai regardé un peu mais pas trop fort). Cela pose néanmoins un problème de sécurité majeur, je ne le mettrai donc pas dans une matière importante.

Autres conseils

theObj doit être indéfini à moins que la dernière option de la première zone de sélection de la page ne soit sélectionnée, car les données n'ont été ajoutées qu'à toutes les dernières options de la zone de sélection, mais ont été extraites pour la première option sélectionnée de la page.

À titre de guide de style, vous devriez envisager d’utiliser "this". plus. par exemple.

$('select').change(function(){
   var theObj = $('select option:selected').data('obj');
});

devrait être:

$('select').change(function(){
   var theObj = $('option:selected',this).data('obj');
});

ou

$('select').change(function(){
   var theObj = $(this).find('option:selected').data('obj');
});

Je ne comprends peut-être pas très bien la question, mais je vais essayer de répondre.

Vous pouvez parcourir un tableau et utiliser ainsi cet objet. Voici un exemple

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

Difficile de savoir exactement ce que " liste " est dans votre question.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top