80

現在、次の関数を使用して、相対 URL を絶対 URL に「変換」しています。

function qualifyURL(url) {
    var a = document.createElement('a');
    a.href = url;
    return a.href;
}

これはほとんどのブラウザーでうまく機能しますが、IE6 ではまだ相対 URL を返すように要求されています。getAttribute('href') を使用した場合も同じです。

IE6 から修飾された URL を取得できた唯一の方法は、img 要素を作成し、その「src」属性をクエリすることです。これの問題は、サーバー リクエストが生成されることです。避けたいこと。

だから私の質問は: IE6 で相対 URL から (サーバー要求なしで) 完全修飾 URL を取得する方法はありますか?


正規表現/文字列の簡単な修正をお勧めする前に、それほど単純ではないことを保証します。基本要素 + 二重ピリオドの相対 URL + 他の潜在的な変数のトンは、本当に地獄になります!

巨大な正規表現ソリューションを作成せずにそれを行う方法があるに違いありません??

4

11 に答える 11

46

おかしいですね!ただし、DOMメソッドの代わりにinnerHTMLを使用すると、IEはそれを理解します。

function escapeHTML(s) {
    return s.split('&').join('&amp;').split('<').join('&lt;').split('"').join('&quot;');
}
function qualifyURL(url) {
    var el= document.createElement('div');
    el.innerHTML= '<a href="'+escapeHTML(url)+'">x</a>';
    return el.firstChild.href;
}

少し醜いですが、自分でやるよりも簡潔です。

于 2009-01-23T12:37:39.010 に答える
26

ブラウザーが <base> タグを正しく実装している限り、ブラウザーは次の傾向があります。

function resolve(url, base_url) {
  var doc      = document
    , old_base = doc.getElementsByTagName('base')[0]
    , old_href = old_base && old_base.href
    , doc_head = doc.head || doc.getElementsByTagName('head')[0]
    , our_base = old_base || doc_head.appendChild(doc.createElement('base'))
    , resolver = doc.createElement('a')
    , resolved_url
    ;
  our_base.href = base_url || '';
  resolver.href = url;
  resolved_url  = resolver.href; // browser magic at work here

  if (old_base) old_base.href = old_href;
  else doc_head.removeChild(our_base);
  return resolved_url;
}

これを試すことができる jsfiddle があります: http://jsfiddle.net/ecmanaut/RHdnZ/

于 2012-10-18T23:13:17.283 に答える
16

要素を複製するだけでIE6で動作させることができます:

function qualifyURL(url) {
    var a = document.createElement('a');
    a.href = url;
    return a.cloneNode(false).href;
}

(IE6 および IE5.5 モードで IETester を使用してテスト済み)

于 2014-06-26T18:31:23.620 に答える
10

このブログで、@bobince ソリューションのように見える別の方法を見つけました。

function canonicalize(url) {
    var div = document.createElement('div');
    div.innerHTML = "<a></a>";
    div.firstChild.href = url; // Ensures that the href is properly escaped
    div.innerHTML = div.innerHTML; // Run the current innerHTML back through the parser
    return div.firstChild.href;
}

大したことではなく、もう少しエレガントだと思いました。

于 2014-04-07T16:45:39.630 に答える
7

URI.jsは問題を解決しているようです:

URI("../foobar.html").absoluteTo("http://example.org/hello/world.html").toString()

http://medialize.github.io/URI.js/docs.html#absolutetoも参照してください。

IE6 ではテストされていませんが、一般的な問題を検索している他のユーザーには役立つかもしれません。

于 2014-01-30T13:31:24.073 に答える
2

アンカーの代わりに画像要素を使用することを提案する次のブログ投稿を見つけました。

http://james.padolsey.com/javascript/getting-a-fully-qualified-url/

これは、IE6 でも URL を確実に展開するために機能します。しかし問題は、私がテストしたブラウザーは、次の行で src を null に設定しても、画像の src 属性を設定するとすぐにリソースをダウンロードすることです。

代わりに、ボビンスのソリューションを試してみます。

于 2011-03-15T22:53:38.773 に答える
0

url'/'で始まらない場合

現在のページのURLを取得し、最後の'/'以降のすべてを切り取ります。次に、相対URLを追加します。

それ以外の場合urlは「/」で始まります

現在のページのURLを取得し、単一の「/」の右側にあるすべてのものを切り取ります。次に、URLを追加します。

それ以外の場合urlは、#または?で始まります

現在のページのURLを取得し、単に追加しますurl


それがあなたのために働くことを願っています

于 2009-01-22T21:37:03.587 に答える
-1

それがブラウザで実行される場合、この種の機能は私にとってはうまくいきます。

  function resolveURL(url, base){
    if(/^https?:/.test(url))return url; // url is absolute
    // let's try a simple hack..
    var basea=document.createElement('a'), urla=document.createElement('a');
    basea.href=base, urla.href=url;
    urla.protocol=basea.protocol;// "inherit" the base's protocol and hostname
    if(!/^\/\//.test(url))urla.hostname=basea.hostname; //..hostname only if url is not protocol-relative  though
    if( /^\//.test(url) )return urla.href; // url starts with /, we're done
    var urlparts=url.split(/\//); // create arrays for the url and base directory paths
    var baseparts=basea.pathname.split(/\//); 
    if( ! /\/$/.test(base) )baseparts.pop(); // if base has a file name after last /, pop it off
    while( urlparts[0]=='..' ){baseparts.pop();urlparts.shift();} // remove .. parts from url and corresponding directory levels from base
    urla.pathname=baseparts.join('/')+'/'+urlparts.join('/');
    return urla.href;
  }
于 2012-11-27T10:51:59.727 に答える