2012-12-03 10 views
10

Ich habe ein Frameset, in dem in einem Frame eine Schaltfläche enthalten ist, die das übergeordnete Frameset auf eine bestimmte Größe minimiert.Frameset wird nach Größenanpassung mit der Maus nicht korrekt skaliert

Der Code funktioniert, aber das Problem ist, wenn ich Frame zuerst mit meiner Maus manuell ändern und dann die Minimieren-Taste drücken, wird es in IE8 und Chrome falsch skalieren. Es wird in FF korrekt skaliert.

Ich habe diese HTML-Struktur

... 
<frameset cols="32%,*" border="2" frameborder="1" framespacing="1"> 
    <frameset rows="350,*" border="2" frameborder="1" framespacing="1" id="searchResultFrameset"> 
     <!-- The minimize button are in this frame searchResultFrame --> 
     <frame name="searchResultFrame" scrolling="no" src="dummy"> 
     <frame name="itemFrame" frameborder="1" scrolling="no" id="itemFrame" src="dummy2"></frameset> 
    <frame name="contentFrame" frameborder="0" scrolling="yes" id="contentFrame" src="dummy3"> 
</frameset> 
... 

und diesen Code, der beim Drücken der Taste ausgeführt wird.

// Minimize frame button 
$('.minimizeFrame').toggle(function() { 
    parent.document.getElementsByTagName('frameset')[1].setAttribute('cols','22,*'); 
}, function() { 
    parent.document.getElementsByTagName('frameset')[1].setAttribute('cols','32%,*'); 
}); 

kann ich sehen, dass cols="32%,*" Änderungen an cols="22,*" in den Entwickler-Tool, aber es in der falschen Größe machen nach wie vor.

Warum ändert sich die Größe nach Änderungen mit der Maus falsch? Fehle ich etwas oder ist es ein Bug im Browser? Oder gibt es vielleicht eine alternative Lösung, um den Rahmen ohne diesen Fehler zu ändern?

Beispiel

http://jsbin.com/ohihiy/2

+1

ich auch mit diesem Problem bin. Es scheint, dass, was auch immer Sie die Spalten zu setzen, ist es immer relativ zu dem, was Sie in der Größe geändert haben, anstatt insgesamt. Dies scheint ein Webkit-Bug zu sein, da Safari genauso funktioniert wie Chrome, während Firefox wie erwartet funktioniert! – Joel

+1

Es erscheint, sobald Sie die Größe manuell geändert haben, indem Sie den Rahmenrahmen verwenden. Es gibt keine Möglichkeit, den Rahmen programmatisch zu ändern. – Joel

+2

In Codler-Beispiel js-code wird das cols-Attribut des zweiten (inneren) Framesets festgelegt. Ich vermute, dass das äußere Frameset gesetzt werden sollte. – Rembunator

Antwort

0

Wenn ich das richtig verstanden, ein Attribut eines Objekts zu setzen Ihr versucht, die in einem anderen Rahmen ist. Einige Browser akzeptieren das nicht.

Wenn ich versuche, Ihr Problem zu reproduzieren, kann ich sehen, dass ich in Firefox die Größe des Rahmens umschalten kann (kein Problem).

In Chrom jedoch bekomme ich einen Sicherheitsfehler, weil ich versuche, eine Eigenschaft auf einer anderen Seite, nämlich die Frameset-Seite von innerhalb einer Seite innerhalb eines Frames festlegen.

bearbeiten: Der folgende Code funktioniert in IE8. Brauchst du das?

Vergessen Sie nicht, die jQuery-Datei 1.8.2.min.js

Datei hinzufügen: index.html

<!doctype html public "-//w3c//dtd html 4.01 frameset//en" 
    "http://www.w3.org/tr/html4/frameset.dtd"> 
<html> 
<head> 
<title>a simple frameset document</title> 
</head> 

<frameset cols="32%,*" border="2" frameborder="1" framespacing="1"> 
    <frameset rows="350,*" border="2" frameborder="1" framespacing="1" id="searchResultFrameset"> 
     <!-- The minimize button are in this frame searchResultFrame --> 
     <frame name="searchResultFrame" scrolling="no" src="frame1.html"> 
     <frame name="itemFrame" frameborder="1" scrolling="no" id="itemFrame" src="dummy2"></frameset> 
    <frame name="contentFrame" frameborder="0" scrolling="yes" id="contentFrame" src="dummy3"> 
</frameset> 

</html> 

Datei: frame1.html

+2

Ich glaube nicht, dass Sie verstanden haben. Wir versuchen, die Eigenschaft cols eines veränderbaren Framesets zu setzen, und zwar aus jedem Fensterbereich (oben, genauso wie Frameset, untergeordnet), um dasselbe Ergebnis zu erhalten. Es ist ein Problem damit, wie das Frameset gerendert wird, nachdem es mit der Maus skaliert wurde, nicht aber Sicherheitsprobleme beim Zugriff auf Frame-Eigenschaften. – Joel

+0

Ich habe meine Antwort aktualisiert. – Rembunator

+0

Überraschend, wenn ich heute wieder auf IE8 teste, scheint es zu funktionieren, aber immer noch in Chrome abgehört. – Codler

0

ich das gleiche Problem haben, und ich verwendet, um den Vorschlag zu verstecken, dann setzen und dann wieder auftauchen und es funktionierte für mich. Siehe unten Beispiel:

var $frames = $(<parentElement>).find('<framesetname>')[ 0 ]; 
frames.hide().attr('cols', '*,500').show(); 

Sie arbeiteten für Chrome, Firefox, IE11 & Opera. Hoffe, es funktioniert für Sie.

+0

Es scheint, dass Sie die Funktion hide() für ein Frameset-Objekt nicht aufrufen können. Muss aus dem Container entfernt werden, dann die Attribute festlegen und dann erneut zum Container hinzufügen. –

1

Das funktionierte für mich.Ich habe eine Funktion erstellt, die Spalten zurücksetzt und später die korrekten Breiten setzt. Es scheint, es muss ein Timeout nach Reset oder eine Art Schleife sein, dass „berührt“ Kind Rahmen

function init_page() { 
    function setCols(frms, cols) { 
    // for some magic reason we have to 1st -> reset current cols 
    frms.setAttribute('cols', ''); 
    // and 2nd ask about child width (it's now clientWidth) 
    for (var i = 0; i < frms.children.length; ++i) { 
     if (frms.children[i] && (typeof frms.children[i].clientWidth != "undefined" || typeof frms.children[i].width != "undefined")) { 
     } 
    } 
    frms.setAttribute('cols', cols); 
    } 
    // Minimize frame button 
    $('#minimizeButton') 
    .toggle(function() { 
     setCols(parent.document.getElementsByTagName('frameset')[0], '50,*'); 
    }, 
    function() { 
     setCols(parent.document.getElementsByTagName('frameset')[0], '50%,*'); 
    }); 
}