2011-01-17 11 views
18

私はwindow.location.hash = "";トップへのスクロールを防ぎますか?私のウェブサイトで

window.location.hash = 'project_name'; 

を使用したURLアドレスを設定するが、私は(私はプロジェクトを閉じるとき)任意のハッシュから住所URLをきれいにしたいと私は

window.location.hash = ''; 

を設定した場合、それが起こりますページはトップページまでスクロールします

副作用なしにURLをクリーンアップする方法はありますか?

おかげ

+0

をあなたは非既存のアンカーを割り当てることができ、それは、最大URLを「掃除」は本当にありません:D面白い – polarblau

答えて

28

ありonhashchangeイベントだが、スクロールを防ぐために、ブラウザー間で確実にキャンセルすることはできません。最適な解決策は、ハッシュ位置を変更する前にスクロール位置を記録し、後でそれをリセットすることです。あなたはを通してハッシュを変更している場合は

document.onclick = function (evt) { 
    var tgt = (evt && evt.target) || event.srcElement, 
     scr = document.body.scrollTop; 

    if (tgt.tagName == "A" && tgt.href.slice(-1) == "#") { 
     window.location.href = "#"; 
     document.body.scrollTop = scr;   
     return false; 
    } 
} 

#のhref値とし、垂直スクロールからページを防ぐ - 伝播を停止しません - たとえば、次のコードは、任意のリンクをクリックをキャッチしますスクリプトの場合、次のコードを使用することができます。

var scr = document.body.scrollTop; 
window.location.href = '#'; 
document.body.scrollTop = scr; 

これらの方法のいずれかを調整すると、個々の要素をスクロールしたり、ページを水平方向にスクロールしたりすることがなくなります。最新のブラウザでは、pushStateまたはreplaceState関数を呼び出すことで、ナビゲーションやスクロールを行わずにremove the entire hash#を含む)にすることができます。

+1

...日常の私は何かを学びます! thanks – Francesco

+0

'id 'を持つ別の要素を' scrollTop'で一時的に作成することもできます。 – alex

+0

fyi、それはFirefoxでは、ほとんどの時間はChromeで動作していません。それはオハシシンク機能に入りますが、ブラウザはまだスクロールしています(デフォルトを防止しようとしました)。 – JCarter

12

私は同じ問題を抱えていて、答えのためにここに来ました。

window.location.hash = ' '; 

は基本的にあなたが「#」にそれを設定している、スペースが存在しないため、それは移動しません。ただ、そこに非常に簡単な方法があるがわかりました。あなたがページに戻ったときにも、それ以外のものは扱われません。#

+0

私の意見ではこれが受け入れられる質問であるべきです – Nico

+1

s/question/answer/ – nicolallias

+0

素晴らしい解決策ですが、クロム46では機能しません – meteor

8

まず、@ Andy-Eと@JustMaierのソリューションに感謝します。

しかし、FirefoxのAndy Eの2番目のコードブロックと、ChromeのJustMaierのコードに基づいて動作させることに問題がありました。

だから私は、これら2つのコード・ブロックのマッシュアップを行なったし、それが上述したように、離れて本当のJS忍者から何も取っていない、両方のブラウザ私の2セント

var scr = document.body.scrollTop; 

window.location.hash = ' '; 

document.body.scrollTop = scr; 


に意図同じように動作します。 :)

0

document.body.scrollTop is deprecatedまた、最新のChromeバージョンはここでは不安定なようです。以下は動作するはずです:

var topPos = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0; 
    window.location.href = '#'; 
    document.documentElement.scrollTop = topPos; 
関連する問題