2012-01-26 3 views
4

witthファイルが含まれています。JavascriptのAJAXは、私が</p> <p>1) HTMLドキュメントがあるとはeval

2) このHTMLドキュメントをロードこのようなJavascriptのファイル "code.js":

<script src="code.js"> 

3) ユーザーは

、 "code.js" の "なFetchData" 機能を実行するボタンをクリックします

4) "なFetchData" 機能は、次のようになります。

var xmlhttp = new XMLHttpRequest(); 
xmlhttp.onreadystatechange = function() { 
    if (xmlhttp.readyState==4) { 
     myjsdata = xmlhttp.responseText; 
    } 
} 
xmlhttp.open("GET", 'http://www.example.com/data.js', false); 
xmlhttp.send(null); 

...

今どのように私は成功し、次のんでください:

私はそう「なFetchData」および/上下に定義関数を含む「code.js」のすべての機能を利用することができ、途中に挿入/ evalの私のJavascriptをしたいです"data.js"内のデータ(構造体、宣言、事前に計算されたデータ値など)

(これが可能だった場合、ユーザーが明示的に要求するまで、私は、実際のJSデータファイルをロード待つ可能性があるので、それはアイデアだろう。)

+0

jQueryを使用していますか、それとも特別な理由はありませんか?それは、ajaxコールのようなものを大幅に助けることができるので、読んだ状態とステータスをチェックする必要はありません。 – mowwwalker

答えて

10

jQueryのは、常にすべてのために何かを持っています

http://api.jquery.com/jQuery.getScript/

urlからjavascriptファイルを読み込んで、グローバルコンテキストで実行します。

編集:あなたはjQueryを使用していないことを確認できませんでした。誰もが常にjQueryのを使用している...

ちょうど行います

var scrpt = document.createElement('script'); 
scrpt.src='http://www.example.com/data.js'; 
document.head.appendChild(scrpt); 
+0

ありがとう!したがって、Ajax/relatedを使用する代わりに、 "code.js"でコードを使用できます。 "code.js"内の関数は、 "data.js"内で定義されたすべての変数などに即座にアクセスできますか?私は今試してみます:) – Tom

+0

@Tom、はい、ヘッドにスクリプト要素を追加して実行します。 – mowwwalker

+3

"ステップ1:jQueryを使用している場合は、getScript関数を呼び出します。ステップ2:jQueryを使用していない場合は、jQueryを使い始め、ステップ1に戻ります。 – Malvolio

2

これは、多くの要因に依存するが、ほとんどの場合、あなたは1で、コード/ HTML/CSSのすべてをロードしたいと思うでしょう座っている。要求が少なくて済むので、知覚されるパフォーマンスが向上します。コードファイルが数メガバイトを超えていない限り、ユーザーがコードファイルを要求するときにコードファイルを読み込む必要はありません。

innerHTMLを変更してevalでスクリプトを実行することは、それぞれ非常に面倒で危険です(それぞれ)。多くのオンラインリファレンスがこの点を裏付けています。ライブラリがこのようなことを行っているからといって、実行するのが安全だと仮定しないでください。

つまり、外部のjsファイルをロードして実行することは完全に可能です。 1つの方法は、新しく作成されたスクリプトタグにすべてのコードを貼り付けることです。 eval関数呼び出しでコードを実行してみることもできます(ただし、これはお勧めしません)。

address = "testscript.js"; 

var req = (window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("Microsoft.XMLHTTP"); 
if(req == null) { 
    console.log("Error: XMLHttpRequest failed to initiate."); 
} 
req.onload = function() { 
    try { 
     eval(req.responseText); 
    } catch(e) { 
     console.log("There was an error in the script file."); 
    } 
} 
try { 

    req.open("GET", address, true); 
    req.send(null); 

} catch(e) { 
    console.log("Error retrieving data httpReq. Some browsers only accept cross-domain request with HTTP."); 
} 
+0

事は私のdata.jsは200-500kbの間である。私は必要なときにロードするほうが好きです。しかし、 "eval"はコードをスコープ/宣言順にどこに置くのですか?私はただ "eval"と呼ぶ必要があり、すべての関数/ vairablesなどはすぐに利用できますか? – Tom

+0

そして理論上はデータファイルのサイズに上限はありません...もし人々がそれで大丈夫だったら*もっと*大きなラガーかもしれません...しかし、今のところ私は「サイズと時間の最小化」の考え方で動作します:) – Tom

+0

'eval'は私が信じるグローバルスコープで実行されます。それは本当に外国のスクリプトを実行するのは簡単です、それはなぜそれがとても危険です。 –

5

は、私はあなたがthis site

を見てみるべきだと思います(例で)動的ロードとコールバックについては、このサイトの話 - それはロードした後、あなたがロードされたスクリプト内の関数を呼び出すことができます。いいえjquery、ちょうど純粋なJS。

+0

それは良い参考資料です。 –

+0

"Load Completionの検出"に記載されている両方の方法を使用すると、IE、FF、Opera、Chromeの最新バージョンで、残りの問題を実際に解決しました。ありがとう:) – Tom

+0

This完璧に働いた。私はjQueryをロードしようとしていたので、jQueryをロードするためにjQueryを使用する必要はありませんでした。 – trusktr

関連する問題