nam: iframes, SOP und Javascript

Guten Tag!

Folgendes Problem stellt sich mir und ich finde keine Lösung:

Auf meiner Website gibt es verschiedene iframes, die z.T. Dateien von der selben Domain laden und z.T. von externen Servern.

Nun möchte ich ein JavaScript schreiben, mit dem ich 'meine' (also die, welche die Same Origin Policy erfüllen) iframe-Dateien beeinflussen kann. Mein naiver Ansatz war, alle iframes mit einer for-Schleife zu durchlaufen und die location-Properties auszulesen. Falls dann die location mit meiner Domain übereinstimmte, hätte das Script seine Arbeit verrichtet. Dies geht aber nicht (logisch: SOP blockiert hier!)

Nicht funktionierender Ansatz (+/- Pseudocode):

  
var i, fl;  
if (window.frames.length > 0) {  
  fl = window.frames.length;  
  for (i = 0; i < fl; i++) {  
    if (window.frames[i].location.href.indexOf('meineDomain.com') !== -1) {  
      //mache dinge hier  
    } else {  
      continue;  
    }  
  }  
}  

Wie kann ich rausfinden, ob ich auf ein iframe Zugriff habe oder nicht?

Danke für eure Tipps.
nam

  1. Hi,

    Wie kann ich rausfinden, ob ich auf ein iframe Zugriff habe oder nicht?

    Das dürfte einer der wenigen Fälle (in JS) sein, in denen man um try/catch nicht herumkommt.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. Hi

      Das dürfte einer der wenigen Fälle (in JS) sein, in denen man um try/catch nicht herumkommt.

      Danke, funktioniert nicht:

        
      var i, fl, content;  
      if (window.frames.length > 0) {  
        fl = window.frames.length;  
        for (i = 0; i < fl; i++) {  
          try {  
            content = window.frames[i].document;  
            alert(content);  
          } catch (e) {  
            alert(e);  
          }  
        }  
      }  
      
      

      Klappt zwar im Firefox (alertet einen Zugriffsfehler), funktioniert aber in Safari und Chrome nicht; hier wird einfach 'undefined' ausgegeben und die übliche SOP-Fehlermeldung in die Konsole geschrieben. IE hab ich jetzt gar nicht erst getestet.

      Weiss niemand Rat?

      1. Klappt zwar im Firefox (alertet einen Zugriffsfehler), funktioniert aber in Safari und Chrome nicht; hier wird einfach 'undefined' ausgegeben und die übliche SOP-Fehlermeldung in die Konsole geschrieben. IE hab ich jetzt gar nicht erst getestet.

        Weiss niemand Rat?

        Mach das try mal um die ganze Funktion, vielleicht wirft schon der Zugriff auf frames.length einen Fehler,

        Struppi.

        1. Hi Struppi

          Mach das try mal um die ganze Funktion, vielleicht wirft schon der Zugriff auf frames.length einen Fehler,

          Hilft leider auch nicht. frames.length wird korrekt ausgelesen.
          Hier habe ich mal eine Testseite aufgeschaltet: http://mnn.ch/diversa/frametest/test1.html

      2. Hi,

        Klappt zwar im Firefox (alertet einen Zugriffsfehler), funktioniert aber in Safari und Chrome nicht; hier wird einfach 'undefined' ausgegeben und die übliche SOP-Fehlermeldung in die Konsole geschrieben. IE hab ich jetzt gar nicht erst getestet.

        Weiss niemand Rat?

        Reicht dir undefined denn nicht aus als Indikator dafür, dass das Lesen von location.href des Frames fehlschlug? Darauf kannst du doch abfragen, bevor du das Ergebnis weiter verarbeitest.

        Mit try/catch bin ich leider auch nicht browserübergreifend zum Erfolg gekommen, und window.onerror half auch höchstens in soweit, dass sich damit die Meldung in der Fehlerkonsole unterdrücken lies.

        MfG ChrisB

        --
        “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
        1. Reicht dir undefined denn nicht aus als Indikator dafür, dass das Lesen von location.href des Frames fehlschlug? Darauf kannst du doch abfragen, bevor du das Ergebnis weiter verarbeitest.

          Doch schon, das mach in inzwischen auch so. Es ist aber hässlich, weil ich dann für FF, IE und Opera den try-catch machen muss und zusätzlich für die Webkits den Test auf undefined.
          Jänu! Ist wohl so…

          Trotzdem Danke.

          PS: die Fehlerunterdrückung lass ich mal weg, da schiess ich mir ins eigene Bein ;-)

  2. Nachtrag: Das Problem beschränkt sich auf Webkit-Browser (Safari und Google Chrome).