in for schleife mehrere Objekte erstellen

chmee

verstaubtes inventar
Premium-User
N Abend Allesamt..

So, sitze gerade an Photoshopscripting in JS. Und prompt stoße ich auf eine Sache, die ich gerne von Euch erklärt haben möchte:

Ich erstelle anfangs ein Array mit mehreren Begriffen aus der Fotografie - landscape, stills, people etc.. Im nächsten Schritt möchte ich daraus Checkboxes machen, damit der User Keywords für sein Foto wählt. Diese Keywords werden in die EXIF-Daten eingeschrieben, Mehrfachwahl also möglich.

In aller Kürze : Wie erstelle ich für jedes String-Objekt aus dem Array eine eigene Checkbox über eine for(each)-Schleife ?

Hier relevante Auszüge aus dem Code:
Code:
var Eingabe = new Window(blabla);
Eingabe.EXIFpnl = Eingabe.add(new Panel blabla);

var Keywords=new Array('landscape','people','architecture','monochrome','stills','flora fauna','etc');

var zaehler=0;
for each(var name in Keywords) { 
  Eingabe.EXIFpnl.name = Eingabe.EXIF.add ('checkbox',[95,50,150,80],name);
}

Abgesehen davon, dass sogar der for each-Aufruf falsch sein könnte :D geht es mir eher um die Initialisierung des Zielobjekts (Rot), da ich dort ja keine Variablen benutzen darf, oder?

mfg chmee
 
Moin chmee,


Abgesehen davon, dass sogar der for each-Aufruf falsch sein könnte :D

Das ist er, zumindest in JS wie ich es kenne....k.A. ob es da in PS Untershchiede gibt.
Code:
for(var name in Keywords)
wäre korrekt.

Bei dem Rest bin ich etwas überfordert...was soll das werden?:-)
Was für Checkboxen...und was ist Eingabe und add()?

