2016-12-07 11 views
0

私は、フラグメントのみを含むhrefのアンカータグを持っています。クリックハンドラが割り当てられています。リンクをクリックすると、ハンドラが終了した後、レベルの高いページが読み込まれます。アンカーhrefがフラグメントのフルパスを表示するのはなぜですか?

  1. ページはhttp://domain.com/app/path_component
  2. にあるページが<base href="http://domain.com/app/">
  3. ページが含まれている定義されています:<a href="#fragment"> ... </a>
  4. をjQueryのクリックハンドラ設定します:$('a').on('click', handler)
  5. をここで

    は事実です

  6. .htaccessは、サーバー上のPHPアプリケーションへのサーバー処理を指示します。/app

私はfalseを返さず、e.stopPropagation()またはe.preventDefault()も呼び出さなかったので、ブラウザがデフォルトの処理を行い、hrefを処理することがわかりました。なぜ私はそれが別のページを読み込んだのですか?

ハンドラをトレースすると、this.hrefが "http://domain.com/app/#fragment"であることがわかりました。それは親ページがロードされている理由を説明しますが、なぜそれがそのページであったのかわからないのですか?

オリジナルのhrefを見ることができる唯一の方法はhref属性を直接チェックすることでした。それは必要であるべき場合には、ページの読み込みを許可するが、それは断片のみだったときにそれを防ぐので、私はハンドラとして返す書いた:?この必要があったのはなぜ

return $(this).attr('href')[0] != '#'; 

私はフラグメントのために処理し、デフォルトではないと思いました

答えて

2

ブラウザは、ショートリンクを、バーで割り当てられたリンクと連結して処理しますあなたが<base href="http://something.com/">にすべてのショートリンクと関連するソースを割り当てた場合(つまり、 <img src="...">)は、baseに対して相対的に処理されます。 <base>は、あなたのウェブページを別のサイトに簡単に移植することを主目的としています。

ですから、比較的ベースにアンカーパスを割り当てる必要が解決策として:

<a href="path_component#fragment"> 

別の方法があるがベースアンカーJS:ソリューションの

<a href="javascript:;" onclick="document.location.hash='fragment';">fragment</a> 

一つをJavaScriptを使用してベースノードを生成することですページの先頭に子を付けて<head>に追加する:

<script> 
    var currPage = window.location.href; 

    if (document.getElementsByTagName("base").length === 0) { 
     var base = document.createElement("base"); 
     base.setAttribute("href", currPage); 
     document.getElementsByTagName('head')[0].appendChild(base); 
    } 
    else { 
    document.getElementsByTagName("base")[0].setAttribute("href", currPage); 
    } 

</script> 

それはうまくいくはずですが、上記のように、画像ソースに相対パスを使用する場合は、リンクを../(つまり、 <img src="../images/image.gif">)は、親ページに基づいて絶対パスを取得します。

+0

あなたが説明する目的でに設定されていますが、スタンドアロンのフラグメントには影響しないと思っていました。私はこれについて私の理解を再構築しなければならない。 – wrlee

関連する問題