2011-05-30 21 views
15

私は、HTMLページ内のJavaScriptを通じてベースのURLを呼び出していると私はリンクgetBaseURL()hrefの中にjavascriptのコール機能=「」

などを呼び出すためにベースURLを追加します。次のように

<a href="getBaseURL()/filepath/index.html">Page</a> 

ジャバスクリプトは次のようになります。

function getBaseURL() { 
    var url = location.href; // entire url including querystring - also: window.location.href; 
    var baseURL = url.substring(0, url.indexOf('/', 14)); 

    if (baseURL.indexOf('http://localhost') != -1) { 
     // Base Url for localhost 
     var url = location.href; // window.location.href; 
     var pathname = location.pathname; // window.location.pathname; 
     var index1 = url.indexOf(pathname); 
     var index2 = url.indexOf("/", index1 + 1); 
     var baseLocalUrl = url.substr(0, index2); 

     return baseLocalUrl + "/"; 
    } 
    else { 
     // Root Url for domain name 
     return baseURL + "/"; 
    } 

} 

EDIT

そのだけの問題のドメインからの任意のベースURLを取得します。また、私はあまり処理を必要とする任意の提案は素晴らしい感謝

SECOND EDIT

こんにちはすべてのあなたの答えのためのおかげで今のところ、しかし、私は呼び出すために探していますでしょうので、チュートリアルから、このコードを持って関数を<a href="getURL()/filepath/file.html></a>のようにhtmlタグに追加します。これはどこに問題があるのか​​、私はそれを行う方法がわかりません

+0

質問がありますか? Btw、 'localhost0'と' localhost.foo.com'は完全に有効なドメインであり、通常は/ etc/hostsや他の名前解決設定で特別に扱われるものではないので、あなたの '' http:// localhost "=== baseUrl .substring(0,14) 'には隠れた仮定がたくさんあります。また、「」の効果を無視しています。 –

+1

URLの例を提供できますか? 'baseURL'はどのようなものでしょうか?私はあなたが多くの不必要な処理をしていると感じています... –

+0

"baseURL"を定義してください –

答えて

30
function getBaseURL() { 
    return location.protocol + "//" + location.hostname + 
     (location.port && ":" + location.port) + "/"; 
} 

編集:非標準ポートのMike Samuelのポイントをアドレッシングしました。

+2

2つ以上のディレクトリレベルのパス、非標準のポート、または '文書ではこれは間違っています。 –

+1

@Mike Samuel:1つのディレクトリレベル以上の深さのパスが何を意味するのか分かりませんが、「」と公開サイト用の非標準ポートはあまり使用されません(実際には*これまで実際に 'base'タグが見られました)。彼はまた、彼は "ドメインの質問からベースURLを取得する"と述べた。ライブラリ用にこの関数を作成していた場合は、関連するすべての細目を考慮に入れます。しかし、私はそうではないので、私はちょうどOccamのカミソリを使用し、彼はインターネット上のサイトの95%と同じ構成を持っていると仮定します。 –

+3

一般的な環境に関するあなたの主張は正しいかもしれませんが、警告なしでヘルプフォーラムに簡略化されたコードを提供することは悪い習慣です。特定の状況で失敗したことが分かっている場合は、そのコメントに言及してください。ディレクトリごとに、 'http:// example.com/foo/bar.html'のベースURL(' 'からのオーバーライドなし)は、http://ではなく、http:// example.com/foo// example.com/' –

5

<base>(またはそうでない)の使用を可能にするための一般的な解決策 - さらなる改善は、何らかの種類の正規表現を使用してbaseURLからbaseDocumentを削除することです。

function getBaseURL() { 
    var baseURL = ""; 
    var baseDocument = "index.html"; 

    if (document.getElementsByTagName('base').length > 0) { 
     baseURL = document.getElementsByTagName('base')[0].href.replace(baseDocument, ""); 
    } else { 
     baseURL = location.protocol + "//" + location.hostname + (location.port && ":" + location.port) + "/"; 
    } 

    return baseURL; 
} 
0

私は同じ問題を扱っています、そして、それはそんなにベースURLを取得していない(これらの答えが示されているよう)が、相対パスを追加する要素からjavascript関数こと、その後の呼び出し。 @Christianサンチェスの答えと私が見つけた他の情報を使用して、これは要素のonclickのを使用してオプションがある:

JAVASCRIPT:

<script type="text/javascript"> 
    function getBaseURL(loc) { 
     return location.protocol + "//" + location.hostname + 
      (location.port && ":" + location.port) + "/" + loc; 
    } 
</script> 

HTML:

<a href="filepath/index.html" onclick="getBaseURL(this.href);">TEST LINK</a> 

フィドルはここにあります: http://jsfiddle.net/62g2bkyh/(リンク上にカーソルを置くとfiddleのURLが表示されます。これはiframeのベースURLを示しています)。