• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

ein iFrame soll die Funktion eines Buttons einstellen

Status
Für weitere Antworten geschlossen.

andynail

Mitglied
Hallo zusammen

je nach geöffneter Seite in einem iframe soll sich die Funktion eines Buttons ändern.

Ich versuche es mit der Zeile
Code:
parent.document.getElementsByName("TextWidth").onclick = function() {SchriftKeinAbstand();}
doch nix passiert. Setze ich ein onclick beim Entwurf der Seite, dann wird beim Klick immer nur diese Funktion ausgeführt.

Also wie weise ich dem Button eine neue Funktion zu?

Danke gruß Andreas
 
Bin ja kein Profi in JS, würde es aber mal mit Anführungsstrichen um die gesamte Funktion herum versuchen, außerdem fehlt ganz am Schluss noch ein Strichpunkt.


MfG
 
Zuletzt bearbeitet:
Anführungszeichen kennzeichnen einen String. Machst Du um die Funktionsdeklaration Anführungszeichen, hast Du keine Funktion mehr, sondern einen (hier:) nutzlosen String.

Und ein Selmikon (:-D) fehlt da nicht, denn in JavaScript muss man eine Zeile am Ende nicht mit einem Semikolon abschließen.
 
Naja, ok, dann ist JS meiner Meinung nach soweit sinnlos, da man z.B. bei Veränderungen am Style Strings benutzt, allerdings bei dem festlegen von onClick nicht.

Aber ohne Strichpunkt am Ende ist der Befehl doch nicht zu Ende?
Kann doch nicht sein das man das weglassen kann?

MfG
 
getElementsByName gibt nach meinen Erfahrungen ein Array mit den gefunden Elementen zurück.
Du kannst leider kein onclick auf ein Array legen (wäre cool, wenn er das automatisch auf alle Elemente anwenden würde). Wenn du es nur auf das erste gefunde Element anwenden willst musst du das so machen
Code:
document.getElementsByName("TextWidth")[0].onclick
Was du aber machen willst ist folgendes. Entweder weist du einem button eine anonyme Funktion zu (wie du es gemacht hast) oder du schreibst den Funktionsnamen hin, aber ohne Klammern (). Denn sonst wird die Funktion sofort ausgeführt :)

Das Semikolon würde ich trotzdem immer am Ende einer Anweisung machen. Man weiß ja nie. Vielleicht benutzt man ja mal irgend wann einen Compressor, der alles in eine zeile schreiben lässt :D

Imbericle schrieb:
Aber ohne Strichpunkt am Ende ist der Befehl doch nicht zu Ende?
Kann doch nicht sein das man das weglassen kann?

Entwedre wird der befehl durch ein ; oder durch eine neue zeile beendet. Mit dem Semikolon ist natürlich wesentlich sauberer.
 
Hallo Gilles und dankeschön

Die Erfahrung mit getElementsByName hatte ich bisher nicht gemacht noch den Index angeben zu müssen wenn nur ein Objekt existiert. Es wird ja diesbezüglich kein Fehler genannt.

Jetzt steht halt
Code:
parent.document.all.TextWidth.onclick = SchriftKeinAbstand
und das funktioniert jetzt einwandfrei! Ich weise auch den Links stets eine Funktion zu:
Code:
document.getElementsByTagName("a")[i].onmouseover = new Function("ShowPicture(" + a + "); " + "LinkAuslesen(" + i + ")")
und da funktionierts einwandfrei. Frage mich wie man mit der jetzigen Variante Parameter hinzufügen kann. Aber das ist ja jetzt nicht notwendig.

Also vielen Dank Gruß Andreas
 
document.all ist Syntax für den IE 4(!) - wenn du einen so alten Browser unterstützen musst...

new Function ist auch nicht schön, da es einem eval entspricht.

Am einfachsten ist ein closure:
Code:
document.getElementsByTagName("a")[i].onmouseover = function(e) {
ShowPicture(a);
LinkAuslesen(i);
};
Wobei das so nicht funktioniert, denn i (und vermutlich auch a) sind andere Werte, als du erwartest.

Aber was macht LinkAuslesen()? Eventuell ist es hier sinnvoller mit this zu arbeiten.
 
Hallo struppi

danke this funktioniert bei LinkAuslesen() mit anstatt document.getElementsByTagName("a")[index].href einfach nur der Parameter Link mit this übergeben.

