Wie kann ich in JS textfiles lesen, die sich nicht auf dem Rechner des Anwenders befinden? Also konkret in etwa dort, wo sich auch die html-seite befindet. MDN sagt dazu nichts, außer dass dazu derzeit keine Information zur Verfügung steht.
Ich gehe davon aus, dass du eine Website entwickelst (also kein server-seitiges JS hast). Du müsstest hier einen Server bereitstellen, welcher JSON-Ajax-Requests annimmt, also den Dateiinhalt JSON-Codiert und an dein Script sendet. ZB. in PHP:
Code:
echo json_encode(array("data"=>file_get_contents(Pfad zur Datei)));
Du musst bei Ajax auf die Same origin policy achten (welche man auch bedingt abstellen kann). Außerdem macht JQuery Ajax-Requests meiner Meinung nach wesentlich einfacher zu handhaben, da man sich nicht mit den einzelnen Browsern herumschlagen muss (http://api.jquery.com/jQuery.ajax/).
Code:
$.ajax({
url : "http://DeineURL",
type : "GET",
dataType : "json",
data : data,
success : callback,
error: errCallback,
crossDomain : true
});
Die Methode callback enthält dann als ersten Parameter das JSON Object
Ajax ist nur eine Technik die darauf aufbaut. JSON ist ein Datenformat welches vom Browser sehr schnell gelesen werden kann (schneller als XML) und gerne verwendet wird um dynamsiche Daten nachzuladen.
Ich gehe davon aus, dass du eine Website entwickelst
Korrekt.
Zitat:
Du musst einfach einen HTTP-Request in JavaScript machen.
dazu hätte ich jetzt einige weitere Fragen. Momentan sieht das ganze (gekürzt) etwa so aus:
Code:
var delay = 0;
function loadText(filename, target) {
var xmlHttp = null;
++delay;
//...
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
--delay;
if (delay === 0) {
target = xmlHttp.responseText;
draw();
}
}
}
dass das so nicht funktionieren kann, ist klar. 1) müsste target ein out parameter sein (geht sowas in JS? wie?) ([s]notfalls kann ich natürlich auch zur Laufzeit den Funktionstext anpassen[/s] nein, geht nicht, weil target (also die variable auf die es verweisen sollte) nicht im scope liegt) 2) schätze ich, wird delay nicht im scope sein (wobei ich daraus einfach nur eine globale Variable machen müsste, wenn’s stimmt).
Ich glaube dir ist nicht ganz klar was mit xmlHttp.onreadystatechange passiert. Es handelt sich da um eine Callback-Funktion. Diese wird aufgerufen, sobald die Antwort zum Request vom Server kommt. Du solltest NICHT die Skriptausführung blockieren solange du wartest! Dann wird potentiell der ganze Browser hängen oder zumindest der entsprechende Tab im Browser. Einige Browser (z.B. Firefox) killen auch deinen JavaScript-Code , wenn er zu lange braucht!
=> Also ein loadText wie du es haben willst ist eine schlechte Lösung für einen asynchronen Vorgang.
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Coolcat hat geschrieben:
Ich glaube dir ist nicht ganz klar was mit xmlHttp.onreadystatechange passiert. Es handelt sich da um eine Callback-Funktion. Diese wird aufgerufen, sobald die Antwort zum Request vom Server kommt. Du solltest NICHT die Skriptausführung blockieren solange du wartest! Dann wird potentiell der ganze Browser hängen oder zumindest der entsprechende Tab im Browser.
Mal abgesehen davon das JS immer Single Thread ist und das callback niemals ausgeloest werden wuerde.
Achja noch ein Tipp: manche Browser (BIRNE) halten sich nicht an den Standard und fordern ein Explizites "Cache-Control: no-cache, must-revalidate"
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
yunharla hat geschrieben:
Achja noch ein Tipp: manche Browser (BIRNE) halten sich nicht an den Standard und fordern ein Explizites "Cache-Control: no-cache, must-revalidate"
Wofür?
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Mo Nov 08, 2010 18:41 Beiträge: 769
Programmiersprache: Gestern
Lord Horazont hat geschrieben:
yunharla hat geschrieben:
Achja noch ein Tipp: manche Browser (BIRNE) halten sich nicht an den Standard und fordern ein Explizites "Cache-Control: no-cache, must-revalidate"
Wofür?
Ich hatte ohne das Problem das er sich selbst solche Sachen wie 404 ( ) gemerkt hat.... gibt also ne ganze Reihe von möglichen Problemen. Kam damals mit I-Schrott 6 <.<
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist doch auch (teilweise) erlaubtes Verhalten, laut HTTP spec:
RFC 2616, Section 13.2.2 hat geschrieben:
13.2.2 Heuristic Expiration
Since origin servers do not always provide explicit expiration times, HTTP caches typically assign heuristic expiration times, employing algorithms that use other header values (such as the Last-Modified time) to estimate a plausible expiration time. The HTTP/1.1 specification does not provide specific algorithms, but does impose worst-case constraints on their results. Since heuristic expiration times might compromise semantic transparency, they ought to used cautiously, and we encourage origin servers to provide explicit expiration times as much as possible.
Zusammen mit
RFC 2616, Section 13.1.1 hat geschrieben:
13.1.1 Cache Correctness
A correct cache MUST respond to a request with the most up-to-date response held by the cache that is appropriate to the request (see sections 13.2.5, 13.2.6, and 13.12) which meets one of the following conditions: […] 2. It is "fresh enough" (see section 13.2). In the default case, this means it meets the least restrictive freshness requirement of the client, origin server, and cache (see section 14.9); if the origin server so specifies, it is the freshness requirement of the origin server alone.
If a stored response is not "fresh enough" by the most restrictive freshness requirement of both the client and the origin server, in carefully considered circumstances the cache MAY still return the response with the appropriate Warning header (see section 13.1.5 and 14.46), unless such a response is prohibited (e.g., by a "no-store" cache-directive, or by a "no-cache" cache-request-directive; see section 14.9).
Ist es einem Client bei fehlenden Headern durchaus erlaubt, eine nicht-aktuelle Response zurückzuliefern, falls kein Last-Modified und/oder Expires und/oder ETag-Header gesetzt wurden. Wenn Last-Modified oder ETag gesetzt wurden, sollte nach einer gewissen Zeit revalidiert werden (aber auch nicht sofort, selbst mit must-revalidate nicht!)
404 darf man sich aber nicht merken:
RFC 2616, Section 13.4 hat geschrieben:
A response received with a status code of 200, 203, 206, 300, 301 or 410 MAY be stored by a cache and used in reply to a subsequent request, subject to the expiration mechanism, unless a cache-control directive prohibits caching. However, a cache that does not support the Range and Content-Range headers MUST NOT cache 206 (Partial Content) responses.
A response received with any other status code (e.g. status codes 302 and 307) MUST NOT be returned in a reply to a subsequent request unless there are cache-control directives or another header(s) that explicitly allow it. For example, these include the following: an Expires header (section 14.21); a "max-age", "s-maxage", "must- revalidate", "proxy-revalidate", "public" or "private" cache-control directive (section 14.9).
Ich hoffe ich hab nichts übersehen. Und ich mache jetzt auch schluss mit diesem off-topic . Hier nochmal die Referenz: RFC 2616.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Ach nein wirklich? Ich habe übrigens exakt das getan, was du im Post davor vorgeschlagen hast, nur dass ich den Text benutzen will und nicht in einem alert-Fenster ausgeben, was dazu führt, dass ich ihn in irgendeine variable schreiben muss. In Delphi zumindest würde dasselbe übrigens einwandfrei funktionieren, wären lokale Variablen wie in JS nachwievor verfügbar, wenn die Funktion fertig ist (und wenn es single-threaded ist, dann auch unter der Vorraussetzung, dass das Programm irgendwann idle t oder Application.ProcessMessages aufruft).
jetzt benutze ich ein Objekt (sinnvoller so, schätze ich), es funktioniert aber nachwievor nicht.
Code:
function TextFile(src) {
var xmlHttp = null;
this.text = "";
this.onfinished = function() {alert("onfinished was not initialized")}
try {
// Mozilla, Opera, Safari sowie Internet Explorer (ab v7)
xmlHttp = new XMLHttpRequest();
} catch(e) {
try {
// MS Internet Explorer (ab v6)
xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
} catch(e) {
try {
// MS Internet Explorer (ab v5)
xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
} catch(e) {
xmlHttp = null;
}
}
}
if (xmlHttp) {
xmlHttp.open('GET', src, true);
xmlHttp.onreadystatechange = function () {
if (xmlHttp.readyState == 4) {
this.text = xmlHttp.responseText;
this.onfinished(); //--------------------------------------------------------------------------------this.onfinished is not a function (wieso?)
}
};
xmlHttp.send(null);
}
}
übrigens, wieso wird ein Textfile beim Laden auf Syntaxfehler überprüft? Ist es so abwegig, dass ich in einem Textfile einfach Text habe?
Die Callback Funktion wird vom XMLHttp-Objekt aufgerufen und steht deshalb, anstatt deinem Objekt, in "this". (Das kannst du prüfen indem du einfach "console.log(this);" in die Callback Funktion schreibst ). Eine Möglichkeit wäre, das Objekt vorher zu sichern "xmlHttp.obj=this;" und dann "this.obj.onFinished()" in onreadystatechange aufzurufen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Das ist ein XMLHttpRequest… Ich habe zweifel, dass du dem das interpretieren als XML abgewöhnen kannst… Also gieß deinen Text doch einfach in ein XML-Dokument mit einer Node, die nur Text enthält.
grüße
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: 0 Mitglieder und 11 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.