Frage

Ich bin mit jquery in einem Greasemonkey Benutzerskript. Ich versuche, eine Reihe von Optionen zu einem ausgewählten hinzuzufügen basierend auf einem Array und halten auch das entsprechende Objekt in dem Element mit jquery.data wie folgt aus:

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

Dann würde Ich mag das Objekt wieder heraus Auswahl bekommen:

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

Doch in meinem Greasemonkey Benutzerskript, ist theObj undefiniert. Ich weiß, es gibt einig krumme Tour mit Wrapper geht, unsafeWindow usw. ich gerade hatte gehofft, jemand könnte wissen, was genau macht das nicht.

War es hilfreich?

Lösung 2

Ich fand, dass alles, was ich brauchte es, um Arbeit zu bekommen, war dies:

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

Das alles hat mit XPCNativeWrappers zu tun. Ich bin mir nicht sicher, wo in dem jQuery-Code wurde Code, der nicht mit diesem Wrapper arbeiten (ich ein wenig aussehen, aber nicht zu hart). Dies stellt auf jeden Fall eine große Sicherheitsproblem aber, so würde ich dies nicht wichtig, in etwas setzen.

Andere Tipps

theObj sollte nicht definiert werden, wenn die letzte Option des ersten Auswahlfeld auf der Seite ausgewählt, weil die Daten nur an all die letzten Optionen auf jedem selectbox hinzugefügt wurde, wurde aber für die erste gewählte Option auf der Seite abgerufen werden.

So wie ein Style-Guide, sollten Sie mit „diesem“ mehr in Betracht ziehen. z.B.

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

sollte:

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

oder

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

Ich kann die Frage nicht sehr gut sein zu verstehen, aber ich werde der Antwort einen Schuss.

Sie können durch eine Anordnung durchlaufen, und dabei das Objekt verwenden. Hier ist ein Beispiel

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

Hard genau zu wissen, was "Liste" in Ihrer Frage ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top