Autor Zpráva
regvac
Profil *
Ahoj,
pokouším se najít globální řešení k testování existence objektů, funkcí a proměnných. Stránku mám složenou s iframů a některé mají další iframy v sobě. Z různých úrovní iframů potřebuji spouštět funkce z jiných iframů. Problém je, že se některé obsahy iframů načítají déle a funkce, které spouštím ještě nejsou zcela načteny nebo ani nejsou v daném iframu(stránce) definovány. Proto musím kontrolovat postupně celou hierarchii iframů a dostupnost funkcí(proměnných,tagů,atd) v nich.
např:
if (window.top.iframe1 && window.top.iframe1.iframe12 && window.top.iframe1.iframe12.document.getElementById('existuje')) {window.top.iframe1.iframe12.document.getElementById('existuje').innerHTML='existuje';}

Proto jsem zkusil toto:

Při zpuštění se provede kontrola existence postupně celé hierarchie (window.top.iframe1.iframe12.document.getElementById('existuje')) a pokud existují všechny její části, tak true a script (window.top.iframe1.iframe12.document.getElementById('existuje').innerHTML='existuje';) proběhne.


function exists(target) {
  var pole = target.split('.');
  var object = '';
  var object_name = '';
  for (var i = 0; i < pole.length; i++) {
    if (i == 0) {object_name = pole[i];}
    else {object_name = object_name+'.'+pole[i];}
    object = window[object_name];
    if (!object) {return false;} //chyba asi zde
  }
  return true;
}

Bohužel to nefunguje, jak to upravit, má-li to řešení:-(
Chamurappi
Profil
Reaguji na regvace:
Zápisy objekt.xyz a objekt["xyz"] sice fungují stejně, ale objekt.xyz.abc už samozřejmě nefunguje stejně, jako objekt["xyz.abc"]. Takže jakési slepování object_name je nesmyslné…
Musíš tu hierarchii procházet postupně, window bude rodič jen při prvním průchodu.
regvac
Profil *
A jak z hodnoty v poly, např. pole[0]='window';pole[1]='top';pole[2]='iframe1'; sloučit, vytvořit z nich objekt k posouzení jeho existence window.top.iframe1?


Co takto? Zdá se, že mi to funguje, ale nemůže v tom být nějaký problém?

function exists(target) {
  var pole = target.split('.');
  var object = '';
  var object_name = '';
  for (var i = 0; i < pole.length; i++) {
    if (i == 0) {object_name = pole[i];}
    else {object_name = object_name+'.'+pole[i];}
    object = eval(object_name);
    if (!object) {return false;}
  }
  return true;
}
Radek9
Profil
regvac:
Eval ne, prosím tě.
function exists(target) {
  var obj = window;
  target = target.split(".");
  
  for (var i = 0; i < target.length; ++i) {
    obj = obj[target[i]];
    
    if (obj === undefined) {
      return false;
    }
  }
  
  return true;
};

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: