18

クエリをサーバーに送り返す必要がある JavaScript ファイルにいくつかのコードがあります。問題は、現在使用しているスクリプトの URL をどのように見つければ、ajax の適切なリクエスト URL を作成できるかということです。

つまり、同じスクリプトが 、 、 などに含まれていますが//help常に/whateverからリクエストする必要があり/data.jsonます。さらに、同じサイトが別のサーバーで実行されているため、/フォルダーの配置が異なる場合があります。Javascript (ez-publish テンプレート) を含める相対 URL を解決する手段はありますが、javascript ファイル自体では解決できません。

このために作られたすべてのブラウザで動作する小さなスクリプトはありますか?

4

5 に答える 5

23

このために、リクエストに使用するURLを含む<link>要素をページに配置するのが好きです。<head>これらはサーバー側の言語で生成できるため、常に正しいビューを指します。

<link id="link-action-1" href="${reverse_url ('action_1')}"/>

になります

<link id="link-action-1" href="/my/web/root/action-1/"/>

次のコマンドを使用してJavascriptで取得できます。

document.getElementById ('link-action-1').href;
于 2008-09-20T18:08:20.657 に答える
3

クライアントはサーバーの構成を認識していないため、サーバーからの通知なしにWebアプリのルートを判別する方法はありません。試すことができる1つのオプションは、head要素内のbase要素を使用して、サーバーにハードコーディングするのではなく動的に生成させることです(したがって、各サーバーに関連するURLが表示されます)。

<base href="http://path/to/webapp/root/" />

その後、すべてのURLはこれに関連するものとして扱われます。したがって、/data.jsonにリクエストを送信するだけです。ただし、アプリケーション内の他のすべてのリンクがこれを念頭に置いていることを確認する必要があります。

于 2008-09-20T18:13:50.067 に答える
3

document.location.hrefJavaScript の文字列関数を使用して操作できる現在の URL が表示されます。

于 2008-09-20T17:46:50.617 に答える
2

スクリプトが独自のファイル名を知っている場合は、 document. getElementsByTagName ()。自分のスクリプトに一致するスクリプトが見つかるまでリストを繰り返し、その方法で完全な (または相対) URL を抽出します。

次に例を示します。

function getScriptUrl ( name ) {
    var scripts = document.getElementsByTagName('script');
    var re = RegExp("(\/|^)" + name + "$");
    var src;
    for( var i = 0; i < scripts.length; i++){
        src = scripts[i].getAttribute('src');
        if( src.match(re) )
            return src;
    }
    return null;
}

console.log( 'found ' + getScriptUrl('demo.js') );

このアプローチはファイル名の衝突の影響を受けることを考慮してください。

于 2011-08-29T21:05:07.627 に答える
0

ライブラリのメインエントリポイント(main.php)に次のコードを含めます。

/**
 * Build current url, depending on protocal (http/https),
 * port, server name and path suffix
 */
$site_root = 'http';
if (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] == "on") 
    $site_root .= "s";
$site_root .= "://" . $_SERVER["SERVER_NAME"];
if ($_SERVER["SERVER_PORT"] != "80")
    $site_root .= ":" . $_SERVER["SERVER_PORT"];
$site_root .= $g_config["paths"]["site_suffix"];

$g_config["paths"]["site_root"] = $site_root;

$ g_configは、構成オプションを含むグローバル配列です。したがって、site_suffixは、開発ボックスでは「/ sites_working / thesite / public_html」のようになり、仮想ホスト(ドメイン名)を持つサーバーでは「/」のようになります。

誰かが開発ボックスのIPアドレスを入力すると、「localhost」のようなものではなく、同じIPアドレスを使用してjavascriptフォルダーへのパスが作成され、「localhost」を使用すると、この方法も適しています。 「localhost」を使用してURLを作成します。

また、SSLも検出するため、サーバーにSSLサポートを追加した場合でも、リソースがHTTPまたはHTTPS経由で送信されることを心配する必要はありません。

次に、テンプレートで、次のいずれかを使用します

<link id="site_root" href="<?php echo $g_config["paths"]["site_root"] ?>"/>

または

<script type = "text/javascript">
var SiteRoot = "<?php echo $g_config["paths"]["site_root"]; ?>";
</script>

後者の方が速いと思います。

于 2008-09-20T18:39:54.543 に答える