Avatar billede tberte1 Nybegynder
01. november 2005 - 13:52 Der er 41 kommentarer og
1 løsning

Frames og javascript

Hej

Jeg skal bruge en framet side a la

<HTML>
<HEAD>
<TITLE>This is a frameset with OBJECT in the HEAD</TITLE>
</HEAD>
<FRAMESET rows="*,200">
<FRAME src="http://thomasbertelsen.dk" name="tb">
<FRAME src="testen.html">
</FRAMESET>
</HTML>

hvor jeg så ønsker at kunne tilgå forskellige proberties i frame "tb" fra den anden frame via en function der evt kunne se ud som følger

function test() {
alert(parent.tb.location.href);
}

men jeg bliver ved med at få "access denied" fejl. Er der en måde man kan omgåes det????

Håber at problemet er til at forstå :-)
Avatar billede olebole Juniormester
01. november 2005 - 13:57 #1
<ole>

Nej, Gud være lovet kan du ikke omgå det  :)
Du kan kun scripte mellem frames, hvis de dokumenterne ligger under samme domæne

/mvh
</bole>
Avatar billede tberte1 Nybegynder
01. november 2005 - 13:59 #2
Der må da være en måde, hvorpå jeg kan få fat i information der ligger i et dokument under et andet domæne??
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:03 #3
Jeg ved godt at jeg selvfølgelig ikke kan komme til at manipule det andet dokument, men man kan vel læse det?
Avatar billede olebole Juniormester
01. november 2005 - 14:10 #4
- nej
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:12 #5
Hvordan fungerer google robotterne så f.eks. de har jo ingen problemer med at hente indholdet af en side.
Avatar billede olebole Juniormester
01. november 2005 - 14:20 #6
De er jo ikke skrevet i JavaScript - og kører ikke i en browser  ;o)
Avatar billede olebole Juniormester
01. november 2005 - 14:22 #7
- hvis du skal læse noget i et dokument under et andet domæne, må du gøre det i et eller andet serversprog - afhængigt af, hvad din server understøtter
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:22 #8
nej nej... men det må vil være muligt at skrive et javaprogram eller lignende som kunne løse problemet
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:24 #9
ok...det drejer sig vil bare om sende en http request efter dokumentet, og så læse svaret ikke sandt... så må jeg jo bare finde ud af hvordan jeg gør det i praksis
Avatar billede olebole Juniormester
01. november 2005 - 14:25 #10
Hvad er det, der får dig til at mene, at det absolut skulle være muligt?
Jeg ved ikke helt, hvad det er, du ikke kan forstå ... men nej, man kan ikke skrive noget i JavaScript (som iøvrigt intet har med Java at gøre), der kan læse indholdet i et dokument under et andet domæne.
Avatar billede olebole Juniormester
01. november 2005 - 14:26 #11
Der krydsede vi beskeder  :)
Jo, på  serveren kan du lave en HTTP-request og læse indholdet
Avatar billede olebole Juniormester
01. november 2005 - 14:27 #12
Hvad har du adgang til at bruge på serveren?
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:27 #13
ok.... det sidder jeg lige og nørder lidt med. Bare gi' et svar, så får du lidt point
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:28 #14
PHP
Avatar billede olebole Juniormester
01. november 2005 - 14:30 #15
I princippet kan du gøre noget à la:

$str = file_get_contents("http://www.google.dk");
print $str;

- men hvad du så vil stille op med strengen, ved jeg jo ikke  :)
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:34 #16
klasse... lige hvad jeg havde brug for
Avatar billede alaflam Nybegynder
01. november 2005 - 14:37 #17
det var dog mærkeligt, at du prøver på at lave det samme som mig måske :)

Jo du kan godt få indholdet af en anden hjemmeside uden nogen problemer ved at bruge ajax eller PHP.

php gøre det lidt langsomt, da alt requests sker på serveren.
ajax gøre det lokalt fra din browser, som er meget hurtigere.

