web-dev-qa-db-ja.com

JavaScriptで<scripttype = "text / plain" src = ...>を介して取得したプレーンテキストコンテンツにアクセスするにはどうすればよいですか?

URLがプレーンテキストファイルを参照する<script type="text/plain" src="http://..."></script>を使用する場合、JavaScriptでファイルのコンテンツにアクセスする方法はありますか?ファイルはブラウザに転送されますが、innerHTML要素のscriptプロパティの値は変更されません(空の文字列のままです)。 DOMの要素ノードを調べても、受信したコンテンツを見つけることができるプロパティは明らかにならないようです。

代わりにXMLHTTPRequestを使用できることは知っていますが、ブラウザが説明した方法でデータをフェッチするのに、アクセスを提供していないように見えるという問題に興味があります。

19

まず、textHTMLScriptElementattributeは、インラインの<script>要素のテキストにアクセスするための推奨される方法です。 DOM-Level-2 および HTML5:4.11.1 どちらも、スクリプトが内部のスクリプトを含む属性textを持つ必要があることを示していますテキスト

IDL属性textは、script要素の子であるすべてのテキストノードのコンテンツの連結をツリー順に返す必要があります(コメントや要素などの他のノードは無視します)。設定時には、textContentIDL属性と同じように機能する必要があります。

<script>要素が空(外部ソースを指定した)であるため、texttextContent、およびinnerHTMLは空です。これは、text属性がインラインスクリプトでのみ設定されるためです。

スクリプトがインラインで、スクリプトブロックのタイプがテキストベースの言語である場合:

要素の「すでに開始されました」フラグが最後に設定されたときのtextIDL属性の値がスクリプトソースです。

したがって、このメソッドを使用して外部text/plainを含めることはできません。

参照:

  • W3C:HTML5:4.11.1スクリプト要素:テキスト属性 およびゲームマップの例:
    <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

これがサポートされている場合、それは巨大なセキュリティホールを提供し、jsonやその他のデータを保護するクロスサイトスクリプティング保護を回避する手段を提供することに注意してください。基本的に、私の厄介なWebページ(nasty.comなど)は、スクリプトタグを使用してロードすることにより、Cookieで保護されている個人データにアクセスできます。例えば.

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

Supersecure.comのCookieはリクエストとともに自動的に送信されるため(リソースをリクエストする場合と同様)、セキュアサイトはリクエストを簡単に区別できなかったため、データ(プライベートドキュメントのリストなど)を返すだけです。正当なWebページからのajaxリクエストからのものから。同じOriginポリシーのおかげで、ブラウザはnasty.comからのページがsupersecure.comにajaxリクエストを送信するのを単に防ぐため、この穴はajaxには存在しません。

明らかに、インラインデータにはセキュリティ上の問題はありません。

6
TomW

同じ質問を数日間調査した後、次のコードへの参照がいくつか見つかりました。

<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>

上記のコードは、実際にはtxtData.txtファイルにアクセスし(存在する場合)、デフォルトのテキストとして<textarea>にダンプします。何らかの理由で、上記の応答のいずれもこれが機能することを述べていません。質問は特に<src>タグを暗示しているように思われるためです(同様の手法が利用できない場合があります。チェックしていません)。ただし、クエリが外部の.txtファイルを取得するというより一般的な質問に関係していると仮定することは言及する価値があると思います(またはこのページに出くわした誰かがその質問の答えを探している場合)、主にそれを調査するのに何時間もかかったからですですから、答えを出すのが難しいのはもっともらしいと思います。

4

ええ、いいえ、そのようなテキストコンテンツを入手できるとは思いません。これは主に、domアクセス要素を使用して、dom自体に実際には挿入されなかったテキストを取得するためです。

いくつかのオプションを試しましたが、機能しませんでした。あなたがそれを見つけることができないという確かな理由はありませんが、私が諦めている/このように考えている理由は、私が使用しているWebKitインスペクターでさえ三角形の開示がないためですscript-srcタグの横。それが行うことは、srcをクリックできるリンクに変換し、Ajaxなどを使用してサーバーからそのテキストを読み戻すことです。

0
Mutahhir