Det blev en lång titel på denna tråd. Ber om ursäkt för detta.
Jag har ett delikat problem. Jag har en IFRAME som skall ladda en sida från en annan webserver jag inte har kontroll över. Jag vill inte ha några rulllister i min IFRAME så height på IFRAME skall sättas dynamiskt. Jag har kodat såväl egna Javascript som testat en rad färdiga på nätet. Alla har fungerat väldigt bra om jag inkluderar en vanlig HTML-sida. Men nu är det så att sidan jag egentligen skall ladda i min IFRAME är ett frameset bestående av två sidor. Den högra av dessa (kallas content.html) vill jag skall styra höjden på min IFRAME.
Jag har inte lyckats få något av de skripten jag testat att fungera med ett frameset.Någon som kan ge ett tips på ett fungerande skript?
Det är med största sannolikhet inte skripten du har hittat som det är fel på. Problemet ligger i att en sida som ligger i ett frameset eller en iframe och kommer från en annan domän än ägarsidan, inte kan kommunicera med densamma. Detta är en säkerhetsåtgärd för att undvika t ex att en sida kan placera en annan sida i ett frameset och göra saker som att automatiskt posta formulär eller sniphpha lösenord.
Det enda du kan göra är att gilla läget eller se till att alla sidor kommer från samma domän.
Sidorna jag försöker inkludera innehåller ett verktyg skrivit i CGI och det måste ligga där det ligger. Jag kan säkerligen få igenom vissa förändringar på remoteservern för att få detta att fungera. Frågan är vad som skall ändras om det nu finns något att göra?
MegamanMedlem sedan jan. 2004118 inlägg Så här löste jag det med detta javascript, det finns säkert lättare sätt att lösa det på.
Denna javscript sätter du in på den sidan du har din frames i.
<script type="text/javascript">
function getDocHeight(doc) {
var docHt = 0, sh, oh;
if (doc.height) docHt = doc.height;
else if (doc.body) {
if (doc.body.scrollHeight) docHt = sh = doc.body.scrollHeight;
if (doc.body.offsetHeight) docHt = oh = doc.body.offsetHeight;
if (sh && oh) docHt = Math.max(sh, oh);
}
return docHt;
}
function setIframeHeight(iframeName) {
var iframeWin = window.frames[iframeName];
var iframeEl = document.getElementById? document.getElementById(iframeName): document.all? document.all[iframeName]: null;
if ( iframeEl && iframeWin ) {
iframeEl.style.height = "auto"; // helps resize (for some) if new doc shorter than previous
var docHt = getDocHeight(iframeWin.document);
// need to add to height to be sure it will all show
if (docHt) iframeEl.style.height = docHt + 30 + "px";
}
}
function loadIframe(iframeName, url) {
if ( window.frames[iframeName] ) {
window.frames[iframeName].location = url;
return false;
}
else return true;
}
</script>
Och denna i sidan du skalll öppna i din frames.
<script type="text/javascript">
function goSetHeight() {
if (parent == window) return;
// no way to obtain id of iframe object doc loaded into? no parentNode or parentElement or ...
else parent.setIframeHeight('ifrm');
}
</script>
sä sätts höjden automatiskt efter innehållet på den informationen du vill visa.
Och på länkarna som du har på den sidan du vill visa din frames i.
<a class="knapp" href="kontakt.html" onclick="return loadIframe('ifrm', this.href)">Kontakt</a>
*Suck* Att vissa inte kan läsa vad man skriver. Av säkerhetsskäl går det inte att komma åt objekt i ramar mellan domäner med javascript. Denna rad: var docHt = getDocHeight(iframeWin.document); kommer att trigga ett säkerhetsfel eftersom huvud-dokumentet och iframe-dokumentet ligger under olika domäner. Så därför kommer inte ditt skript att fungera i detta fall även om det är korrekt skrivet och fungerar fint för övrigt!
MegamanMedlem sedan jan. 2004118 inlägg OKEJ Sorry läste väl antagligen lite för snabbt men det borde inte vara så svårt att ändra.
ok... finns det något sätt att gå runt denna säkerhetsaspekt?
MegamanMedlem sedan jan. 2004118 inlägg Testade lite och det verkar stämma som nitro2k01 säger det verkar inte funka. Men det borde ju gå ifall att man blandar in lite ASP som kan hämta innehållet du söker efter och sedan använda detta script.
Det finns ett sätt. Den kod jag visar nu...:
- Är bajsigt ful, följer inte standarder osv. Helt enkelt kod fulhackad på en kvart.
- Visar egentligen bara hur man skickar värden mellan ramar i olika domäner. Detta är inte fungerande svar på fredriksk's fråga.
Det går ut på att man har tre sidor.
Först index-sidan eller vad man väljer att kalla den som har två iframes i sig. Iframe 1 innehåller innehåll från annanserver.com. Iframe 2 är tom, men används till at ta emot länkar från Iframe, och länken pekar till en sida på dindoman.com. Eftersom sidan som laddas i iframe 2 ligger på samma domän som index-sidan kan den komma åt alla element ligger på index-sidan.
[b]http://dindoman.com/index.html[/b]
<iframe src="http://annandoman.com/sida.html"></iframe>
<iframe src="about:blank" id="slaveframeid" name="slaveframe"></iframe>
[b]http://annandoman.com/sida.html[/b]
<script type="text/javascript">
window. open( 'http://dindoman.com/resize.php?height=200', 'slaveframe');
</script>
[b]http://dindoman.com/resize.php[/b]
<html>
<script type="text/javascript">
parent.window.document.getElementById("slaveframeid").style.height=<?PHP echo $_GET['argument']; ?>+'px';
</script>
</html>
Så än en gång, detta är bara en "Proof-of-concept"-kod, inte en fungerande lösning. Men det visar en metod för att komma förbi denna säkerhetsspärr. Hur du går vidare får du lösa själv. För min del är det slutengagerat i denna fråga.
Är denna metod en säkerhetsrisk? Nej, för annandoman.com i exemplet kan inte köra en valfri snutt javascript-kod, utan kan bara skicka querystring-data. I ett system som inte förväntar sig data från olika domäner kan man göra en referrer-check.
hmmm... om jag fattar din kod rätt så är det så att sidan i framesettet på "annan domän" sätter height hårt? Detta förutsätter isf att denna sida själv vet "hur hög" den är`? eller?
Du sade att du hade prövat flera skript. Modda ett av dem och byt ut
iframeEl.style.height=theHeight;
eller liknande rad mot
window. open( 'http://dindoman.com/resize.php?height=' + theHeight, 'slaveframe');