4

アプリケーションのさまざまな部分を照会するために AJAX 関数を処理する一連の静的な JavaScript ファイルがあり、アプリケーションの複数のバージョンをデプロイしているため、次のようなものがあるかもしれません。

https://www.myurl.com/projectName/ - production release
https://www.myurl.com/projectName_alpha/ - current alpha release
https://www.myurl.com/projectName_beta/ - current beta release
https://www.myurl.com/projectName_unstable/ - current development build

そのため、AJAX 呼び出しを行いたいコントローラー "foo" がある場合/projectName/foo、URL としてハードコードすることはできません (常に製品リリースを指すため)。現在、プロジェクトのベース URL をグローバル変数として取得するスクリプトを各ビューに挿入します。

<script type="text/javascript">
    // declare a global variable to hold the project's base URL
    var baseUrl = '<spring:url value="/" />';
</script>

次に、JavaScript ファイルでそれを参照します。

var url = baseUrl + 'foo/';

これは機能的ですが、解決策としては醜いので、回避できるのであれば、グローバル名前空間を汚染したくありません。より良い回避策を実装する方法について何か提案はありますか?

明確にするために: ソリューションは、AJAX ベースであるかどうかにかかわらず、あらゆるタイプのリクエストに対して実行可能である必要があります。呼び出し、タグの属性のwindow.open設定、およびコントローラーへの AJAX 呼び出しの作成はすべて、ソリューションで機能する必要があります。ベースURLが何であるか、またはそれが何層の深さであるかに関係なく、適用できる必要があります。たとえば、次のようになります。src<img>

https://www.myurl.com/
https://www.myurl.com/projectName/
https://www.myurl.com/projectName_alpha/1.2.3/

すべてが適切に検出されるはずです。

4

3 に答える 3

2

すべてのjsファイルをjspsに変換することは、あなたが探しているものではないと思います。

明らかな解決策は、モジュール システム (たとえば、 require.js ) を使用し、その値をモジュールにラップすることです。

次のjspのようなもの:

define({
    baseUrl: '<c:url value="/" />'
});

これは、他のモジュールで必要になる可能性があります。

ただし、これには、コード コードの大幅な再編成が必要になる場合があります。

より簡単なオプションは、すべてのページに含まれる次の jsp を作成することです。

<script type="text/javascript">
    $(document).ready(function () {
        $(document).ajaxSend(function (ev, jqXHR, ajaxOptions) {
            var context = '${pageContext.request.contextPath}';
            ajaxOptions.url = context + '/' +  ajaxOptions.url;
        });
    });
</script>

jquery で作成された各 ajax リクエストの URL にコンテキスト パスを追加します。

/これは、ajax リクエストでコンテキストに関連する URL を使用している限り(つまり、コンテキスト名がなくても で始まる)、機能するはずです。

于 2013-09-06T19:14:48.500 に答える
1

グローバルロケーションオブジェクトと正規表現を使用できます

アルファ リリースの場合は、 https: //www.myurl.com/projectName_alpha/resource.html を参照してください。

window.locationオブジェクトから情報を取得します

window.location.protocol = "https"
window.location.host = "www.myurl.com"
window.location.pathname = "/projectName_alpha/resource.html"

分割または正規表現によってパス名からコンテキスト ルートを抽出する場合は、その値を使用して、必要なさまざまな URL を作成できます。

baseUrl プロパティを使用してロケーション オブジェクトを強化する場合は、ページで簡単にアクセスできます。

window.location.baseUrl = window.location.pathname.split("/")[1];

そして、次の方法で URL を作成できます。

var url = window.location.baseUrl + '/foo/';
于 2013-09-08T17:33:57.893 に答える