Doch lautet die Funktion
Code:
function AnzeigenZuweisen()
{
 var a = 0
for (var i = 0; i < document.getElementsByTagName("a").length; i++)
{
if (document.getElementsByTagName("a")[i].onmouseover != undefined)
{
document.getElementsByTagName("a")[i].onmouseover = new Function("ShowPicture(" + a + "); " + "LinkAuslesen(this)")
a=a+1
}
else
{
document.getElementsByTagName("a")[i].onmouseover = new Function("LinkAuslesen(this)")
}
if (document.getElementsByTagName("a")[i].onclick == undefined)
{
document.getElementsByTagName("a")[i].onclick = new Function("AnzeigeSperren(" + i + ")")
}
}
}
und wenn ich dann deine Variante reinsetze, dann wird als Parameter bei ShowPicture immer nur der höchste Wert übergeben.

Danke gruß Andreas
 
Ja, gut erkannt, das liegt daran, dass in dem Moment wo die funktion aufgerufen wird die Schleife längst beendet ist und a den höchsten Wert hat.

Der einfachste Weg ist es dem Objekt den Wert mitzugeben, dazu wäre es sinnvoll auch den Link einer Variabel zu zuweisen:

Code:
var l = document.getElementsByTagName("a")[i];
l.a = a;
if (l.onmouseover) {
// Welchen Sinn das macht verstehe ich aber auch nicht
l.onmouseover = function(e) {
ShowPicture(this.a);
LinkAuslesen(this);
};
a++;
} else {
l.onmouseover = fucntion() { LinkAuslesen(this);};
}
 
Hallo struppi

danke. Ich frage mich aber was nun der Unterschied zu new Function sein soll? Ich glaube dir ja gerne das dies jetzt die bessere Variante ist. Doch für was steht bitte function(das e)?

Und der Code für LinkAuslesen() lautet jetzt:
Code:
function LinkAuslesen(Link)
{
 if (parent.LinkAnzeigen == true)
 {
 parent.document.getElementById("Adresse").innerHTML = Link
 parent.document.getElementById("Adresse").title = Link.innerHTML
 }
}
Ist onmouseover schon eine Funktion zugeteilt, dann existiert dafür ein Bild und ich werde noch eine Weitere hinzufügen.

Es ist aber wohl besser den Index des Objekts in den aufgerufenen Funktionen verarbeiten zu können. Es wäre die einfachste Art und Weise hier diesen mit this als übergebenen Parameter herausbekommen um ihn in einer öffentlichen Variable speichern zu können.

Und die Zuweiseung einer Funktion (der Titel hier) funktioniert jetzt auch einwandfrei mit
Code:
parent.document.getElementById("TextWidth").onclick = function() {Schrift();};
da für mich die Zeile wie von Gilles beschrieben eher wie die Zuweisung einer Variablen aussah.

Danke gruß Andreas
 
Zuletzt bearbeitet:
danke. Ich frage mich aber was nun der Unterschied zu new Function sein soll? Ich glaube dir ja gerne das dies jetzt die bessere Variante ist. Doch für was steht bitte function(das e)?
Das e ist das Eventobjekt das viele Browser (nicht der IE) einem Event übergeben.

new Function() ist ähnlich wie eval(), es ist langsam und unflexibel. Wenn du mit JS programmieren willst, solltest du dich mit closures und anonymen Funktionen beschäftigen, nur so kannst du alle Möglichkeiten von JS ausnutzen.

Und der Code für LinkAuslesen() lautet jetzt:
Code:
function LinkAuslesen(Link)
  {
   if (parent.LinkAnzeigen == true)
   {
   parent.document.getElementById("Adresse").innerHTML = Link
   parent.document.getElementById("Adresse").title = Link.innerHTML
   }
  }
Ist onmouseover schon eine Funktion zugeteilt, dann existiert dafür ein Bild und ich werde noch eine Weitere hinzufügen.
Was ist hier parent? Und wie gesagt, du solltest Variabeln benutzen und nicht immer wieder die gleiche Funktion aufrufen, das macht den Code lesbarer.

Deine Logik bei onmouseover verstehe ich nicht, aber du wirst schon Wissen was du tust.

Es ist aber wohl besser den Index des Objekts in den aufgerufenen Funktionen verarbeiten zu können. Es wäre die einfachste Art und Weise hier diesen mit this als übergebenen Parameter herausbekommen um ihn in einer öffentlichen Variable speichern zu können.
Wieso willst du ausgerechnet den Wert in einer Variabeln speichern? Und was willst du mit dem Index? Ohne zu Wissen, was du genau machen willst, wird es schwer dir bessere Ratschläge zu geben.

Code:
 parent.document.getElementById("TextWidth").onclick = function() {Schrift();};
da für mich die Zeile wie von Gilles beschrieben eher wie die Zuweisung einer Variablen aussah.
Dir scheinen die Begriffe nicht klar zu sein. Eine Variabel kommt in deinem Code (zu) selten vor, a und i sind Variabeln.

