document.write("<a href:\"javascript:foo(arg)... GEHT NICHT!!
Anne
- javascript
Hallo,
Habe folgendes Problem: ich will eine Objektinstanz einer Funktion übergeben, deren Aufruf jedoch durch das Klicken auf einen Link auslösen lassen. Das sage ich mit
window.document.write("<a href:"javascript:edit(a);">"+a.title+"</a>");
Bei a.title erkennt der Browser das Objekt. Das a in edit(a) aber nicht!
Denn wenn ich durch Klicken des Links die Funktion edit(a) aufrufen will, erscheint in der Statuszeile: Fehler auf der Seite. Und bei Klicken auf das Fehlersymbol: 'a' ist undefiniert.
Würde mich seeehr freuen, wenn jemand ne Idee hat.
Hier der Code zu diesem Problem:
<script language="JavaScript">
<!--
function activity(title){
this.title = title;
}
function edit(a){
alert(a.title);
}
function writeTitle(a){
window.document.write("<a href="javascript:edit(a);">"+a.title+"</a>");
}
a=new activity("Titel");
writeTitle(a);
//-->
Bis dann, Anne
</SCRIPT>
also, entweder verstehe ich dein problem nicht (was durchaus vorkommen kann ;-)) oder aber, also bei mir funktioniert ist und function edit gibt bei mir per alert "Titel" aus.
sowohl im ie, als auch im mozilla
Hallo
Sorry, habe bei der Reduzierung meines Problems zu weit reduziert: Setze bitte statt
a=new activity("Titel");
writeTitle(a);
folgendes ein:
test=new activity("Titel");
writeTitle(test);
Dann gehts nicht mehr. Letzeres kommt aber meinem Problem näher, da ich nicht nur eine activity habe sondern ein ganzes Array voll, die heißen dann also nicht a sondern activities[0], activities[1] usw.
Anne
da kann ich dir jetzt schon sagen, dass das nicht funktioniert. weil du setzt hier: window.document.wri[..]href="javascript:edit(a);">"+a.title+"</a>"); ^ | eine globale variable vorraus. a ist hier nicht das objekt, sondern wirklich der buchstabe "a", den die funktion als objekt zu interpretieren sucht, aber nicht findet, weil es nicht definiert ist. ich würde es anders versuchen und zwar den title wirklich als title tag in den <a href="#" title="titel"> setzen und als funktion: <a hre[..] onclick="alert(this.title)"> oder einfach das a durch this ersetzen, in deinem fall
hoffe das hilft, oder ich raffs nett
Hallo,
Folgende Beobachtungen habe ich schon gemacht: wenn ich edit(a) außerhalb der window.document.write(..) Anweisung aufrufe, klappts.
Deinen Vorschlag kann ich leider nicht umsetzen, da die edit(a)-Funktion noch viel umfangreicher werden soll. Auch das Objekt activity ist in Wirklichkeit viel komplexer. Ich will in edit(a) ein benutzerfreundliches Fernster zum Editieren dieses Objektes laden.
Deshalb muss ich edit das Objekt übergeben, was wie gesagt außerhalb des Strings auch geht. Aber innerhalb des Strings wieß ich nich wie. Habe schon statt "...edit(a)..." schon z.B. "...edit("+a+")..." probiert. Erfolglos.
Habe übrigens ein ganzes Array mit diesen Objekten, so dass ich a auch nicht global definieren kann. Ich will für einzelne Elemente des Arrays die editier-Funktion aufrufen mittels Klick auf den Titel des jeweiligen Objektes.
Es muss doch irgendeine Syntax geben, wie man in einen String eine Objekt-Referenz einfügen kann, oder???
Viele Grüße,
Anne
Es muss doch irgendeine Syntax geben, wie man in einen String eine Objekt-Referenz einfügen kann, oder???
nein nicht soweit mir bekannt sein sollte, aber du kannst schwer mit DOM arbeiten, indem du jedem link eine id zuweist, und die in der funktion mit document.getElementById('id') das richtige element raussucht.
Es muss doch irgendeine Syntax geben, wie man in einen String eine Objekt-Referenz einfügen kann, oder???
nein nicht soweit mir bekannt sein sollte
doch :-)))
Ich habs hingekriegt mit Peters Hilfe, falls es dich interessiert, siehe oben
Viele Grüße, Anne
Hallo,
schau doch mal in deinen alten Thread, da hab ich dir das mit dem String und der Objekt-Referenz heute schon beantwortet.
gruß
ptr
Hallo Peter,
vielen Dank, für eine Variable funktionierts! Das ist schon mal ein Fortschritt!!!
Jetzt habe ich jedoch ein ganzes Feld mit solchen activities. Das Script sieht dann so aus:
<script language="JavaScript">
<!--
function activity(title){
this.title = title;
}
function edit(a){
alert(a.title);
}
function writeTitle(a){
window.document.write("<a href="javascript:edit("+a+");">"+eval(a).title+"</a></br>");
}
var test = new Array();
test[0]=new activity("Titel1");
test[1]=new activity("Titel2");
test[2]=new activity("Titel3");
for(i=0; i<3; i++){
writeTitle("test[i]");
}
//-->
</SCRIPT>
Dann interpretiert er zwar eval(a).title korrekt, meckert jedoch, dass beim Aufruf von "edit(a)" bei "alert(a.title);" title entweder null wäre oder kein Objekt.
Haste ne Idee??
Viele Grüße,
Anne
Lieber Peter,
ich glaub ich habs (war eigentlich naheliegend, nach deiner Erklärung mit dem Übergeben als String, naja, manchmal brauchts halt!!):
for(i=0; i<3; i++){
writeTitle("test["+i+"]");
}
Vielen Dank nochmal!
Grüße von der Anne
ich glaub ich habs (war eigentlich naheliegend, nach deiner Erklärung mit dem Übergeben als String, naja, manchmal brauchts halt!!):
....
Vielen Dank nochmal!
Grüße von der Anne
Jaja, diese Kämpfe mit einem selbst und den Knoten in den eigenen Hirnwindungen kenn ich zur Genüge.
Viel Spaß noch...
Grüße an die Anne
Hallo Anne,
jetzt stehts schon wieder im alten thread !
gruß
ptr
Hallo,
Jetzt habe ich jedoch ein ganzes Feld mit solchen activities. Das Script sieht dann so aus:
function writeTitle(a){
window.document.write("<a href="javascript:edit("+a+");">"+eval(a).title+"</a></br>");
}
1. eval is evil
2. a ist hier ein String "test[i]". In edit(test[i]) ist da i aber nicht mehr bekannt, weshalb test[i] undefiniert ist, also auch keine Eigenschaft title hat.
3. Du brauchst ein global gültiges Array mit activities und als Zeiger für die einzelnen activities deren id im Array.
So etwa:
<script type="text/javascript">
<!--
var test = new Array(); //Globales Array der Aktivitäten
function activity(id, title){
this.id = id;
this.title = title;
}
function edit(a){
alert(a.title);
}
function writeTitle(a){
window.document.write("<a href="javascript:edit(test[" + a.id + "]);">" + a.title + "</a><br>");
}
for (var i=0; i<5; i++){
test[i]=new activity(i, "Titel Aktivität Nr.: " + i);
writeTitle(test[i]);
}
//-->
</script>
Die Frage ist allerdings, ob es so gut ist, so etwas mit JavaScript zu erledigen. Clientseitiges JavaScript kann nichts in Datenbanken bzw. Dateien auslagern. Es muss also das gesamte Array der activities im Arbeitsspeicher verwalten. Bei solchen Scripten kommt es schnell zu hohen Speicher- und Prozessorauslastungen, bis hin zu Abstürzen des Browsers.
viele Grüße
Axel
Hallo Axel,
- eval is evil
warum?
Die Frage ist allerdings, ob es so gut ist, so etwas mit JavaScript zu erledigen. Clientseitiges JavaScript kann nichts in Datenbanken bzw. Dateien auslagern. Es muss also das gesamte Array der activities im Arbeitsspeicher verwalten. Bei solchen Scripten kommt es schnell zu hohen Speicher- und Prozessorauslastungen, bis hin zu Abstürzen des Browsers.
Ja, das sollte man dabei beachten !
Allerdings geht das mit dem Absturz auch nicht soo schnell, da muß man schon ganz schön was reinpacken in den Array.
gruß
ptr
Hallo Peter,
- eval is evil
warum?
Weil EVAL ein Parser im Parser, ein Interpreter im Interpreter bzw. ein Compiler im Compiler ist.
Das hier trifft es ganz gut:
http://weblogs.asp.net/ericlippert/archive/2003/11/01/53329.aspx
Fehlersuche: Was ist einfacher zu prüfen, ein Programm, das dynamisch neuen Code während der Laufzeit erzeugt, oder ein Programm mit einem statischen Code?
Was ist einfacher zu prüfen, ein Programm, das Arrays verwendet oder ein Programm, das, jedesmal wenn es einen Wert aus einer Menge von möglichen Werten benötigt, ein kleines neues Programm compiliert?
Haltbarkeit: Was ist einfacher zu pflegen, ein Array oder ein Programm, das dynamisch neuen Code spuckt?
Geschwindigkeit: Was denken Sie ist schneller, ein Programm, das etwas aus einem Array liest, oder ein Programm, das einen Compiler startet?
Speicher: Was verwendet mehr Speicher, ein Programm, das ein Array ausliest, oder ein Programm, das einen Compiler startet und jedesmal einen neuen Klumpen des Codes compiliert, wenn die Notwendigkeit besteht, einen Wert aus einer Menge von möglichen Werten zugänglich zu machen?
viele Grüße
Axel
Hallo,
Dank an Alex für die Antwort.
Hab mir das alles mal so angeschaut und kann die Bedenken gegen eval() durchaus nachvollziehen.
Bin auch selbst schon immer recht zurückhaltend mit der Verwendung gewesen, weiß jetzt auch warum.
Hatte auch ganz gezielt eval(a).title und nicht eval(a+'.title') verwendet.
Denke, wenn mans nicht übermäßig einsetzt, kann mans durchaus mal verwenden, um sich ne Variable oder ein Objekt zu holen an das man nur über z.B. einen zusammengesetzten String rankommt.
Da muß man halt abwägen.
zum Skript:
wenn die einzelnen 'activity's in nem Array gespeichert sind, brauchts auch weder eine 'id' noch ein 'eval()' in dem script, man muß ja keine Namen übergeben.
Wenn man 'edit()' ein wenig abändert, kann man auch alles über den Array-Index laufen lassen:
<script language="JavaScript">
<!--
function activity(title){
this.title = title;
}
function edit(a){
alert(test[a].title);
}
function writeTitle(a){
window.document.write("<a href="javascript:edit("+a+");">"+test[a].title+"</a></br>");
}
var test = new Array();
test[0]=new activity("Titel1");
test[1]=new activity("Titel2");
test[2]=new activity("Titel3");
for(i=0; i<3; i++){
writeTitle(i);
}
//-->
</SCRIPT>
gruß an alex und anne (und auch alle)
ptr
sorry, natürlich Axel, nicht Alex!
hi
warum bleibst du nicht in deinem thread?
[pref:t=76798&m=442676]
warum? lies die FAQ
so long
ole
(8-)>
warum bleibst du nicht in deinem thread?
Sorry,
bin davon ausgegangen, dass da eh keiner mehr hinguckt und ich dann wohl keine Antwort auf mein Problem kriege.
Doppelgrüße ;-) Anne