Sayfa yenilemesi olmadan JavaScript ile hash window.location (URL) 'den nasıl kaldırılır?


332

URL'm var:, sayfanın yenilenmesine neden olmadan http://example.com#somethingnasıl kaldırabilirim #something?

Aşağıdaki çözümü denedim:

window.location.hash = '';

Ancak bu, karma sembolünü #URL'den kaldırmaz .


3
Gerçekten bunu yapmak istiyor musun? Sayfanın yenilenmesine neden olur.
seth

9
Sayfa yenilemesi olmadan yapmak mümkün mü?
Tom Lehman

1
Bu ise mümkün. AJAX tarih kütüphaneleri bununla ilgilenir. Ancak bu kolay değildir ve neredeyse her tarayıcı için farklı yapılması gerekir. Girmek istediğiniz bir şey değil.
Gabriel Hurley

Görsel olandan başka bir "#" bırakarak herhangi bir karar var mı?
user29660

Yanıtlar:


210

İlk Soru:

window.location.href.substr(0, window.location.href.indexOf('#'))

veya

window.location.href.split('#')[0]

her ikisi de URL'yi karma veya arkasından herhangi bir şey olmadan döndürür.

Düzenlemenizle ilgili olarak:

Yapılacak herhangi bir değişiklik window.locationsayfanın yenilenmesini tetikler. window.location.hashYenilemeyi tetiklemeden değiştirebilirsiniz (karınız sayfadaki bir kimlikle eşleşirse pencere atlar), ancak karma işaretinden kurtulamazsınız. Daha da kötüsü olan seçiminizi yapın ...

EN GÜNCEL CEVAP

Ödün vermeden nasıl yapılacağına dair doğru cevap (tam yeniden yükleme veya karma işaretini orada bırakma) burada . Bu yanıtı 2009'da orijinal olanla ilgili olarak bırakarak, yeni tarayıcı API'larından yararlanan doğru cevap 1,5 yıl sonra verildi.


22
Bu sadece yanlıştır, window.location.hash dosyasını değiştirebilirsiniz ve yenilemeyi tetiklemez.
Evgeny

61
@Evgeny - Cevabım böyle söylüyor. Açıkça window.location.hash değiştirmenin bir yenileme tetiklemeyeceğini söylüyorum. Msgstr "window.location.hash dosyasını yenilemeyi tetiklemeden değiştirebilirsiniz (ancak karınız sayfadaki bir kimlikle eşleşirse pencere atlar)".
Gabriel Hurley

3
Sayfa yeniden yüklemesi yok - bu soruda. Bu, sayfanın yeniden yüklenmesini gerektirdiği / zorladığı için yanıt değildir!
Ed_

10
ayrıca ✓answer
abernier

4
Bu OP sorusuna bir cevap değil.
Bryce

586

Bu sorunu çözmek günümüzde çok daha ulaşılabilir durumda. HTML5 Tarih API bize cari etki alanı içindeki herhangi bir URL görüntülemek için konum çubuğunu değiştirmenize olanak verir.

function removeHash () { 
    history.pushState("", document.title, window.location.pathname
                                                       + window.location.search);
}

Çalışma demosu: http://jsfiddle.net/AndyE/ycmPt/show/

Bu, Chrome 9, Firefox 4, Safari 5, Opera 11.50 ve IE 10'da çalışır. Desteklenmeyen tarayıcılar için, mümkün olan her yerde kullanan zarif bir şekilde aşağılayıcı bir komut dosyası yazabilirsiniz:

function removeHash () { 
    var scrollV, scrollH, loc = window.location;
    if ("pushState" in history)
        history.pushState("", document.title, loc.pathname + loc.search);
    else {
        // Prevent scrolling by storing the page's current scroll offset
        scrollV = document.body.scrollTop;
        scrollH = document.body.scrollLeft;

        loc.hash = "";

        // Restore the scroll offset, should be flicker free
        document.body.scrollTop = scrollV;
        document.body.scrollLeft = scrollH;
    }
}

Böylece, henüz tüm tarayıcılarda değil, karma sembolünden kurtulabilirsiniz.