hvad skal du lave med indholdet ?
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:39 #18
det skal bare skrives i min database
Avatar billede olebole Juniormester
01. november 2005 - 14:40 #19
alaflam >> Nej, 'screen-scraping' har intet med AJAX at gøre - og at en applikation gør brug af XmlHttpRequests, gør den ikke nødvendigvis til en AJAX-applikation  :)

tberte1 >> Fint ... fænomenet kaldes som sagt 'screen-scraping' - og du skal naturligvis være bevidst om ophavsrets regler, når du bruger den slags  ;o)
Avatar billede tberte1 Nybegynder
01. november 2005 - 14:44 #20
ja ja det er slet ikke sådan noget... jeg skal bare kopiere lagerstatus fra min leverandør over i min egen db. Min leverandør evner af en eller anden grund ikke at give et dump af hans db
Avatar billede alaflam Nybegynder
01. november 2005 - 14:59 #21
det du gerne vil have er en bare noget tekst lagerstatus som ligger på en anden side, så jeg kan ikke se noget galt med at bruge xmlhttprequests object eller php til at trække det ud på den måde.
Avatar billede olebole Juniormester
01. november 2005 - 15:26 #22
Ja, en fiks feedfil hos ham ville jo være noget lettere at have med at gøre  :o|
Hvor mange dokumenter skal du suge fra?
Avatar billede tberte1 Nybegynder
01. november 2005 - 15:28 #23
Jeg skal hente fra noget der ligner 5000 dokumenter
Avatar billede alaflam Nybegynder
01. november 2005 - 15:31 #24
olebole, ikke for noget, men jeg har flere gange spurgt om ting også svarede du med det var ulovligt, det bliver lidt irreterende nogen gange for så kommer der ingen andre og svar måske er hensigten ikke som du tænker :P

anyway,

5000 dokumenter er nok meget :P brug istedet for noget windows application for det.
Avatar billede tberte1 Nybegynder
01. november 2005 - 15:35 #25
ja det kan godt være at det var bedre, men det har jeg bare ikke rigtig nogen erfaring i at lave. Så det bliver nok i PHP
Avatar billede olebole Juniormester
01. november 2005 - 15:54 #26
alaflam >> hvis valget står mellem, at folk snylter ulovligt på andres arbejde - og at du bliver irriteret, er valget ganske ligetil. Med det ocean af spørgsmål forskellige platugler i tidens løb har oprettet på Eksperten, er det kun naturligt, man automatisk gør opmærksom på, at folk (måske endda uforvarende) risikerer at overtræde lovgivningen ... specielt, når man ikke ved, hvad det skal bruges til.

At screenscrape og bruge noget, andre har ophavsret til, er imod loven ... og det har jeg ikke lyst til at hjælpe med.
At hjælpe med kode til den slags er endvidere imod E's regler og medfører tab af bruger ... det har jeg heller ikke lyst til.

Hvis du i nogle spørgsmål ikke har forklaret, hvad det skal bruges til - og det lugter af noget ulovligt - er det min forbandede pligt at gøre opmærksom på det, så andre, der måske ikke tænker sig om, afholder sig fra at hjælpe. Har du problemer med det, må du jo bare forklare, hvad det er, du har gang i  :)

