2012-01-17 5 views
4

次のマークアップを想像:あなたは、リンクをクリックした後に起こることのjQueryは、あなたがリンクをクリックした前があったhrefPageはない警告ということで、今hrefを読む前にjQueryがhrefの変更を待つようにしますか?

$('a').click(function(){ 
    var href = $(location).attr('href'), 
    hrefLenght = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
}); 

<a href="#link01">1</a> 
<a href="#link02">2</a> 

とをの後に、期待通りに。したがって:私はhttp://www.example.com/#link01
2に位置しています

1))私はリンク
3、結果をクリック)link01
3エコー予想)link02され、これを修正する方法

に任意のアイデアをエコーされます?

EDIT:なぜhrefの代わりに場所を使用していますか?何もせずにページがhrefでロードされたときにも前述のコードが動作するようにしたいので、同じプロセスに対して2つのコードを書くのは良い考えだと思いませんか?

+1

"ページの場所が変更されましたハンドラはリンククリックされたハンドラを持ちます。そのようには機能しません。初心者にとっては、「クリック」は最初に発生しますが、決してうまくいかない理由があります。代わりに、リンクの 'href'プロパティを取ってください。 –

+0

質問を編集しました。 –

+0

いいえ、リンクのクリックハンドラは、ページを読み込んだだけで魔法のようにトリガーされません。コードの重複を避けるには、ロジックを関数にカプセル化し、複数のハンドラで呼び出します。 –

答えて

2

:あなたがこれを行うことが一つの方法は、単にあなたのjavascriptの前に

例が起こるために、ウィンドウのナビゲーションアクションを強制的にJavaScriptコードの先頭に

window.location = $(this).attr('href'); 

を置くことですページLOにhashchangeをトリガするには

$('a').bind('hashchange',function(){ 
    var hval = location.hash.slice(1); // remove the leading # 
    alert(hval); 
}); 

:代わりに、これらの変更を監視するためのhashchangeイベント広告はハッシュへの外部リンクを呼び出すか、リンクをクリックしたときだけではなく、戻るボタンで参照すると次のようになります:

$(document).ready(function() { 
    $(window).trigger('hashchange'); 
}); 
+0

IEでこの作業を行うフォールバックを含める必要があります。 –

+0

IE8 +で動作します - 古いバージョンには[プラグイン](http://stackoverflow.com/q/680785/901048)が必要です。 – Blazemonger

2

コードにバグがあります。代わりにthisキーワードのlocationwindow.locationを指しています。

$('a').click(function(){ 
    var href = $(this).attr('href'), 
    hrefLenght = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
}); 
+0

私は彼がそれを意味すると思うが、これは問題の有効な修正だ。 –

0

クリックしたリンクのhrefを使用しないのはなぜですか? hrefが変更された後の値になります。

$('a').click(function(){ 
    var href = this.href, 
    hrefLength = href.length, 
    hrefPos = href.indexOf("#"), 
    hrefPage = href.slice(hrefPos+1); 
    alert(hrefPage); 
    // could also use: 
    // alert(this.href.split("#")[1]); 
});