Avatar billede stringbuffer Nybegynder
05. oktober 2003 - 19:08 Der er 18 kommentarer og
1 løsning

Læsning af data fra IFRAME

Jeg vil læse data fra en iframe mens den bliver indlæst, altså inden den er loadet. Det skal være noget i stil med

var elem;
while (elem = myIframe.something.getElementsByTagName("P")[0])
{
  var text = elem.innerHTML;
  elem.parentNode.removeChild(elem);
}

Jeg aner ikke hvordan jeg kan gøre det, men det skal virke i version 5 browsere. Kom bare med forslag.
Avatar billede thesurfer Nybegynder
05. oktober 2003 - 19:55 #1
jeg er sikkert ikke i stand til at give dig et svar.. men har lige et spm..
du vil læse indholdet af en iframe INDEN der loadet indholdet?
-- så er der vel ikke noget at læse..
Avatar billede stringbuffer Nybegynder
05. oktober 2003 - 20:14 #2
Ehm, der kan godt være indhold inden dokumentet er loadet færdig.
Når serveren svarer med Transfer-Encoding: chunked
så kan den bare blive ved med at spytte indhold ud til browseren uden at dokumentet nogensinde loader færdig.
Avatar billede =maddog= Nybegynder
05. oktober 2003 - 21:42 #3
Hvis dokumentet ikke er loadet færdig giver DOM funktionerne så som getElementsByTagName jo ingen mening da der ikke er noget indlejret hieraki.
Hvis du fisker efter om man kan åbne en stream mellem klienten og serveren er svaret ja, det kan man godt i JavaScript (fra v. 1.2, hvor nativ Java blev understøttet). Desværre ikke i JScript så det vil ikke virke i IE.
Jeg venter spændt på en troldmand der kan løse dit problem.
Avatar billede stringbuffer Nybegynder
05. oktober 2003 - 22:00 #4
Jeg har i hvert fald kunnet få et script inde i min iframe til at gøre ting og sager. Jeg kan bare ikke få adgang til elementerne fra parent vinduet, og kan heller ikke kalde en funktion i parent vinduet inde fra min iframe.

Hvad angår en stream gennem JavaScript 1.2, kan du lave et eksempel eller henvise til et?
Avatar billede =maddog= Nybegynder
05. oktober 2003 - 23:29 #5
OK, men det tog altså en smule tid at konstruere et eksempel for det skulle også gerne give lidt mening.
Her er html dokumentet:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>
<head>    <title>Untitled</title>
<script type="text/javascript">
if  (window.Document) {
    Document.prototype.loadXML = function (s) {
        var doc2 = (new DOMParser()).parseFromString(s, "text/xml"); // Dan parser
        while (this.hasChildNodes()) this.removeChild(this.lastChild); // Tøm dokument
        for (var i = 0; i < doc2.childNodes.length; i++) {
            this.appendChild(this.importNode(doc2.childNodes[i], true)); // Importér
        }
    }

    function processXML(doc) {
        // Gør noget med den xml vi har modtaget
        alert(doc.childNodes);
    }
   
    function stream(url,rootEndNode) {
        var _line,_buffer,_temp,_doc;
        _buffer = new java.io.BufferedReader(new java.io.InputStreamReader(new java.net.URL(url).openStream()));
        while(_line = _buffer.readLine()) {
            // Denne while løkke vil køre så længe InputStream'en bliver ved med at sende bytes.
            // Bemærk at javascript ikke understøtter tråde så scriptet vil sandsyneligvis "hænge"
            // hvis serveren bliver ved med at sende uendeligt.
            _temp += _line;
            if (_line.indexOf(rootEndNode)!=-1) {
                // Vi har modtaget </root> og har dermed modtaget en xml pakke
                if (document.implementation && document.implementation.createDocument) {
                    _doc = document.implementation.createDocument("", "", null);
                    _doc.loadXML(_temp);
                    processXML(_doc);
                } else {
                      // Kan ikke danne et Xml dokument. Gør intet.
                }
                _temp="";
            }
        }
    }
   
    stream("file:///H|/codestore/xml/xmlextras/test.xml","</treeroot>");
}
</script>
</head>
<body></body>
</html>