Sorry, hab keine Ahnung von Photoshopping :-(
 
Das Scripting in Photoshop hält sich schon an die Konventionen der jeweiligen Sprachen, ich hab auf die Schnelle for each gefunden, was aber ab JS1.6 dabei sein soll. Der Rest, naja, ob Photoshop oder nicht,das ist nicht erheblich, es geht darum, wie man Objekte instanziert erstellt ( add vergleichbar mit new ).

Denn:
Code:
for(var name in Keyword) { var "name" = new Objekt() }
würde Erstens sicherlich einen Fehler rauswerfen, Zweitens (wenn es ginge) das Objekt des letzten Schleifendurchlaufs überschreiben. Kurzum : Wie erstelle ich in einer Schleife eindeutig benannte Objekte? Ähm, mehrere Instanzen des gleichen Objekts.. Oh je, ich hoffe das was verständlich.. :D

mfg chmee

p.s.: Wenns fertig ist, pack ich's in den Photoshopbereich, versprochen.
 
Hier mal nen Beispiel, vielleicht geht es ja in die Richtung von dem, was du meinst;
Code:
<script type="text/javascript">
<!--
var Keywords=new Array('landscape','people','architecture','monochrome','stills','flora fauna','etc');

Eingabe={'EXIFpnl':{},'EXIF':{'add':function(a,b,c){return({'type':a,'array':b,'name':c});}}};


for(var i in Keywords) { 
  Eingabe.EXIFpnl[Keywords[i]] = Eingabe.EXIF.add ('checkbox',[95,50,150,80],Keywords[i]);
}
alert(Eingabe.EXIFpnl.toSource());
//-->
</script>
(Der alert am Ende zum Anschauen des Ergebnisses geht nur im FF)

Das entscheidende, wonach du wohl suchst, ist dies:
Code:
Eingabe.EXIFpnl[Keywords[i]] = Eingabe.EXIF.add ('checkbox',[95,50,150,80],Keywords[i]);

aufs Wesentliche gekürzt:
Code:
objekt['membername']=irgendwas;
 
Ich werds morgen früh mal Testen, jetzt ist's zu spät :D Aber die wichtigsten Fragen jetzt gestellt, damit ich morgen früh was zum Verdauen hab :

1. Wie nennt sich das ( {: {}: :}), was Du da machst ? Wo finde ich das in den JS-Guides..
2. Die for.in-Anweisung (var i in Keywords) ist eigentlich nur die Kurzform von (var i=0;i<=Keywords.length;i++) ? Heisst also, i ist Int und nicht Keywords[i] ? Nicht, wie man es sich bei einer foreach sonst vorstellen würde..

mfg chmee

p.s.: Habe oben noch der Logik halber die anderen Objekte in den Code gepackt. Es sind ein Fenster (Window -> Eingabe) und ein Unterbereich (Panel -> EXIFpnl) in jenem Fenster, welches die Checkboxen innehaben sollen. Es sind grafische Objekte, vorgegeben durch den Adobe-Unterbau.
 
Hi,

1. Wie nennt sich das ( {: {}: :}), was Du da machst ? Wo finde ich das in den JS-Guides..
2. Die for.in-Anweisung (var i in Keywords) ist eigentlich nur die Kurzform von (var i=0;i<=Keywords.length;i++) ? Heisst also, i ist Int und nicht Keywords[ i ] ? Nicht, wie man es sich bei einer foreach sonst vorstellen würde..

1. JavaScript Object Notation
2. ja, ein foreach($array as $key => $value) wie z.B. in PHP gibt es afaik nicht

LG
 
Ihr beiden Racker. Danke und wieder ein Ganglion mit Wissen gefüllt :D Ach nee, Ganglion mit Wasser und Neuronen mit Wissen..

mfg chmee
 
zu 1. man nennt es auch Initalizer, dein add() (oder new ) im Gegensatz dazu erstellt ein Objekt anhand eines Konstruktors.
Details dazu findest du hier im JS-Handbuch: http://devedge-temp.mozilla.org/library/manuals/2000/javascript/1.5/guide/obj.html#1008327
Der grosse Vorzug der 1. Variante(abgesehen von der in meinen Augen übersichtlicheren Schreibweise) ist, dass man nicht wie bei der Nutzung einer Konstrukor-Funktion Gefahr läuft, durch versehentliches Vergessen des new-Operators etwas ganz anderes zu Bewirken....denn ohne new aufgerufen befindet man sich in der Funktion im globalen Geltungsbereich(im Browser das window-Objekt)...und nicht in dem eines selbsterstellten Objektes.



zu 2. jo, das i liefert nicht das, was du vielleicht erwartet hast.
diese Schleife betrachtet den Array als Objekt(was er ja eigentlich ist).

Angenommen, du hast einen Array
Code:
['foo','bar','foobar']

dann sieht er als Objekt betrachtet so aus:
Code:
{0:'foo',1:'bar',2:'foobar'}

das i liefert in der Schleife als den Namen des Members, nicht dessen Inhalt.

Von PHP her kennst du das bestimmt etwas anders beim Durchlaufen assoziativer Arrays, aber soetwas gibt es in JS nicht, auch wenn es manchmal den Anschein erwecken mag.
 
Ah, JSON, verd*, ich hab mir gerade Dein Code angeschaut. OK, ja das kenn ich.. Hmm trifft es aber nicht auf den Punkt..

Die Schleife im ersten gezeigten Sourcecode soll eigentlich ein statisches Initialisieren verhindern. Wenn es statisch wäre (die EXIF-Keywords blieben gleich, somit auch kein Array nötig), hätte ich es stumpf reingehackt, und das könnte mit 4 Keywords zB so aussehen:

Code:
Eingabe.EXIFpnl.Button1 = Eingabe.EXIFpnl.add ('checkbox',[95,50,150,80],'landscape');
Eingabe.EXIFpnl.Button2 = Eingabe.EXIFpnl.add ('checkbox',[95,90,150,120],'monochrome');
Eingabe.EXIFpnl.Button3 = Eingabe.EXIFpnl.add ('checkbox',[95,130,150,150],'people');
Eingabe.EXIFpnl.Button4 = Eingabe.EXIFpnl.add ('checkbox',[95,80,150,210],'stills');

und anstatt es statisch zu machen, wollte ich ein Array am Anfang des Source legen, damit jeder Nutzer sich seine Keywords/Tags selbst setzen kann. Also Buttonanzahl abhängig von Arraylänge. Bild anbei, damit man sich etwas darunter vorstellen kann.

mfg chmee
 

Anhänge

  • Webworker_1.gif
    Webworker_1.gif
    8,5 KB · Aufrufe: 27

Neue Beiträge

Zurück