[JS] Complete framestructuur doorzoeken

Pagina: 1
Acties:

  • porn*
  • Registratie: Januari 2001
  • Laatst online: 26-08 13:24

porn*

...take on the world!

Topicstarter
Ik heb een script geschreven dat naar de top van een framestructuur gaat (het allerhoogst liggende frame) en dan alle frames afzoekt tot een frame met de opgegeven naam wordt gevonden.
Het script zelf werkt prima. Helaas heb ik ondervonden, dat wanneer ik het script gebruik op sites die op meerdere servers staan.
Ter verduidelijking: Er is bijv een site die op server 1 staat. Die heeft o.a. een content en een navigatieframe. Klik je in het navigatieframe op een bepaalde optie, dan wordt een module, draaiend op server 2, in het content frame geladen. De module bevat ook weer frames, die weer frames bevatten, etc. In die module staat deze functie. Wil ik dan naar de top van ALLE frames vanuit die module, dan gaat dat goed zolang ik binnen de framesets van de module blijf, maar probeer ik bij frames te komen die van de hoofdsite komen, en dus op server 1 staan, dan krijg ik een "Access denied" Javscript foutmelding.

Ik vermoed dat dit een security issue is, het lijkt me vrij logisch dat je niet zomaar in frames mag gaan neuzen die niet bij je eigen site (=domein) horen. MAAR het probleem is dat ik dit niet af kan vangen. Ik HOEF helemaal niet bij de frames van de hoofdsite, maar ik zou niet weten hoe ik het scriptje zo kan schrijven dat hij stopt wanneer ik anders een error zou krijgen (try catch geprobeerd maar dat is me niet gelukt).

Het scriptje (wordt aangeroepen met bijv: findFrame("frame_naam") ):
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
function findFrame(framename) {
  if (mtBrowserVersion<5 && document.layers!=null) { // NS < 6
    var f = mtElement(framename);
    if (f!=null) {
      return f;
    }
  }
  var p = null;
  var error = false;
  if (window!=null) if (window.parent!=null) p = window.parent;
  while (p.parent!=null && p.parent!=p) {
    p = p.parent;
  }
  var f = null;
  f = doFind(p,framename);
  return f;
}

function doFind(p,framename) {
  var f=null;
  for(var i=0; i<p.frames.length; i++) {
    if (p.frames[i].name==framename) {
      f = p.frames[i];
      return f;
    }
  }
  if (f==null) {
    for(var i=0; i<p.frames.length; i++) {
      f = doFind(p.frames[i],framename);
      if (f!=null) return f;
    }
  }
}


Overigens werkt het in sommige browsers wel. Bijv MSIE 5.5 en 6 en NS 4.7 pikken het, volgens mij alle andere browsers niet. Security bugje?

Anyway, kan iemand me vertellen hoe ik de foutmelding zo af kan vangen dat het script stopt bij het hoogste frame van de huidige server?

Voor de duidelijkheid: frame.location opvragen gaat niet, dan krijg je ook al meteen een "Access violation". :(

Bnet pindle#2913


  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

window.onerror al geprobeerd?

Today's subliminal thought is:


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 26-08 13:24

porn*

...take on the world!

Topicstarter
Dat werkt toch niet in Netscape of vergis ik me nu?

Bnet pindle#2913


  • whitey-d
  • Registratie: April 2000
  • Laatst online: 08-08 19:24
je hebt het mis:
http://developer.netscape...municator/jsref/evnt8.htm
in elk geval betreffende versie 4.

“Advertising says to people, 'Here's what we've got. Here's what it will do for you. Here's how to get it.'”


  • porn*
  • Registratie: Januari 2001
  • Laatst online: 26-08 13:24

porn*

...take on the world!

Topicstarter
Bedankt voor de reacties, het is inderdaad een vrij standaard event dus was het logisch dat het wel in NS zat, stom van mij. Nadeel is dat ik de mogelijkheid om window.onerror makkelijk te implementeren niet goed zie. Het is namelijk de bedoeling dat het while loopje, dat constant de functie doFind aanroept, NA de error wederom aangeroepen wordt, maar dan met aIndex - 1. En window.onerror vangt wel een fout op, maar kan er niet voor zorgen dat het loopje opnieuw wordt uitgevoerd...

Ik heb het momenteel opgelost met een try-catch blok. Het nadeel hiervan is weer dat het niet lijkt te werken in NS en MSIE 4 (lager ondersteunen we sowieso niet). Weet iemand nog een andere oplossing?

Bnet pindle#2913