0

javascript、css、htmlファイルを含む動的ロードを実行しようとしています。

私はこのようにそれをしたいと思います:

$.when($.ajax(htmlPath), $.get(cssPath), $.ajax({
    url: javascriptPath,
    dataType: "text"
}))
.done(function(response){
// i want to pass the data for each of these to the respective functions        
    appendHtml(what goes here??);       
    appendCss(what goes here??);
    executeJs(what goes here??);
})
.fail(function(){
    console.log("failed");
});

そのため、応答コールバックをどのように分離するかについて混乱しています。現在、私の.done関数に表示される応答オブジェクトは、私が呼び出したHTMLファイルのみです。この関数は正しいajax呼び出しを行っており、正しいファイルはすべてサーバーによって応答されていますが、すべての呼び出しが完了したら、どうすればそれらにアクセスできますか?これが必要なので、まだ存在しないHTMLなどにcss / jsを適用しません。また、javascriptファイルを文字列として返し、executeJs関数内でeval()します。私の理解では、これはevalの使用としては問題ありません。これは、ファイルが独自のサーバーによって返されるため、改ざんされる可能性があるかどうかがわかりません。この仮定は正しいですか?

さらに、私のappendCss関数では、それを頭の「style」要素に追加しているだけです。これに大きな問題はありますか?私はこれらすべてを使用して、「ウィジェット/アプリベース」の機能を作成しています。各「アプリ」にjs、css、およびhtmlがあり、必要なときにサーバーにクエリを実行して、アプリを読み込んでいます。 。

4

3 に答える 3

3

ダウンロードしたデータが元のWebページと同じサーバーから取得されている場合は、通常、ブラウザーで既に実行されているコードと同じレベルの信頼がそのコードにあります。

このようなコンテキストでの問題はeval()、必ずしも自分のサーバーから戻ってくるコードを信頼していないということではありません。誰かが実行中のjavascriptを変更して、javascriptPath変数が予期しない場所を指すようにすることができるかもしれません。


実際の質問に関する限り、コールには3つのpromiseが含まれてdoneいるため、コールバックには実際には3つのパラメーターが渡されます。when

コールバックを(としてfunction(response))定義した方法のため、最初のコールバック(HTML呼び出しからの戻り値)のみが表示されます。他の2つのパラメーターは無視されます。

渡される3つのパラメーターはそれぞれ、次の3つの要素の配列になります[wasSuccessful, statusText, jqxhr]。それらを使って何か便利なことをするために、コールバックを次のように構成することができます。

$.when($.ajax(htmlPath), $.get(cssPath), $.ajax({
    url: javascriptPath,
    dataType: "text"
}))
.done(function(htmlResponse, cssResponse, jsResponse){
    if (htmlResponse[0]) {
        appendHtml(htmlResponse[2].responseText);
    }
    if (cssResponse[0]) {
        appendCss(cssResponse[2].responseText);
    }
    if (jsResponse[0]) {
        executeJs(jsResponse[2].responseText);
    }
})

appendHtml(適切な、、appendCssおよびexecuteJs関数がすでに記述されていることを前提としています)


このページにはいくつかの良い例があります:http://api.jquery.com/jQuery.when/

そして、このページには、jqxhrオブジェクト(done関数に渡される各配列の3番目の要素)に関するドキュメントがあります:http://api.jquery.com/jQuery.ajax/#jqXHR

于 2012-02-07T17:05:16.050 に答える
1

done()すべての応答にアクセスするには、コールバックに3つの引数を渡すだけです。これを試して:

$.when($.ajax(htmlPath), $.get(cssPath), $.ajax({
    url: javascriptPath,
    dataType: "text"
}))
.done(function(responseHTML, responseCSS, responseJS){
    console.log(responseHTML[0]);       
    console.log(responseCSS[0]);
    console.log(responseJS[0]);
})

done()内にオブジェクトを出力しようとするとarguments、すべての応答がコールバックに渡されることがはっきりとわかります。

于 2012-02-07T17:11:34.363 に答える
0

evalの使用に関しては、代わりにJSONPの使用を検討してください(dataType: 'jsonp')。このようにして、jQueryがコードの実行を処理します。jQueryも内部で使用eval()していると思いますが、少なくとも、適切な方法で実行されていることはご存知でしょう。安全性に関しては、eval()が悪である場合は、関連する質問も参照してください。

于 2012-02-07T17:38:08.420 に答える