Autor Zpráva
Fil sama
Profil
Zdravím, chtěl bych se zeptat jestli, lze převést proměnou, aby se k ní dalo přistopuvat pomocí DOM, bez toho abych její obsah musel nějak vypisovat.
O něco jsem se pokoušel, ale není to úpně ono, protože nemůžu přistupovat ke všem objektům a používat všechny vlastnosti.
var text = "<html><head><title></title></head><body><a href='stranka'>odkaz</a></body></html>";
var html = document.createElement("body"); 
html.innerHTML = text;
alert(html.getElementsByTagName("a").length); 
Fil sama
Profil
Já potřebuju převést proměnou text, tak aby fungovala jako objekt document. Např. abych mohl vypsat počet odkazů takto: text.links.length.
_es
Profil
Fil sama:
Môžeš si dynamicky vytvoriť iframe a v ňom už podľa ľubovôle čarovať s celým dokumentom.
No aj tak sa mi zdá, že niečo riešiš nejakým nevhodným podivným spôsobom.

var html = document.createElement("body");
<html> a <body> sú odlišné elementy odlišného typu.
Fil sama
Profil
Ten text nemůžu nikde zobrazovat, protože by mohl obsahovat script.
midlan
Profil
Fil sama:
tak scripty z toho usekáš pomocí substring nebo nějak podobně a ten iframe nastavíš jako neviditelný ;)
_es
Profil
midlan:
tak scripty z toho usekáš pomocí substring nebo nějak podobně
Všetky možné spôsoby vloženia JS len tak „neuseká“, JS môže byť aj v HTML atribútoch.
Fil sama:
Vyzerá to na niečo veľmi pochybné - ako práca s nejakými cudzími kódmi - ak sa obávaš vloženého JS - mal by si upresniť, o čo sa pokúšaš.
midlan
Profil
Tak já teď pracuji na stránce v ajaxu a mám hodně podobný problém tak nebudu zakládat nové téma. Načítám obsah .html souborů bez hlavičky do divu přes jquery způsobem:
$("div#id").load("stranka.html");

ale stránku chci do divu vložit až když budou načtené obrázky atp. které obsahuje stranka.html.

Nevím jestli je jiné řešení než iframe a jestli ne tak jak to pomocí toho iframe napsat? Skušenosti s iframe+javascript nemám žádné...
pcmanik
Profil
midlan:
Obrazky nacitane nemozu byt, nakolko ajax, dokaze prenasat len textove data a nie binarne.
Witiko
Profil
midlan:
Vytvoříš si skrytý iframe element, vlastnost src mu nastavíš na adresu načítaného souboru, na událost onload zavěsíš kód, který iframe odkryje a vložíš iframe do dokumentu - třeba právě do toho divu. Nevýhodou je, že načítaná stránka musí být funkční sama o sobě - tzn. i s hlavičkami a se vším. Kdyby bylo možné událost onload přiřadit i na generické elementy - např. div (jako je to možné u body) - tak by ti stačilo to tvé $("div#id").load("stranka.html");, skrytí obsahu divu a jeho odkrytí po načtení.
midlan
Profil
Witiko:
Nevýhodou je, že načítaná stránka musí být funkční sama o sobě - tzn. i s hlavičkami a se vším

stranka.html neobsahuje hlavičku, jak jí do iframe dostanu?

jinak jestli to dobře chápu tak až na tu hlavičku by to mělo být takhle:

var ramec = document.createElement("iframe");

$(ramec).load(function() {
  $("div#id").load("stranka.html");
}).attr("src", "stranka.html");


Jde mi hlavně o ty obrázky, aby když se stranka.html načte do divu tak aby už byly načtené a vykreslené obrázky.

