web-dev-qa-db-ja.com

リンクのhrefプロパティから完全なURIを取得します

いつか確認をお願いします。

私の目標は、リンクからhrefプロパティを読み取るときに、常に同じ文字列(私の場合はURI)を取得することです。例:

_<a href="test.htm" />_ with base_url = http://domain.name/

_<a href="../test.htm" />_ with base_url = http://domain.name/domain/

_<a href="http://domain.name/test.htm" />_ with base_url =任意のフォルダ http://domain.name/

上記の3つの状況(または他の同一の文字列)から_http://domain.name/test.htm_を取得する必要があります。

いくつかのテストの後、_my_a_dom_node.href_は常に http://domaine.name を含む完全修飾URIを返すように見えますが、これは私が望むものには問題ないはずです。

jQueryの動作は異なり、$(my_a_dom_node).attr('href')はHTML内に表示されるコンテンツ(テキスト)を返します。したがって、私のトリックは、$(my_a_dom_node).get(0).hrefを使用して完全なURIを取得することです。

問題は、これに頼ることができるかということです。

24
Savageman

はい、あなたは信頼できます!

かつて人々が単純なjavascript(jQueryなし)を使用していたとき、多くの人があなたが求めているものの反対を尋ねました、彼らは完全なものではなく、href属性に書かれた実際のURLを取得したいと思っていました。

my_a_dom_node.getAttribute('href', 2); //works both IE/FF

次に、そのようなコードが必要になることを見つけるのに時間を無駄にしないようにするjQueryが登場し、jQueryは常にhref属性に記述されている実際のURLを返します。

JQueryがhref属性に記述されたものを返すため、誰かが完全なURLを取得する方法を尋ねているのはおかしいです。

23
Marco Demaio

古い質問だとは思いますが、これが実際に最初に表示されたエントリなので、ソリューションを追加するのは良いことだと思います。 jQueryが「prop」関数を導入して以来、完全なURLを取得するのは次のように簡単です。

$(my_a_dom_node).prop('href');

それでも誰かが助けてくれることを願っています。

14
arakell

はい、あなたはこれに頼ることができます。

JQuery(1.4.2)のソースコードを見ると、jQuery.attr()関数が使用されていることがわかります(関連する部分に凝縮されています)。

_jQuery.extend({
  // ...
  attr: function( elem, name, value, pass ) {
    // ...

    var attr = !jQuery.support.hrefNormalized && notxml && special ?
               // Some attributes require a special call on IE
               elem.getAttribute( name, 2 ) :
               elem.getAttribute( name );

    // Non-existent attributes return null, we normalize to undefined
    return attr === null ? undefined : attr;    
  }
});
_

したがって、実際の属性値を返すelem.getAttribute('href')を効果的に呼び出し、hrefプロパティは設計上正規URLを返します。

ただし、_jQuery.support.hrefNormalized_への参照があり、jQueryサポートサイトは次のように述べています。

  • hrefNormalized.getAttribute()メソッドが要素のhref属性を完全修飾URLに正規化するのではなく、変更せずに取得する場合、trueに等しくなります。 (現在、IEではfalseです。URLは正規化されています)。 DOMl3仕様

これは基本的に、jQueryがブラウザの動作を独自に検出し、それに応じて適応して一貫した結果を提供することを意味します。

10
Tomalak

少しのjavascriptを使用して完全なURLを再構成できます:

function parseLink(link) {
    var baseUrl = location.href.substring(0,location.href.lastIndexOf('/'));
    if (link.indexOf('/') != -1) {
        link = link.substring(link.lastIndexOf('/')); 
    } else {
        link = "/"+ link;
    }
    var fullUrl = baseUrl + link;
    return fullUrl
}
1
rnaud