2012-10-06 1 views
18

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

代わりにXMLHTTPRequestを使うことができますが、ブラウザがなぜ私が記述した方法でデータを取得するのかという問題に興味がありますが、アクセスを提供していないようです。

+0

すべてのコンテンツをロードしてから試してみることを正しくお待ちしていると仮定します。 – Mutahhir

+0

ブラウザはコンテンツを保持していないと思います。スクリプトが評価されると、ソースはもはや必要なくなり、メモリを浪費してしまいます。 –

+1

興味深いことに、Chromiumは、タイプ属性がここにリストされているようにスクリプトとして解釈されないMIMEタイプである外部スクリプトリソースをダウンロードすることさえもしません[http://www.w3.org/TR/html5/the-script-element .html #scriptingLanguages]なぜ私はこのすべて[http://www.w3.org/TR/html5/the-script-element.html#the-script-block-s-source] – toofast1227

答えて

10

まず、HTMLScriptElementtext属性は、インライン<script>要素のテキストにアクセスするための好ましい方法です。

IDL scriptの子であるすべてのテキストノードの内容の連結を返す必要がありtext属性:DOM-Level-2HTML5: 4.11.1両方のスクリプトが内部テキストスクリプトが含まれている属性textを持つべきであることを示しています要素(コメントや要素などの他のノードは無視)をツリー順に並べ替えます。設定時には、IDL属性textContentと同じ方法で動作する必要があります。

<script>要素が空であるので、(あなたが外部ソースを指定)、texttextContentinnerHTMLは空です。 text属性のみインラインスクリプトで設定されているので、これは次のとおりです。

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

text IDL属性の値で、要素の「already started」フラグが最後に設定された時刻がスクリプトソースです。

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

も参照してください:

  • W3C: HTML5: 4.11.1 The script element: text attributeとゲームマップの例:これはサポートされていたならば、それは巨大なセキュリティホールを提供してしまうこと
    <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> 
    
+1

を実行するのだろうか?ロードされたコンテンツにアクセスする方法がないことは証明されていませんが、その可能性は非常に高くなります。そして、@ toofastが言及しているように、Chromeはそれを読み込むことさえできません。 –

0

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

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

6

注意jsonやその他のデータを保護するクロスサイトスクリプティング保護を回避する手段です。本質的に、私の厄介なウェブページ(nasty.com、say)は、スクリプトタグを使ってクッキーによって保護されている私的なデータにアクセスすることができます。例えば

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

supersecure.comためのクッキーは自動的に(すべてのリソースを要求するときにそうであるように)要求で送信されますので、安全なサイトはちょうどそれがcouldnするので(例えばプライベートドキュメントのリスト)データを返します。合法的なWebページからのajaxリクエストから離れてリクエストを簡単に伝えることはできません。この穴はajaxには存在しません。ブラウザは、同じ発信元ポリシーのおかげで、ブラウザがnasty.comのページからsupersecure.comへのajaxリクエストを単に防ぐことができるからです。

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

3

同じ質問を研究の数日後、私は次のコードにはいくつかの参照が見つかりました:

<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ファイルを入手するというより一般的な質問に優先していると主張する価値はあると思います(あるいは、このページに出くわした人が質問のアンサーを求めている場合)私はその答えが生み出すのは難しいと考えていました。

+0

あなたは正しいですが、私の質問はより一般的な問題を反映しています。また、iframeの使用は興味深いアプローチです(Chromeではローカルファイルでは機能しませんが、 HTML埋め込みの「Ajax light」のようなものです)。 'extText'への代入は、ここでテキストコンテンツを得るための最も重要なコードです。残りの部分は、私たちが何をしたいのかによって決まります。 –

関連する問題