Path: csiph.com!eternal-september.org!feeder.eternal-september.org!feeder.erje.net!1.eu.feeder.erje.net!weretis.net!feeder1.news.weretis.net!news.solani.org!.POSTED!not-for-mail From: Thomas 'PointedEars' Lahn Newsgroups: de.comp.lang.javascript Subject: Re: Schleife =?UTF-8?B?ZsO8cg==?= document.getElementBy ... innerHTML? Date: Wed, 12 Aug 2015 15:44:17 +0200 Organization: PointedEars Software (PES) Lines: 101 Message-ID: <5808078.Mu2qdKNV6c@PointedEars.de> References: <20150812093317.00f07bc8@ravenworks.netz> Reply-To: Thomas 'PointedEars' Lahn Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8Bit X-Trace: solani.org 1439387272 27297 eJwNwokVADEEBcCWHJ9IOVj6LyH7ZkydvQ/cHLa/KD3heZsmiUVvohElSRvLLPRpS6GnEDnyABLqERk= (12 Aug 2015 13:47:52 GMT) X-Complaints-To: abuse@news.solani.org NNTP-Posting-Date: Wed, 12 Aug 2015 13:47:52 +0000 (UTC) User-Agent: KNode/4.14.2 X-User-ID: eJwFwQcBwEAIBDBLbHpynuVfQhPX4Oi08DA/v0rp6fvCE7SprCseK/fxvrGnDUJcoZlX6hUJpkx0hwiDH1unFcA= Cancel-Lock: sha1:c8qP6/lp/LkIuAzIZA4PQFeasrg= X-NNTP-Posting-Host: eJwFwYEBwCAIA7CXRKCwc6iz/59gkg7DqUAiUqkwuT76HrOO4b4lcTmbcAHj52+j1JdnsR4lMxHo Xref: csiph.com de.comp.lang.javascript:4693 Sascha Hüdepohl wrote: > Maik Koenig schrieb: >> Ich habe ein JavaScript in dem u.A. reichlich Variablen a la >> "FooBar1", "FooBar2" etc mit Inhalten befüllt werden. Die sollen >> jetzt ins Dokument geschrieben werden und zwar dort wo die >> entsprechende ID innerhalb des Dokuments auftaucht: > > Das Problem dabei ist an die Namen der Variablen zu kommen. > > Wenn Du die Variablen alle nach dem gleichen Schema benannt hast und > sie global sind, dann könnte folgendes funtionieren: > > var target, i; > for (i = 0; i < 10; i += 1) { > if (window['FooBar' + i]) { > target = document.getElementById('FooBar' + i); > if (target) { > target.textContent = window['FooBar' + i]; > […] Nein, sondern target.textContent = this['FooBar' + i]; bzw. im lokalen Kontext oder Node.js target.textContent = global['FooBar' + i]; wobei man sich ohne Node.js das “global” mit var global = this; im globalen Kontext selbst bauen muss. window != global. Das mit “window” referenzierte Host-Objekt hat spezielle Eigenschaften, die das in ECMAScript spezifizierte globale Objekt nicht hat. Wer diese beiden Objekte verwechselt, muss sich nicht wundern, wenn Dinge passieren, die er nicht möchte. Zum Beispiel wäre es bei diesem Ansatz fatal, wenn eine der globalen Variablen “location” hiesse: eine Zuweisung an die gleichnamige Eigenschaft von “window” löst eine Navigation aus. > Schöner fände ich es wenn die Variablen in einem Container > zusammengefasst sind: Das ist nicht nur eleganter, sondern auch weniger fehlerträchtig. > var > i, target, > vars = { > fooBar1: 'wert 1', > fooBar2: 'wert 2', > andererName: 'wert 3' > }; > > for (i in vars) { > if (vars.hasOwnProperty(i)) { > target = document.getElementById(i); > if (target) { > target.textContent = = vars[i]; ^ | Uncaught SyntaxError: Unexpected token = > } > } > } Vermutlich effizienter: Object.keys(vars).forEach(function (key) { var target = document.getElementById(i); if (target) target.textContent = this[key]; }, vars); Oder vars = Object.create(null, { fooBar1: {value: 'wert 1', enumerable: true}, fooBar2: {value: 'wert 2', enumerable: true}, andererName: {value: 'wert 3', enumerable: true} }); dann kann man sich das vars.hasOwnProperty(…) sparen, weil das referenzierte Objekt keine Eigenschaften erbt. Erfordert aber jeweils eine Implementierung/Emulation von ES 5+. Siehe auch jsx.object.createDataObject() (zukünftig deprecated zugunsten von jsx.object.createDataObject()) usw. Übrigens gibt es schon JS/ES-basierte Template-Engines. -- PointedEars FAQ: | SVN: Twitter: @PointedEars2 | ES Matrix: Please do not cc me. / Bitte keine Kopien per E-Mail.