Probleem met iframes en scripts

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • MarchelV
  • Registratie: November 2004
  • Laatst online: 14-08 16:30
Hallo allemaal.

Ik heb een heel appart probleem met een iframe in combinatie met een script.

Ik heb een pagina waar een iframe in zit. In dit iframe staat een pagina met een script.
Wanneer ik nu een andere pagina in dit iframe wil laden wordt deze niet in het iframe gezet maar in een nieuw window.
Wanneer ik in het iframe een pagina heb met tekst is er niets aan de hand, dan wordt de nieuwe pagina gewoon in het iframe geplaatst.

Nu is mijn vraag: wat moet ik doen om toch de pagina in het iframe te laden ipv in een nieuw scherm.

ps. Ik gebruik Chrome als browser.


Voorbeeld iframe:
code:
1
<iframe frameborder="0" style="width: 100%; height: 100%;" src="./pages/home.html" id="hoofdframe"></iframe>


Voorbeeld script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<head>
<title>Home</title>
</head>
<BODY>
<div id="img" style="position:absolute;">
<img src="../images/logo.jpg" onMouseDown="pauseResume();">
</div>

<SCRIPT LANGUAGE="JavaScript">
var step = 1;
var delay = 5;
var height = 0;
var Hoffset = 0;
var Woffset = 0;
var yon = 0;
var xon = 0;
var pause = true;
var interval;
var name = navigator.appName;
if(name == "Microsoft Internet Explorer") name = true;
else name = false;
name = true;
var xPos = 20;
if(name) var yPos = document.body.clientHeight;
else var yPos = window.innerHeight;
function changePos() {
if(name) {
width = document.body.clientWidth;
height = document.body.clientHeight;
Hoffset = img.offsetHeight;
Woffset = img.offsetWidth;
img.style.left = xPos + document.body.scrollLeft;
img.style.top = yPos + document.body.scrollTop;
}
else {
height = window.innerHeight;
width = window.innerWidth;
Hoffset = document.img.clip.height;
Woffset = document.img.clip.width;
document.img.pageY = yPos + window.pageYOffset;
document.img.pageX = xPos + window.pageXOffset;
}
if (yon) {
yPos = yPos + step;
}
else {
yPos = yPos - step;
}
if (yPos < 0) {
yon = 1;
yPos = 0;
}
if (yPos >= (height - Hoffset)) {
yon = 0;
yPos = (height - Hoffset);
}
if (xon) {
xPos = xPos + step;
}
else {
xPos = xPos - step;
}
if (xPos < 0) {
xon = 1;
xPos = 0;
}
if (xPos >= (width - Woffset)) {
xon = 0;
xPos = (width - Woffset);
   }
}
function start() {
if(name) img.visibility = "visible";
else document.img.visibility = "visible";
interval = setInterval('changePos()',delay);
}
function pauseResume() {
if(pause) {
clearInterval(interval);
pause = false;
}
else {
interval = setInterval('changePos()',delay);
pause = true;
   }
}
start();
</script>
</BODY>


Voorbeeld pagina laden:
code:
1
<a href="./pages/contactform.html" target="hoofdframe">Contactformulier</a>

Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 09:51
misschien ergens een base_target op _blank ingesteld in de pagina waar je die a aanroept?

Edit: beter moeten lezen...

Zowieso zou een al dan niet uitvoerend js in een iframe geen invloed mogen hebben op het al dan niet herladen van de inhoud van een iframe... Lijkt me raar.

[ Voor 51% gewijzigd door azerty op 15-03-2012 14:49 ]


Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
In regel 19 van je code sample declareer je een variabele genaamd name. Dat gebeurt weliswaar netjes met het var keyword, maar een variabele declaratie in de globale scope is volgens ECMAScript (zelfs met het var keyword) gelijk aan het declareren van een property op het global object.

In browsers is het global object je window. Wat ben je daar dus aan het doen? Juist ja! De window.name property aan het zetten, en daarmee verdwijnt dus de originele naam waaraan je refereert in het target attribuut van je links. Standaard gedrag is om voor een niet bestaande window naam een window aan te maken met die naam. Daarom zie je de hele tijd een nieuw venster ...

Probeer zelf maar eens:
HTML:
1
2
3
4
5
6
7
8
9
<!DOCTYPE html>
<html>
  <body>
    <script>
      var name = "leakyName";
      alert( window.name );
    </script>
  </body>
</html>


Heel eenvoudig op te lossen door je code altijd vanuit een immediately invoked function expression (IIFE) te laten draaien. Dan besmet je de globale scope namelijk niet:

HTML:
1
2
3
4
5
6
7
8
9
10
11
<!DOCTYPE html>
<html>
  <body>
    <script>
      ( function() {
        var name = "nonLeakyName";
        alert( window.name );
      })();
    </script>
  </body>
</html>


Beter nog dan je er gemakkelijk vanaf te maken met enkel een IIFE is om die rommel helemaal te dumpen en gewoon een net alternatief te schrijven. Wat je nu hebt is een fossiel uit de jaren '90, waar echt geen plek meer voor is op het moderne web.


offtopic:
Zocht er laatst trouwens niet iemand naar redenen om je code in een IIFE te wrappen? Hier is dan een mooie waar je uren zoet mee kunt zijn als je niet bekend bent met deze quirk van ECMAScript.

Acties:
  • 0 Henk 'm!

  • azerty
  • Registratie: Maart 2009
  • Laatst online: 09:51
Mooie oplosssing. Lees nu trouwens juist zelf de code nog eens door, en:

code:
1
2
3
4
var name = navigator.appName;
if(name == "Microsoft Internet Explorer") name = true;
else name = false;
name = true;


Dan maakt de browser toch niet meer uit? Het is zowieso altijd true :p

Acties:
  • 0 Henk 'm!

  • MarchelV
  • Registratie: November 2004
  • Laatst online: 14-08 16:30
Ah, kijk! Daar wordt het een heel stuk duidelijker van R4gnax.

Stom dat je zo'n foutje over het hoofd ziet. Ik gaf Grome, W3.org. de kat en de rest van de wereld al de schuld maar het vingertje wijst toch weer naar mij...

Mijn manier van scripten is wat ouderwets, dat weet ik. Lang niets meer mee gedaan maar toch maar weer eens wat aan het prutsen geweest. Me maar eens verdiepen in de nieuwste ontwikkelingen :)


Bedankt voor jullie info!