Not: tarayıcı geçmişinde Geçerli sayfayı değiştirmek istiyorsanız, kullanmak replaceState()yerine pushState().


9
Sorgu dizesini kaybetmediğinizden emin olmak için bu satırı kullanın: history.pushState ("", document.title, window.location.pathname + window.location.search);
Phil Kulak

6
@Phil: Bunu belirttiğiniz için teşekkürler, cevabı buna göre güncelledim. Güzel URL'ler kullanmaya çok alışkınım.
Andy E

1
IE'nin eski sürümleri için, document.body yerine document.documentElement öğesini kullanmanız gerektiği görülmektedir. Bu yanıta bakın stackoverflow.com/a/2717272/359048
jasonmcclurg

29
Tarayıcı geçmişinde fazladan bir giriş oluşturmak için pushState yerine replaceState kullanmanızı öneririm.
Nico

1
@santiagoarizti: haklısın, ben de aynı sonuca vardım. Yazdığım kodu (7 yıl önce!) Düzgün bir şekilde incelemedim ve hash kaldırırken düğmenin durumunu da değiştirdiğimi kaçırdım. Karmayı manuel olarak değiştirdiğiniz için, olayı her zaman kendiniz tetikleyebilirsiniz, sanırım.
Andy E

85

(Çok fazla cevap gereksiz ve modası geçmiş.) Şimdi en iyi çözüm şudur:

history.replaceState(null, null, ' ');

5
kullanmak history.pushState(null, null, ' ')Eğer geçmişini korumak istiyorsanız bunun yerine.
nichijou

9
Neyin geçtiğini açıklamak yararlı olabilir null için stateve titlesonuçta yok parametreler.
V. Rubinetti

Bununla ve geri kalanıyla ilgili bir sorun, daha önce olmadığı zaman karma artık boş olsa bile, onhashchange'i tetiklememesidir.
Curtis

1
TypeScript'te, komut bir dize aldığından ikinci parametre için null değerine izin verilmez. Mozilla boş dize önerir.
Curtis

41

Basit ve zarif:

history.replaceState({}, document.title, ".");  // replace / with . to keep url

3
aynı dizinde kalmak istiyorsanız eğik çizgi yerine nokta kullanın
vahanpwns

1
Lütfen .yerine kullanmak için @vahanpwns notuyla ilgili yanıtı güncelleyin /. Kullanarak /URL kök yolunu değiştirir.
Isaac Gregson

5
Bu cevap için teşekkürler, history.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));kullanım durumum için değiştirdim .
Scott Jungwirth

5
Bu, URL sorgusunu korumaz.
Vladislav Kostenko

2
Benim kullanımım da itme yerine değiştirmek oldu, ama bu benim için daha mantıklı:history.replaceState(null, document.title, location.pathname + location.search);
MDMower

16

Karma kaldırmak için bu işlevi kullanmayı deneyebilirsiniz

function remove_hash_from_url()
{
    var uri = window.location.toString();
    if (uri.indexOf("#") > 0) {
        var clean_uri = uri.substring(0, uri.indexOf("#"));
        window.history.replaceState({}, document.title, clean_uri);
    }
}

13

Bu, sondaki karmayı da kaldıracaktır. örneğin: http://test.com/123#abc -> http://test.com/123

if(window.history.pushState) {
    window.history.pushState('', '/', window.location.pathname)
} else {
    window.location.hash = '';
}

Bu, URL'de bulunan tüm sorgu parametrelerini kaldırır :(
kevgathuku

1
@kevgathuku onları konum.search ile geri ekleyebilirsiniz, örneğin: `` window.history.pushState ('', '/', window.location.pathname + window.location.search) ``
Chris Gunawardena

6

Aşağıdakilere ne dersiniz?

window.location.hash=' '

Lütfen karmayı boş bir dizeye değil, tek bir boşluğa ayarladığımı unutmayın.


Karmanın geçersiz bir bağlantıya ayarlanması da yenilemeye neden olmaz. Gibi,

window.location.hash='invalidtag'