EDIT: ještě mě napadlo pomocí php přidat hlavičku, a do iframe načítat něco jako preload.php?s=stranka.html, šlo by to tak?
Yur4Y_
Profil *
Že sa sem tak drzo votrem - nebolo by vhodné použiť pre tento prípad metódu document.createDocumentFragment()?
midlan
Profil
Yur4Y:
můžeš ukázat jak by se to dalo udělat? Mám k dispozici jedinou proměnou s celým kódem bez hlavičky.
Yur4Y_
Profil *
midlan:
Funguje mi niečo na spôsob
var text = "<body><a href='stranka'>odkaz</a><a href='stranka2'>odkaz2</a></body>",
  df = document.createDocumentFragment(),
  wrapper = document.createElement('html');
wrapper.innerHTML = text;
df.appendChild(wrapper);
alert(df.firstChild.getElementsByTagName('a').length);

Ale s fragmentami som nikdy nerobil, takže nie som si istý, nakoľko je moje riešenie vyhovujúce.
midlan
Profil
Yur4Y:
nemyslím si že je to to co potřebuji, ledaže by fungovalo něco jako
df.onload = function() {blok příkazů}
Witiko
Profil
midlan:
DocumentFragment nic nemění na tom, že na jedné stránce nemůže být víc html dokumentů inline. Ohledně [#10] - ne, měl jsem spíše na mysli, že "div#id" by se takto nepoužilo. Jednoduše po načtení iframe by se daný iframe odkryl. Tzn. něco takovéhleho:
$("div#id").append(
  $("<iframe>").load(function() { 
    $(this).show(); 
  }).attr("src", "stranka.html").hide()
);
midlan
Profil
Witiko:
to už je jedno jak bych to vložil ne? Mě by to víc vyhovovalo jako plain html než v iframe.

A k tý iframe hlavičce, jakým způsobem je nejelegantnější jí vložit? Přes php?

EDIT: ještě důležitej dotaz: event .onload se spustí až když budou načtené i obrázky nebo jen načtený kód?
pcmanik
Profil
midlan:
To je take strasne zlozite pouzit google, alebo jpw.cz?
Witiko
Profil
midlan:
A k tý iframe hlavičce, jakým způsobem je nejelegantnější jí vložit? Přes php?
Přes libovolný serverový scriptovací jazyk, který ti přirostl k srdci.

to už je jedno jak bych to vložil ne? Mě by to víc vyhovovalo jako plain html než v iframe.
To není jedno, protože nikde není psáno, že ten prohlížeč nebude ty obrázky sosat znovu a prováděl bys zbytečně 2 požadavky pro 2 rozdílné soubory (jednou verzi s hlavičkou, podruhé bez ní).

event .onload se spustí až když budou načtené i obrázky nebo jen načtený kód?
Měl by se spustit ve stejnou chvíli jako window.onload dokumentu uvnitř rámce - tzn. až poté, co se načte naprosto všechno.
midlan
Profil
Witiko:
tak jsem to chtěl udělat tak že z toho iframu vytáhnu html, jenže jsem asi objevil bug v chrome :D

zdroj:
$(function(){
  var okno = document.createElement("iframe");
  $(okno).attr("src", "stranka.html");
  
  $("body").append(okno);
  $("iframe").load(function() {
    alert($($(okno).contents().find("body")).html());
  });
});


Chrome pokaždé vyhodí null, ostatní prohlížeče vyhazují obsah body, ať je event .load bindlý na $(okno) i na $("iframe"). Používat iframe ve stránce se mi moc nechce. Takže asi končím a nechám to tak jak to mám teď (načítání plain html ze souborů bez hlavičky) :(
Witiko
Profil
midlan:
načítání plain html ze souborů bez hlavičky
Taky bych to tak udělal. A pokud tak moc chceš preloadnout obrázky ještě před zobrazením, můžeš si nechat serverovým scriptem nechat na ajax žádost navrátit pole obrázků, přednahrát je a až poté stránku zobrazit, ale zdá se mi to jako kanón na vrabce, který iframe řeší celkem obstojně.

Ideální by samozřejmě bylo, kdyby jakýkoliv generický element jako <div> či <span> podporoval onload event stejným způsobem jako element <body>. Nejblíže tomu je právě řešení přes iframe.

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:

0