Hvis det er min yderst forsigtige kommentar i (01/11-2005 14:40:56), der destabilliserer dit humør, tror jeg nu nok, du trænger til at skifte bind  :)
Avatar billede tberte1 Nybegynder
01. november 2005 - 16:01 #27
LOL
Avatar billede tberte1 Nybegynder
01. november 2005 - 16:02 #28
har du fået dine point? "accepter" knappen bliver ved med at være der ligemeget hvor mange gange jeg klikker :-?
Avatar billede tberte1 Nybegynder
01. november 2005 - 16:02 #29
nu skete der noget :-)
Avatar billede olebole Juniormester
01. november 2005 - 16:03 #30
Det er fordi, jeg indtil nu kun har lagt kommentarer - men her lægger jeg et svar  ;o)
Avatar billede olebole Juniormester
01. november 2005 - 16:05 #31
Tak for points  :)
Avatar billede olebole Juniormester
01. november 2005 - 18:19 #32
Kom lige i tanker om, at du kunne lave en HyperText Application (HTA), der kunne køre skidtet for dig om natten, så du ikke belaster din server - og belaster din leverandørs mindst muligt:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <HTA:APPLICATION ID="MyApp"
    APPLICATIONNAME="MyAppName"
    VERSION = "0.1-Alpha"
    CAPTION = "yes"
    ICON = "ikon.ico"
    BORDER = "thick"
    SHOWINTASKBAR = "yes"
    SINGLEINSTANCE = "yes"
    MAXIMIZEBUTTON = "no"
    NAVIGABLE = "yes"
    WINDOWSTATE = "normal">
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>My Application</title>
<style type="text/css">
body, html {
    height: 100%;
    margin: 0;
    background: buttonface;
}
#bar {
    width: 90%;
    margin: 12px auto;
    height: 400px;
    font: 12px tahoma, sans-serif;
    display: block;
}
#foo {
    display: none;
}
</style>
<script type="text/JavaScript">
var urls = ["http://www.eksperten.dk/spm/660920", "http://www.eksperten.dk/spm/660907", "http://www.eksperten.dk/spm/660873"];
var inx = 0;

function startLeech() {
    var oHttp = new ActiveXObject("Msxml2.XMLHTTP");
    oHttp.onreadystatechange = function(){writeToArea(oHttp)};
    oHttp.open("get", urls[inx], true);
    oHttp.send();
    inx++;
}
function writeToArea(o) {
    if (o.readyState!=4) return;
    var cont = document.getElementById("foo");
    // Skriv dokumentets body-indhold ind i et skjult div,
    // - så vi kan bruge DOM til at hente elementernes indhold:
    cont.innerHTML = o.responseText.match(/<body[^>]*>([\w\W]*)<\/body[^>]*>/i)[1];
   
    // Her læser jeg f.eks. overskriften på spm'et,
    // - som ligger i et link i første <h1> tag:
    bar.value += cont.getElementsByTagName("h1")[0].getElementsByTagName("a")[0].innerHTML + "\n";
   
    if (inx<urls.length) startLeech();
    else bar.value += "\n------------------------------\n\nFærdig";
}

// Hvis siderne, vi henter, indeholder scriptkald,
// - må vi hellere disable fejlmeldinger, der ellers stopper alt:
window.onerror = function(){return true};
</script>

</head>
<body>
<button onclick="startLeech()">START</button>

<textarea id="bar"></textarea>

<div id="foo"></div>

</body>
</html>

Kald filen for et eller andet - med extension '.hta'. Du kan læse mere om HTA her:
    http://msdn.microsoft.com/library/default.asp?url=/workshop/author/hta/hta_node_entry.asp

- kort fortalt er det en specialinstans af IE med specielle sikkerheds indstillinger, der bl.a. gør´X-domain scripting mulig. Her har jeg dog valgt at bruge XMLHttpRequests.
En anden fordel er, at vinduet ikke kan overtages, hvis du f.eks. klikker på et link i Outlook eller dobbeltklikker på en henvisning. Det er nemlig ikke en squid sjovt, når man har hentet data fra 4.950 dokumenter  ;o)
Det ligner og føles som en alm. Win-applikation - selvom den er skrevet i ren HTML/JS.

Idéen er, at du bladrer et array med URL'er igennem og kalder dokumenterne (det kan selvfølgelig også være et array af side-ID'er eller andre query-strenge, der sættes sammen med en fast URL).
Når XML-objektet vender tilbage med sideindholdet, skrives body-delen ind i et skjult div. Så kan vi nemlig søge blandt elementerne og hente det relevante indhold ud ... den del står du selv for, da jeg jo ikke kender de aktuelle dokumenters DOM-opbygning  :)

De fundne data banker du så ind i et textarea, hvorfra du kan kopiere dem, når skidtet er færdigt.

Jeg henter - og indskriver - blot spørgsmålets overskrift, men det var tanken, at du kunne skrive dataene ind i en SQL-streng, så du kan paste hele skidtet direkte ind i en SQL-fil og afvikle den som et alm. DB-dump.