I eksemplet antages streamen at sende XML dokumenter. Jeg gad ikke rigtig sætte en server side op til at spytte xml dokumenter ud, så jeg lavede bare en fil med tre simple xml sider i.
test.xml:

<?xml version="1.0" encoding="utf-8"?>
<!-- Comment -->
<treeroot>
    <tree text="Root" icon="webfxicon.png" action="/" />
    <tree text="Articles">
        <tree text="Widgets" src="widgets.xml" />
        <tree text="XTree" action="/dhtml/xtree/" />
        <tree text="Test &lt;&gt;&quot;&amp;" src="tree1.xml" action="java script:alert(1)" />
    </tree>
    <tree text="Another Item" action="java script:alert(2)" />
    <![CDATA[
        CDATA section text
    ]]>
</treeroot>


<?xml version="1.0" encoding="utf-8"?>
<!-- Comment -->
<treeroot>
    <tree text="Root" icon="webfxicon.png" action="/" />
    <tree text="Articles">
        <tree text="Widgets" src="widgets.xml" />
        <tree text="XTree" action="/dhtml/xtree/" />
        <tree text="Test &lt;&gt;&quot;&amp;" src="tree1.xml" action="java script:alert(1)" />
    </tree>
    <tree text="Another Item" action="java script:alert(2)" />
    <![CDATA[
        CDATA section text
    ]]>
</treeroot>

<?xml version="1.0" encoding="utf-8"?>
<!-- Comment -->
<treeroot>
    <tree text="Root" icon="webfxicon.png" action="/" />
    <tree text="Articles">
        <tree text="Widgets" src="widgets.xml" />
        <tree text="XTree" action="/dhtml/xtree/" />
        <tree text="Test &lt;&gt;&quot;&amp;" src="tree1.xml" action="java script:alert(1)" />
    </tree>
    <tree text="Another Item" action="java script:alert(2)" />
    <![CDATA[
        CDATA section text
    ]]>
</treeroot>

Testet i NS7. Den spytter pænt tre XML dokumenter ud.
Jeg er klar over at dette ikke lever op til dine kompatibilitets-krav, men du spurgte. Jeg er ligeledes klar over at dette eksempel sender "færdige" dokumenter igennem, men det er udelukkende af hensyn til kontrol. Det hele bunder i hvad man anbringer i while løkken.
AFAIK kan man ikke lave parallel programmering i Javascript, så mens while løkken kører vil eksekveringen af resten af scriptet ikke fortsætte.
Håber ikke det her er ren volapyk.
Avatar billede stringbuffer Nybegynder
06. oktober 2003 - 09:37 #6
Tjah, man kan godt sætte en funktion til at køre asynkront med setTimeout eller setInterval, så det går nok...

Det, der bekymrer mig mest, er om det virker i både Mozilla og IE5+
Avatar billede stringbuffer Nybegynder
06. oktober 2003 - 09:56 #7
Hvad angår metoden med iframe, så må jeg lige forklare:

Browseren viser en iframe og et script sætter dens src til min servers adresse.
Serveren svarer:

HTTP/1.1 200 OK
Content-Type: text/html
Date: <et eller andet her...>
Transfer-Encoding: chunked

xxx
<html><head>
<script type="text/javascript"><!--
funtion f()
{
  var e;
  while (e = document.getElementsByTagName("P")[0])
  {
    var s = e.innerHTML;
    status = s;
    e.parentNode.removeChild(e);
  }
}
setInterval("f()", 500);
// --></script>
</head><body>

yyy
<p>Linie 1</p>

yyy
<p>Linie 2</p>

I iframe ser det ud som om der kommer en ny linie af og til og bliver "spist" og ses i statuslinien.

