Größe eines Frames ändern

DataFox

Erfahrenes Mitglied
Hi

ich habe folgendes problemchen:

Ein Frameset mit 3 Frames. Eines davon enthält ein weiteres Frameset mt 2 Frames.

Nun möchte ich eine Funktion schreiben der ich einfach ein bestimmtes Frame übergebe und die neue breite und höhe. Ein Frame kann man ja entweder nur in der Breite oder in der Höhe skalieren. Die Funktion soll selbst erkennen ob rows oder cols angegeben sind. Zur Not könnte man aber explizit übergeben ob die Höhe oder Breite skaliert werden soll.

Das Problem dabei ist nur, das diese Angabe "cols=324,*,875" nichts darüber aussagt welcher der drei Werte geändert werden muss. Wie kriegt man raus, an welcher Position sich das bestimmte Frame befindet, um dessen Größe im cols- bzw. rows-Attribut des Framesets zu ändern?

Gruß
Laura
 
Das Problem dabei ist nur, das diese Angabe "cols=324,*,875" nichts darüber aussagt welcher der drei Werte geändert werden muss. Wie kriegt man raus, an welcher Position sich das bestimmte Frame befindet, um dessen Größe im cols- bzw. rows-Attribut des Framesets zu ändern?

Die cols(bzw.rows-Eigenschaft) kannst du ja ermitteln, indem du übers DOM dich eine Stufe aufwärts von dem Frame-Element bewegst(per parentNode). Dort schaust du nach, ob es ein cols-Attribut gibt, oder ein rows-Attribut, und splittest selbiges am
Komma.

Um die Position des Frames im parentNode zu ermitteln, gehst du alle Frame-Elemente des parentNode per Schleife durch, und inkrementierst dabei einen Zähler.
Hat das aktuelle Frame in der Schleife denselben Namen wie das Frame, welches du ändern willst, beende die Schleife und ändere das x-te Element des eingangs durchs splitten erhaltenen Arrays auf den gewünschten Wert.
Jetzt verkette den so geänderten Array per join() wieder...und weise ihn der cols(bzw. rows-Eigenschaft) des parentNode zu.

Ich hoffe, du konntest mir folgen, ich habe mich möglicherweise komplizierter ausgedrückt, als es im Endeffekt ist :-)
 
Hi,

@Sven: Ich hatte gerade eine Routine fertig, die das umsetzt, was du beschrieben hast - da hast du geantwortet. Jetzt will ich es @DataFox nicht vorenthalten.
Code:
/* ****************************************************************** *
 * Setzt die Dimensionen eines Frames in einem Frameset.              *
 *                                                                    *
 * objParent    - (object) Fensterhandle, das den Frame enthält       *
 *                z.B. parent, top usw.                               *
 * strFrameName - (string) Name des Frames, dessen Dimension geändert *
 *                werden soll                                         *
 * strAttr      - (string) Attribut, das geändert werden soll         *
 *                (cols, rows)                                        *
 * strWert      - (string) Neuer Wert, z.B. 200, 80%, *               *
 * ****************************************************************** */
function frameTests(objParent, strFrameName, strAttr, strWert){
  var intFrame;

  // Falls der Frame nicht existiert -> Routine mit Meldung verlassen
  if(objParent.document.getElementsByName(strFrameName).length == 0){
    alert("Gesuchter Frame wurde nicht gefunden!");
    return;
  }

  // Frameset-Objekt, dass Frame enthält
  var objFrameset = objParent.document.getElementsByName(strFrameName)[0].parentNode;
  // Alle Frames des Framesets duchlaufen
  for(var i=0; i<objFrameset.getElementsByTagName("frame").length; i++){
    // Falls Frame gefunden wird -> Index merken und Schleife verlassen
    if(objFrameset.getElementsByTagName("frame")[i].name == strFrameName){
      intFrame = i;
      break;
    }
  }

  // Gewünschten Attributstring des Framesets auslesen
  var objAttrOld = objFrameset.getAttribute(strAttr);
  // Attributstring in seine Einzelteile aufsplitten
  var arrSplit = objAttrOld.split(",");

  var strValue = "";
  // Einzelteile des Attributstrings durchlaufen
  for(var i=0; i<arrSplit.length; i++){
    // Falls es sich nicht um den übergebenen Frame handelt -> bisherigen Wert übernehmen
    if(i!=intFrame){
     strValue += arrSplit[i] + ",";
      // Falls es sich um den übergebenen Frame handelt -> übergebenen Wert übernehmen
    }else{
      strValue += strWert + ",";
    }
  }

  // Neuen Attributstring zuweisen
  objFrameset.setAttribute(strAttr, strValue.substr(0, strValue.length-1));
}
Ein Beispielaufruf:
Code:
<button onclick="frameTests(parent, 'NameDesFrames', 'cols', '80%');">frameTests()</button>
Ciao
Quaese
 
Kein Problem, bin eh zu müde :-)

Übrigens...falls man das Ändern des Frames aus dem Dokument heraus, welches sich in dem zu ändernden Frame befindet, vornehmen will, kann man den Namen des Frames recht unkompliziert per self.name übergeben:)
 

Neue Beiträge

Zurück