Autor Zpráva
MartinZ
Profil *
Dobrý den,
potřebuji poradit jak dosáhnout toho, že po načtení stránky se mi v iframe v té stránce přesune na nějaké id prvku ve stylu záložek? Uf, je to dost krkolomné, takže poměrně konkrétně je známý problém popsán na http://podpora.endora.cz/viewtopic.php?f=27&t=4695#p25634, ale jeho řešení je zatím neznámé. Máte někdo nějaký nápad?
Chamurappi
Profil
Reaguji na MartinaZ:
Popis jsem moc nepochopil. V čem se to má lišit od normálních záložek?
Pokud jsou obě stránky na stejné doméně, lze se z onloadu dostat k té vnitřní skrz this.contentDocument.
MartinZ
Profil *
No od normálních záložek se to nemá lišit (aspoň jsem si to myslel). Když se však napíše ten <iframe> s URL a odkazem na záložku (http://url/#zalozka), tak to má poměrně nepříjemný vedlejší efekt, a to takový, že se stránka v iframe zobrazí na záložce, ale i stránka , kde je vložen ten iframe se také zobrazí na záložce (v tom iframe). Hrozně blbě se to vysvětluje, lepší je to vyzkoušet, každopádně je to nepříjemné a jediný prohlížeč, který to dokáže správně interpretovat je Firefox.
Díky za typ, podívám se na to, bohužel ani to:
<iframe src=" ... " onload="document.getElementById('foo').focus();"></iframe>
nezabralo, což by také mělo fungovat, protože je to pořád na stejné doméně, ale iframe je v administraci a načítá se tam stránka, která je upravována jako náhled. Leda to pak vyřešit jinak než rámem...
Chamurappi
Profil
Reaguji na MartinaZ:
ale i stránka , kde je vložen ten iframe se také zobrazí na záložce
Aha. Tak tomu už rozumím. I když mám chuť vyrobit si pokus, protože mi to nepřipadá pravděpodobné.

bohužel ani to […] nezabralo, což by také mělo fungovat
Nemělo. Hledá to id="foo" v rodičovské stránce. Musíš hledat v contentDocumentu.
Tipnul bych si, že zavolání metody focus() vyvolá zmíněný nežádoucí efekt (dost možná všude), takže spíš bys k cílovému elementu měl jen narolovat, bez focusování.
MartinZ
Profil *
Děkuji za rady, ale zdá se mi, že některé prohlížeče neumí úplně pracovat s <iframe>. Provedl jsem názorný pokus:
Na web jsem umístil následující script:
window.onload = fce;
function fce() { 
  if(self!=top) window.location.href="#div";
}
Ten mi zajistí to, že se script spustí až po načtení stránky a co hlavně, spustí se pouze pokud je web načítán přes iframe. Není nutné řešit jakoukoliv věc okolo tohoto kódu. Funguje, dělá co má. Ale!
Efekt to má však stejný. Pokud načtu z nějaké externí stránky do iframe tuto stránku se scriptem, opravu se vše provede jako má, tzn. že se iframe scrollne na #div, jenže to samé udělá ta externí stránka kde je vložen iframe. Dělá to IE a Chrome. Opera to dělala, ale před pár dny přišla aktualizace a tak se teď už Opera chová správně stejně jako Aurora...
Nevím jak si s tím mám poradit. Tento pokus mi spíše dává najevo, že je to iframe a proto mám smůlu.
Chamurappi
Profil
Reaguji na MartinaZ:
Nevím jak si s tím mám poradit
Začal bych na tvém místě tím, že bych přestal naříkat a zkusil bych věnovat pozornost již dříve uvedeným radám.
MartinZ
Profil *
Však jsem to četl, ale jaká je změna? Vždyť se jedná pouze o metodu přístupu a pokud jsem výše dokázal, že některé prohlížeče špatně interpretují skok na záložku v iframe, jak si tím pomůžu? Zase se dostanu tam kde jsem byl. Předtím ten focus bylo jen plácnutí, dělají to záložky a je jedno jestli to budu dělat tak či onak. Však je z toho viditelné, že na nějakou změnu pouze v iframe zareaguje i rodičovské okno, což je prostě evidentní problém, který by neměl nastat. Nebo na to máte jiný názor?
Chamurappi
Profil
Reaguji na MartinaZ:
Narolovat na element přeci jde i bez záložky. Libovolný posuvník můžeš ovládat skriptem. Pokud ti jde o posuvník v okně/rámu, nejsnazší je volat window.scrollTo nebo window.scrollBy. Pozici elementu v rámci viditelné plochy okna/rámu zase zjistíš metodou getBoundingClientRect(). Takže když si to spojíš, dostaneš cca tohle:
var hrana = element.getBoundingClientRect().top;
window.scrollBy(0, hrana);
… a to pravděpodobně poběží všude bez potíží. Prohlížeč nemá žádný důvod při pokynu k posunu jednoho posuvníku hýbat něčím jiným.
MartinZ
Profil *
Omlouvám se za moje nervózní příspěvky a velice vám děkuji za pomoc. Je to přesně to co potřebuji, ba dokonce lepší. :)
Pokud by někdo řešil podobný problém (ačkoliv tomu nevěřím, protože nutnost použití iframe je skoro nulová) tak jsem to napsal následovně:
function scroll() {
    if(self != top) {
        var div = document.getElementById("ID");
        var rect = div.getBoundingClientRect();
        window.scrollBy(0, rect.top - 50);
    } else {
        /* Nic nedělá, není totiž v IFRAME */
    }
}
S tím, že se opět script spouští window.onload = scroll; ...
Ještě jednou děkuji!
Keeehi
Profil
Pokud to else nic nedělá, ani tam nemusí být. Postačující je:
if(self != top) {
        var div = document.getElementById("ID");
        var rect = div.getBoundingClientRect();
        window.scrollBy(0, rect.top - 50);
}
MartinZ
Profil *
To samozřejmě vím, je to tu jako ukázka, protože rozhodně ne všem je jasné, že podmínka self!=top zjišťuje iframe. Takže aby to bylo ke gustu všem, domysleme si, že je tam napsáno:
/* Zde se provede akce, která se spustí pokud není web načítán z IFRAME */
:))
Chamurappi
Profil
Reaguji na MartinaZ:
Na odkázaném fóru Endory jsi sliboval: „Kdo první přijde s funkčním řešením, pošlu mu čokoládu...
MartinZ
Profil *
Pošlete mi svojí adresu na mail mrtnzlml@gmail.com, málem bych zapomněl, díky za připomenutí...
Chamurappi
Profil
Reaguji na MartinaZ:
Všiml jsem si, že v podpisu na Endoře propaguješ validátor a seo-servis.cz. Vzdávám se své čokolády, pokud si přečteš starší diskusi a přehodnotíš svá doporučení.
MartinZ
Profil *
Podpis jsem umazal. Nemám náladu se s někým hádat o tom co je dobré, protože to je ta nejspornější věc co může být vůbec. Líbí se mi na to, že je to česky a minimálně to ukáže hrubé nedostatky ve zdrojovém kódu. Ostatně ať si každý dělá co chce. A proto zde s vědomím určitých skutečností napíšu i to, že nebudu propagovat pro jistotu ani český validátor, protože se zase najde někdo jiný, kdo bude prskat...
Aneb debaty o validátorech je stejná jako debata windows vs. linux, takže jako svoje doporučení jsem tam nechal pouze svůj nevalidní a seu odporující web na který nikdo nechodí, protože se o něj nestarám.
Prosím o zamknutí tohoto vlákna, nabídka na čokoládu pořád platí...

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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