Hvis bare jeg kunne kalde en funktion i parent window, ville det løse problemet.
Avatar billede =maddog= Nybegynder
06. oktober 2003 - 11:36 #8
du ville gøre livet lettere for dig selv hvis du afsluttede <body> og <html>
<html>
<head>
<script>
window.setTimeout(function(){alert(document.getElementsByTagName("P").item(1).innerHTML);},100);
</script>
</head>
<body><p>Lidt BODY</p></body>
</html>

<p>udenfor</p>

... if you get my drift.
Avatar billede stringbuffer Nybegynder
06. oktober 2003 - 12:21 #9
Det forbyder HTML standarden jo... det andet er derimod principielt lovligt nok sålænge det ikke er loadet færdigt.
Avatar billede =maddog= Nybegynder
06. oktober 2003 - 12:57 #10
nej. så længe der ikke er </body> og </html> vil siden heller ikke validere.
Avatar billede stringbuffer Nybegynder
06. oktober 2003 - 16:45 #11
Siden vil ikke validere FØR siden er loadet, men det er helt legalt at sende dokumentet i chunks og browseren kan jo sagtens fortolke det løbende. Scripts vil jo også eksekvere før siden er loadet, så browseren fortolker åbenbart dokumentet løbende.
Avatar billede =maddog= Nybegynder
06. oktober 2003 - 16:48 #12
under alle omstændigheder får du fat i document objektet i en iframe med
document.getElementById("myiframe").contentWindow.document;
fra den omsluttende side.
Avatar billede stringbuffer Nybegynder
06. oktober 2003 - 22:25 #13
Det virker i IE, men ikke i Mozilla.
Avatar billede =maddog= Nybegynder
07. oktober 2003 - 02:19 #14
hvilken version af Mozilla? Fra og med 0.92 er contentWindow understøttet.
prøv
onload = function() {
    iframe = document.getElementById("myiframe");
    i_document = (iframe.contentWindow)?iframe.contentWindow.document:iframe.contentDocument;
    alert (i_document);
}
Avatar billede stringbuffer Nybegynder
07. oktober 2003 - 21:37 #15
Version 1.3
Er der nogen måde at lave script fejlfinding i Mozilla?
Avatar billede stringbuffer Nybegynder
07. oktober 2003 - 22:36 #16
Nu er jeg begyndt at tvivle på hele ideen.
Oprindeligt ville jeg lave det med iframe fordi jeg pt. bruger en Java applet til at modtage ren tekst fra en server. For at gøre det med andet end URLConnection o.l. skal det gøres på en port over 1024, og det er der visse "firewalls", der ikke tillader. Men løsningen er måske at lave det som en applet med URLConnection og køre den op mod en fake HTTP-server. På den måde løser jeg problemet med porte og sikkerhed samt parallelprogrammering i JS.
Avatar billede =maddog= Nybegynder
08. oktober 2003 - 04:33 #17
Hvis du i forvejen har en åben connection med en applet synes jeg det vil være nærliggende også at streame gennem den når proppen alligevel er af.
Langt henne af vejen er den største omkostning ved at anvende appletter og java i det hele taget at det tager så lang tid for JVM at initialisere
Avatar billede stringbuffer Nybegynder
08. oktober 2003 - 20:25 #18
Det med initialiseringen er lidt ligemeget, for jeg kan bare lægge appleten på en side eller to før den, hvor den skal bruges. Så er JVM'en oppe at køre og min applet allerede indlæst.

Hvad der er det største problem er "sikkerhed" i Java, der giver mig hovedpine.

Nu en helt tredje ting: når man såden "streamer" med HTTP, kan det mon give issues når nogen kører med proxy-server?
Avatar billede stringbuffer Nybegynder
13. oktober 2003 - 22:15 #19
Argh. Der er åbenbart ikke noget at gøre, Mozilla er som sædvanligt pissekonservativ og tillader ikke en smule kreativitet. MSIE er derimod for syg mht. dens manglende understøttelse af Java fra JavaScript.

Jeg må bare droppe idéen med at streame over HTTP eller vente til teknologierne bliver mere fleksible.

Lukker her, hvis du gerne ville have postet et svar kan du lige sige til, så finder vi ud af noget.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester