Gibt es bei Verwendung von <script type="text/plain" src="http://..."></script>, bei dem sich die URL auf eine Nur-Text-Datei bezieht, eine Möglichkeit, auf den Inhalt der Datei in JavaScript zuzugreifen? Die Datei wird an den Browser übertragen, aber der Wert der Eigenschaft innerHTML des Elements script wird nicht geändert (es bleibt die leere Zeichenfolge). Das Überprüfen des Elementknotens im DOM scheint keine Eigenschaft aufzudecken, über die der empfangene Inhalt gefunden werden konnte.

Ich weiß, dass XMLHTTPRequest stattdessen verwendet werden kann, aber ich interessiere mich für das Problem, warum Browser Daten auf die von mir beschriebene Weise abrufen, aber keinen Zugriff darauf zu bieten scheinen.

20
Jukka K. Korpela 6 Okt. 2012 im 18:53

4 Antworten

Beste Antwort

Zunächst ist das Attribut text des HTMLScriptElement die bevorzugte Methode, um auf den Text eines Inline-Elements <script> zuzugreifen. DOM-Level- 2 und HTML5: 4.11.1 beide geben an, dass ein Skript ein Attribut text haben sollte, das den Skriptinneren text enthält:

Das IDL-Attribut text muss eine Verkettung des Inhalts aller Textknoten, die untergeordnete Elemente des Elements script sind (wobei alle anderen Knoten wie Kommentare oder Elemente ignoriert werden), in Baumreihenfolge zurückgeben. Bei der Einstellung muss es sich wie das IDL-Attribut textContent verhalten.

Da das Element <script> leer ist (Sie haben eine externe Quelle angegeben), sind text, textContent und innerHTML leer. Dies liegt daran, dass das Attribut text nur in Inline-Skripten festgelegt wird:

Wenn das Skript inline ist und der Typ des Skriptblocks eine textbasierte Sprache ist:

Der Wert des IDL-Attributs text zum Zeitpunkt des letzten Setzens des Flags "bereits gestartet" des Elements ist die Skriptquelle.

Daher ist es mit dieser Methode nicht möglich, ein externes text/plain einzuschließen.

Siehe auch:

  • W3C: HTML5: 4.11. 1 Das Skriptelement: Textattribut und das Beispiel für die Spielkarte:
     <script src="game-engine.js"></script> <!-- game engine isn't inline -->
    <script type="text/x-game-map"> <!-- but data needs to be inline -->
    ........U.........e
    o............A....e
    .....A.....AAA....e
    .A..AAA...AAAAA...e
    </script>
     
10
Zeta 11 Sept. 2015 im 16:28

Ja, nein, ich glaube nicht, dass Sie den Textinhalt so bekommen können. Dies liegt hauptsächlich daran, dass Sie Dom-Zugriffselemente verwenden, um Text zu erhalten, der nie wirklich in den Dom selbst eingefügt wurde.

Ich habe ein paar Optionen ausprobiert und sie haben nicht funktioniert. Ich habe keinen soliden Grund, warum Sie es nicht finden können, aber der Grund, warum ich so aufgebe / denke, ist, dass selbst der von mir verwendete WebKit-Inspektor keine Dreiecksoffenlegung hat neben einem script-src-tag. Es konvertiert den src in einen Link, auf den Sie klicken können, und verwendet dann Ajax oder was auch immer, um diesen Text vom Server zurückzulesen.

0
Mutahhir 6 Okt. 2012 im 15:07

Beachten Sie, dass wenn dies unterstützt würde, dies eine große Sicherheitslücke und eine Möglichkeit bieten würde, Cross-Site-Scripting-Schutz zu umgehen, der JSON und andere Daten schützt. Im Wesentlichen könnte meine böse Webseite (z. B. nasty.com) auf Ihre privaten Daten zugreifen, die durch Cookies geschützt sind, indem Sie sie mithilfe eines Skript-Tags laden. z.B.

<script type="text/plain" 
       src="https://supersecure.com/youraccount/privatedocs/list"/>

Da die Cookies für supersecure.com automatisch mit der Anfrage gesendet werden (wie dies bei der Anforderung von Ressourcen der Fall ist), gibt die sichere Site nur die Daten (z. B. die Liste der privaten Dokumente) zurück, da die Anfrage nicht einfach voneinander getrennt werden konnte von einem von einer Ajax-Anfrage von seiner legitimen Webseite. Diese Lücke existiert bei Ajax nicht, da der Browser dank derselben Ursprungsrichtlinie einfach verhindert, dass eine Seite von nasty.com eine Ajax-Anfrage an supersecure.com sendet.

Offensichtlich gibt es kein Sicherheitsproblem mit Inline-Daten.

7
TomW 6 Nov. 2013 im 10:48

Nachdem ich mehrere Tage lang dieselbe Frage recherchiert hatte, fand ich mehrere Verweise auf den folgenden Code:

<html>
<head>
  <script type="text/javascript">
    function init() {
      var extText = window.frames.messageTxt.document.body.lastChild.lastChild.data;
      extText = extText.replace(/[\r\n]/g, " ");
      document.forms[0].nMessage.value = extText;
    }
    window.onload = init;
  </script>
</head>
<body>
  <iframe name="messageTxt" src="txtData.txt" style="display:none"></iframe>
  <form>
    <textarea name="nMessage"></textarea>
    <input type="button" value="click" onClick="init()">
  </form>
</body>
</html>

Der obige Code greift tatsächlich auf die Datei txtData.txt zu (sofern vorhanden) und speichert sie als Standardtext in einem <textarea>. Aus irgendeinem Grund wird in keiner der obigen Antworten erwähnt, dass dies funktioniert. Ich gehe davon aus, dass die Frage das <src> -Tag spezifisch impliziert (für eine ähnliche Technik ist sie möglicherweise nicht verfügbar; ich habe sie nicht überprüft). Ich denke jedoch immer noch, dass es erwähnenswert ist, anzunehmen, dass Ihre Abfrage sich auf die allgemeinere Frage bezieht, eine externe TXT-Datei zu erhalten (oder wenn jemand, der auf diese Seite stößt, die Antwort dieser Frage sucht), hauptsächlich, weil ich Stunden damit verbracht habe, sie zu recherchieren Daher halte ich es für plausibel, dass die Antwort einfach schwer zu liefern war.

4
Franklin Yu 8 Aug. 2018 im 21:42