2011-02-04 9 views
7

Javascriptのeval()と別のアプローチ(JQueryを使用してスクリプトタグを作成し、その要素をページに追加するなど)の違いを説明できるかどうかは疑問でした。eval()とスクリプトタグを追加するときのJavaScriptの違い

eval(somecode); 

これが関連しているが、ここではコンテキストの場合
$("<script type='text/javascript'>"+somecode+"</script>").appendTo("head"); 

わからない:私はその基本的な目的は簡単にポップアップに定期的にリンクを有効にすることですDrupalのポップアップモジュールのバージョンで働いていますページ全体のリクエストをAJAXで行い、それにモーダルウィンドウ内のページこれには外部CSSとJavascriptファイルが頻繁に含まれます。このAJAXのすべてのパフォーマンスを向上させるために、私はAJAXのキューイングを使用するように切り替えました。外部スクリプトのeval()をリストアップされた代替方法に変更しました。しかし、これはさまざまなページで散発的なJavscriptのバグを引き起こしました。

+1

jqueryを使って何をしているのかをevalでどうやって判断するかわかりません。 Evalは、jsonレスポンス文字列のようなものを配列に変換し、そのようなものにするのに使われました。 –

+0

@MattPhillips evalはコードを評価します。 – Raynos

+0

@Matt - jQueryには、スクリプトタグ内の文書にそれを追加することによって "eval"コードを含むいくつかの内部関数が含まれています。IIRCでは、 'globalEval'は、同じドメインのスクリプトやJSONPを含むjQueryのAJAX関数によって広く使用されています。 –

答えて

2

まあ(違いがある限り)evalは、式の結果を返します。

var result = eval('3+4'); // result = 7 

限り、JavaScriptの文字列は、スクリプトブロックの構造であると、私は強くJSON-Pを使用することをお勧め/

+6

もっと正確に。 'eval()'は、スクリプトタグが何も返せない間に評価された最後の式の結果を返します。 –

+0

@alexandre - それはもっと正確に言い表されています。私は更新します。 –

+0

JSLintでコードを実行すると、evalも失敗します。 – Raynos

1

スクリプトタグ内にそれを注入することを示唆しています。

オンザフライでスクリプトノードを作成し(src = [url])、発信AJAXリクエストにコールバック関数名を追加し、コールバック関数がjsonデータで呼び出されるようにします。あなたのページ(適切な名前空間)でコールバック関数を定義し、その内部に更新ロジックを配置します。

動的スクリプトノードコールバックの利点は、XHRと同じドメイン制限がないことです。

たとえば、あなたのサイトはwww.foobar.comで、いくつかのWebサービスはwww.foobarapi.comでホストされています。あなたが持っている、SRC =「http://www.foobarapi.com/baz?a=foo1 & B = foo2は&コールバック= foo.bar.baz」ページで一方

と実行時にスクリプトノードを作成します:スクリプトタグを追加する

$a=$GET['a']; 
$b=$GET['b']; 
$callback = $GET['callback']; 
$c = someCalc($a, $b); 
echo $callback . "({ \"c\" : $c });"; 
+0

あなたはあなたの着信データJSONPをフレンドリーにする必要があります。これはサードパーティの外部ファイルには役に立ちません。 – Raynos

+0

@Raynos:同意します。 –

+0

あなたのお返事ありがとうございますが、それは私の質問に接するだけです。私は、2つのアプローチの違いに関する情報を探していました。これは、コンテキストを考えれば、私が実装できるものではない別のメソッドをすべて一緒に使うという提案とは対照的です。 – Oliver

1

は、ときに非同期的にロードされたXHR経由でevalのテキストを、ロードするのに対し、同期スクリプトをロードします:

foo.bar.baz = function(data) { 
    // use the data 
} 

そして、あなたのバックエンドサービスは、PHPは、のように見えることができると言います。非同期のため、スクリプトはおそらく順不同でロードされていました。

これには10億のケースがあることに注意してくださいが、私はこれがあなたのシナリオに基づいていると推測しています。

これで、XHRを同期して読み込むことができましたが、その後は大幅に遅くなります。ブラウザは一度に6つのスクリプトをロードできますが、順番に実行します。 XHRは一度に1つずつ読み込まれます。

+0

私は一般的にブラウザが2つの要求を同時に処理できるという印象を受けていました。実際には、各ファイルを同期してロードして順番に読み込まれ、ポップアップページが正しく起動されています。問題。私は非同期の読み込みをしたいと思っていますが、外部のJSとCSSをAJAX経由で読み込んでいるときには意味があるようです。 – Oliver

関連する問題