Ancak, yukarıdaki çözümü yanıltıcı buluyorum. Bu, belirli bir konumda olmasa da, verilen konumda verilen adla bir çapa olduğunu gösterir. Aynı zamanda, boş bir dize kullanmak sayfanın en üste gitmesine neden olur ve bu da bazen kabul edilemez. Boşluk kullanılması, URL'nin her kopyalanıp yer imi ve ziyaret edildiğinde sayfanın genellikle en üstte olmasını ve boşluğun yok sayılmasını sağlar.

Hey, bu StackOverflow'daki ilk cevabım. Umarım birisi yararlı bulur ve topluluk standartlarına uygundur.


7
Boşluğun karma değerine ayarlanması URL'nin sonundaki # işareti hala duruyor, bence amaç onu tamamen kaldırmak.
mahemoff

1
URL'nin sonunda bir karma izler. Soru, bunun nasıl kaldırılacağıdır.
Gurmeet Singh

Evet # ile karma dizesini nasıl kaldırabiliriz.
Bhavin Thummar

6

Aşağıdaki gibi yapabilirsiniz:

history.replaceState({}, document.title, window.location.href.split('#')[0]);


1
Yıldızlı cevap her iki durumda da benim için işe yaramadı, ama bu cevap verdi. Teşekkürler!
Dev

5
const url = new URL(window.location);
url.hash = '';
history.replaceState(null, document.title, url);

2
Bu kod soruyu cevaplayabilirken, bu kodun soruyu neden ve / veya nasıl cevapladığı konusunda ek bağlam sağlamak uzun vadeli değerini arttırır.
rollstuhlfahrer

3
<script type="text/javascript">
var uri = window.location.toString();
if (uri.indexOf("?") > 0) {
    var clean_uri = uri.substring(0, uri.indexOf("?"));
    window.history.replaceState({}, document.title, clean_uri);
}
</script>

bu kodu baş bölümüne koy


3
function removeLocationHash(){
    var noHashURL = window.location.href.replace(/#.*$/, '');
    window.history.replaceState('', document.title, noHashURL) 
}

window.addEventListener("load", function(){
    removeLocationHash();
});

2

Bence daha güvenli olurdu

if (window.history) {
    window.history.pushState('', document.title, window.location.href.replace(window.location.hash, ''));
} else {
    window.location.hash = '';
}

0

Takip etmeyi dene:

window.history.back(1);

23
Bu, kullanıcı doğrudan karma dahil URL'ye geldiyse soruyu yanıtlamaz.
nickb

Bu hile, sadece önceki sayfaya bir bağlantı oluşturmak istediğinizde çok yararlıdır, ancak bağlantı js dosyaları demetinde gizlidir.
ValidfroM

Tam aradığım şey. Bu, bir javasript işlevi tarafından döndürülen bir değeri tüketmek için web uygulamam tarafından oluşturulan bir hashtag'i kaldırmak için mükemmel çalışır.
user278859

0

Href kullanarak konumu değiştirmek ve kaydırma yapmadan karmayı temizlemek için başka bir çözüm.

Sihirli çözüm burada açıklanmaktadır . Özellikleri burada .

const hash = window.location.hash;
history.scrollRestoration = 'manual';
window.location.href = hash;    
history.pushState('', document.title, window.location.pathname);

NOT: Önerilen API artık WhatWG HTML Living Standard'ın bir parçasıdır


0
  $(window).on('hashchange', function (e) {
        history.replaceState("", document.title, e.originalEvent.oldURL);
    });

-1

Karma değerini null ile değiştirebilirsiniz

var urlWithoutHash = document.location.href.replace(location.hash , "" );

1
Soru "sayfanın yenilenmesine neden olmadan" soruyor, ancak bu yöntem sayfayı yeniliyor. Cevabınızdaki bu gerçeği not etmelisiniz, bu yüzden hepimiz, burada cevaplamaya çalıştığımız sorudan farklı bir soruya cevap verdiğinizi ilk elden bulmak için zamanımızı boşa harcamak zorunda değiliz.
Vladimir Kornea

Sayfayı yenilemez.
Ciprian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.