Test filen, så kan du se, hvad jeg mener  ;o)
Avatar billede tberte1 Nybegynder
02. november 2005 - 09:29 #33
Det virker jo helt fantastisk, og er en del mere elegant end den løsning jeg havde gang i.

Nu har jeg kun et lille problem tilbage, som jeg håbede du også gad hjælpe med.

Kan man på en eller anden måde få hta programmet til at logge ind på den side der skal udføres 'screen-scraping' fra. Login funktionen fungerer ganske normalt ved at brugernavn og kode postes til en side og man får en cookie retur.

Er det noget der kan lade sig gøre? Jeg kan godt oprette et nyt spørgsmål så der kommer flerer point i spil?
Avatar billede olebole Juniormester
02. november 2005 - 09:47 #34
Jeg vil tro, du kan lægge en iframe i - eller poppe en popup fra - applikationen. I den loades login-dokumentet, som du udfylder som normalt og submitter. Når du er logget ind, lukker du vinduet og trykker på startknappen.
Derved skulle du få sat kagen, som jo burde blive hos dig og tillade dine efterfølgende XmlHttpRequests  :)

Du kan prøve med en ekstra knap:
    <button onclick="myLogIn()">LogIn</button>

- og så noget:

function myLogIn() {
    var w = window.open("http://www.domain.dk/login.asp", "logIn", "width=400,height=250");
    w.focus();
}
Avatar billede olebole Juniormester
02. november 2005 - 09:48 #35
- og de 60 points er rigeligt ... uanset, om vi får login til at virke eller ej  ;o)
Avatar billede tberte1 Nybegynder
02. november 2005 - 10:10 #36
Det virker squ med en iframe.... det er helt kanon. du har lige sparet mig for mange timers arbejde
Avatar billede olebole Juniormester
02. november 2005 - 10:15 #37
Så kunne du jo lave noget à la:
  <button onclick="startLeech();document.getElementById('myFrame').style.display='none'">START</button>

- så gemmer du iframe'en (hvis den altså har id="myFrame"), når du sætter suge-scriptet igang  :)
Avatar billede alaflam Nybegynder
02. november 2005 - 10:21 #38
Hvad hvis der kommer rigtige mange oplysninger, fryser IE ikke eller går i stå :)

det er 5000 dokumenter!
Avatar billede tberte1 Nybegynder
02. november 2005 - 10:28 #39
det ved jeg ikke. har kun testet det på en mindre del indtil videre
Avatar billede olebole Juniormester
02. november 2005 - 11:15 #40
Jeg tvivler meget på, den går ned - men man kunne jo prøve at suge 5.000 sider på Eksperten med:
    http://www.eksperten.dk/spm/
- efterfulgt af tal fra 655883 til 660883 hentet fra en løkke. Men nu, vi har den fremme, har jeg faktisk glemt at slette objektet igen - og det giver zq nok en slem gang memory-leak  =8-O

function writeToArea(o) {
    if (o.readyState!=4) return;
    var cont = document.getElementById("foo");
    // Skriv dokumentets body-indhold ind i et skjult div,
    // - så vi kan bruge DOM til at hente elementernes indhold:
    cont.innerHTML = o.responseText.match(/<body[^>]*>([\w\W]*)<\/body[^>]*>/i)[1];
   
    // Her læser jeg f.eks. overskriften på spm'et,
    // - som ligger i et link i første <h1> tag:
    bar.value += cont.getElementsByTagName("h1")[0].getElementsByTagName("a")[0].innerHTML + "\n";
    o = null; // Her sletter vi objektet igen
    if (inx<urls.length) startLeech();
    else bar.value += "\n------------------------------\n\nFærdig";
}

- så burde det være OK  :)
Avatar billede olebole Juniormester
02. november 2005 - 11:16 #41
- denne linje er det eneste, jeg har tilføjet:
    o = null; // Her sletter vi objektet igen
Avatar billede tberte1 Nybegynder
02. november 2005 - 11:44 #42
ok
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