Das was du da zuweist ist eine Eigenschaft des Objekts, das du mit getElementById ermittelst. Normalerweise überprüft man auch, ob dieses wirklich Objekt existiert um im Fehlerfall reagieren zu können (schau mal in die Fehlerkonsole, dann siehst du wieviel JS Programmierer diese Grundlage ignorieren).

Diese Eigenschaft ist ein Eventhandler, der im Fall des Events die Funktion aufruft. Der Nachteil dieser Methode ist es, dass nur eine Funktion ausgeführt werden kann, daher gibt es neue Methoden dafür.

Das was dir Gilles gezeigt hat, ist die Zuweisung einer Funktionsreferenz. Das zu erklären würde zu lange dauern, deshalb hier ein paar Beispiele was das bedeutet:
Code:
<script type="text/javascript">
var f1  = function(param) {
    alert('Hallo ' + param);
};

// f1 ist die Funktionsreferenz
f1('andynail');

function f2(param) {
    f1(param);
}

var ref = f2;

// ref ist die Funktionsreferenz auf f1
ref('andynail');

var a = alert;

// a ist jetzt eine Referenz auf window.alert()
a('Hallo Welt');


</script>
 
Hallo andynai und vielen Dank

mit Eventhandler müsste ich mich erst einmal mehr beschäftigen. Es reicht mir aber in der Regel onmouveover, onclick und onfocus.

Was Variablen sind ist mir klar. Stehen Klammern hinter der zugewiesenen Funktion dann sieht das für mich eher wie eine Funktion aus, bei späterem Draufsehen. Ich bräuchte den index, um ein eingeblendetes Objekt in einer anderen Situation wieder ausblenden zu können. Denn das Bild wird mit onmouseover eingeblendet und bleibt beim anklicken dieses Links so lange stehen bis entweder ein anderer Link aufgerufen wird oder man auf eine freie Stelle der Seite klickt. Die Funktion LinkAuslesen() wird aus einem iFrame heraus aufgerufen und der Inhalt wird auf der parent Seite ausgegeben. Ich halte nicht soviel von Variablen die ein Objekt zugewiesen bekommen, da dadurch Speicher in Anspruch genommen und auch jedes Mal verarbeitet wird. Und zu prüfen ob der Button dem ich eine Funktion aus dem iFrame heraus zuweisen will überhaupt existiert, brauche ich ja nicht auf einer nicht dynamisch erstellten Seite. Wäre für die Zukunft villeicht interessant. Aber excistiert das Objekt nicht, dann wird doch eh eine Fehlermeldung ausgegeben.

Danke gruß Andreas
 
Hallo

OK ich hab mich bei der Gestaltung umentschieden, so dass der Index des Objekts nicht mehr Notwendig ist. Hatte es auch mit einem anderen Verfahren hinbekommen, doch ist die jetzige Variante die Bessere. Und klar kann man prüfen ob ein Objekt überhaupt existiert: alert(document.getElementsByName("sdaölf").lengrh)

Ich hätte noch ein anderes Problem und will nicht im Forum mit mehreren hintereinander stehen.

Danke gruß Andreas
 
Zuletzt bearbeitet:
Stehen Klammern hinter der zugewiesenen Funktion dann sieht das für mich eher wie eine Funktion aus, bei späterem Draufsehen
Dann ist es aber falsch, dann rufst du die Funktion auf und weist dem Handler den Rückgabewert zu - der ist undefiniert.

Ich bräuchte den index, um ein eingeblendetes Objekt in einer anderen Situation wieder ausblenden zu können. Denn das Bild wird mit onmouseover eingeblendet und bleibt beim anklicken dieses Links so lange stehen bis entweder ein anderer Link aufgerufen wird oder man auf eine freie Stelle der Seite klickt.
Dazu brauchst du nicht den Index, warum merkst du dir dann nicht einfach das Objekt?

Die Funktion LinkAuslesen() wird aus einem iFrame heraus aufgerufen und der Inhalt wird auf der parent Seite ausgegeben. Ich halte nicht soviel von Variablen die ein Objekt zugewiesen bekommen, da dadurch Speicher in Anspruch genommen und auch jedes Mal verarbeitet wird.
Das ist Quatsch- ein Objekt ist eine Referenz und Referenzen brauchen so gut wie keinen Platz.

Und zu prüfen ob der Button dem ich eine Funktion aus dem iFrame heraus zuweisen will überhaupt existiert, brauche ich ja nicht auf einer nicht dynamisch erstellten Seite. Wäre für die Zukunft villeicht interessant. Aber excistiert das Objekt nicht, dann wird doch eh eine Fehlermeldung ausgegeben.
Das verstehe ich nicht
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben