วิธีลบแฮชจาก window.location (URL) ด้วย JavaScript โดยไม่ต้องรีเฟรชหน้า?


332

ฉันมี URL ที่ชอบ: http://example.com#somethingฉันจะลบได้อย่างไร#somethingอย่างไรโดยไม่ทำให้หน้ารีเฟรช?

ฉันพยายามแก้ไขปัญหาต่อไปนี้:

window.location.hash = '';

อย่างไรก็ตามสิ่งนี้จะไม่ลบสัญลักษณ์แฮช#ออกจาก URL


3
คุณต้องการทำสิ่งนี้จริงๆหรือ มันจะทำให้รีเฟรชหน้า
seth

9
เป็นไปได้ที่จะทำโดยไม่ต้องรีเฟรชหน้า?
Tom Lehman

1
มันเป็นไปได้ ไลบรารีประวัติ AJAX จัดการกับมัน แต่มันไม่ใช่เรื่องง่ายและจะต้องทำแตกต่างกันไปสำหรับเบราว์เซอร์เกือบทุกตัว ไม่ใช่สิ่งที่คุณต้องการเข้าไป
Gabriel Hurley

มีเรื่องใดบ้างที่เกี่ยวข้องกับการทิ้ง "#" ไว้ด้านหลังนอกเหนือจากภาพที่มองเห็นได้หรือไม่?
user29660

มีความเป็นไปได้ที่ซ้ำกันของการปรับเปลี่ยน URL โดยไม่ต้องโหลดหน้าซ้ำ
PayteR

คำตอบ:


210

คำถามเริ่มต้น:

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

หรือ

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

ทั้งสองจะคืนค่า URL โดยไม่มีแฮชหรืออะไรก็ตามหลังจากนั้น

เกี่ยวกับการแก้ไขของคุณ:

การเปลี่ยนแปลงใด ๆ ที่window.locationจะทำให้เกิดการรีเฟรชหน้า คุณสามารถเปลี่ยนแปลงได้window.location.hashโดยไม่ต้องเปิดใช้งานการรีเฟรช (แม้ว่าหน้าต่างจะข้ามไปหากแฮชของคุณตรงกับรหัสในหน้า) แต่คุณไม่สามารถกำจัดเครื่องหมายแฮชได้ เลือกสิ่งที่แย่กว่านี้ ...

คำตอบล่าสุดมากที่สุด

คำตอบที่ถูกต้องเกี่ยวกับวิธีการที่จะทำมันโดยไม่ต้องเสียสละ (โหลดทั้งแบบเต็มหรือออกจากป้ายกัญชามี) เป็นลงที่นี่ ออกจากคำตอบนี้ที่นี่แม้ว่าจะเกี่ยวกับการเป็นต้นฉบับในปี 2009 ในขณะที่คำตอบที่ถูกต้องซึ่งใช้ประโยชน์จากเบราว์เซอร์ API ใหม่ได้รับ 1.5 ปีต่อมา


22
นี่เป็นเพียงความผิดปกติคุณสามารถเปลี่ยน window.location.hash และจะไม่ทำให้เกิดการรีเฟรช
Evgeny

61
@Evgeny - นั่นคือคำตอบที่ฉันพูด ฉันบอกอย่างชัดเจนว่าการเปลี่ยน window.location.hash จะไม่ทำให้เกิดการรีเฟรช "คุณสามารถเปลี่ยน window.location.hash ได้โดยไม่ต้องเปิดใช้งานการรีเฟรช (แม้ว่าหน้าต่างจะข้ามไปถ้าแฮชของคุณตรงกับรหัสในหน้า")
Gabriel Hurley

3
ไม่มีการโหลดหน้าซ้ำ - ที่อยู่ในคำถาม นี่ไม่ใช่คำตอบที่ต้องการ / บังคับให้โหลดหน้าซ้ำ!
Ed_

10
ยังคิดว่าไม่ควรเป็นคำตอบ✓
abernier

4
นี่ไม่ใช่คำตอบสำหรับคำถาม OP
ไบรซ์

586

การแก้ปัญหานี้เป็นสิ่งที่เข้าถึงได้ยากในปัจจุบัน ประวัติ HTML5 APIช่วยให้เราสามารถจัดการกับแถบที่อยู่ที่จะแสดง URL ใด ๆ ภายในโดเมนปัจจุบัน

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

ตัวอย่างการทำงาน: http://jsfiddle.net/AndyE/ycmPt/show/

สามารถใช้งานได้ใน Chrome 9, Firefox 4, Safari 5, Opera 11.50 และ IE 10 สำหรับเบราว์เซอร์ที่ไม่รองรับคุณสามารถเขียนสคริปต์ที่เสื่อมโทรมอย่างสง่างามและใช้งานได้ทุกที่:

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;
    }
}

ดังนั้นคุณสามารถกำจัดสัญลักษณ์แฮชไม่ใช่เฉพาะในเบราว์เซอร์ทั้งหมดเท่านั้น

หมายเหตุ: ถ้าคุณต้องการที่จะเปลี่ยนหน้าปัจจุบันในประวัติศาสตร์ของเบราว์เซอร์ที่ใช้แทนreplaceState()pushState()


9
ใช้บรรทัดนี้เพื่อให้แน่ใจว่าคุณจะไม่สูญเสียสตริงข้อความค้นหา: history.pushState ("", document.title, window.location.pathname + window.location.search);
Phil Kulak

6
@Phil: ขอบคุณที่ชี้ให้เห็นว่าฉันได้ปรับปรุงคำตอบแล้ว ฉันคุ้นเคยกับการใช้ URL ที่น่ารัก
Andy E

1
สำหรับ IE เวอร์ชันเก่าดูเหมือนว่าคุณต้องใช้ document.documentElement แทนที่จะเป็น document.body ดูคำตอบนี้stackoverflow.com/a/2717272/359048
jasonmcclurg

29
ฉันขอแนะนำให้ใช้ replaceState แทน pushState เพื่อไม่ให้สร้างรายการพิเศษในประวัติเบราว์เซอร์
Nico

1
@santiagoarizti: ถูกต้องฉันเพิ่งมาถึงข้อสรุปเดียวกัน ฉันไม่ได้ตรวจสอบรหัสที่ฉันเขียน (7 ปีที่แล้ว!) อย่างถูกต้องและพลาดว่าฉันได้สลับสถานะของปุ่มเมื่อลบแฮช เนื่องจากคุณกำลังเปลี่ยนแฮชด้วยตนเองคุณจึงสามารถเรียกใช้เหตุการณ์ด้วยตัวเองได้ฉันคิดว่า
Andy E

85

(มีคำตอบมากเกินไปซ้ำซ้อนและล้าสมัย) ทางออกที่ดีที่สุดคือ:

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

5
ใช้history.pushState(null, null, ' ')แทนหากคุณต้องการเก็บประวัติ
nichijou

9
มันอาจมีประโยชน์ในการอธิบายสิ่งที่ผ่านnullสำหรับstateและtitleพารามิเตอร์ในที่สุด
V. Rubinetti

ปัญหาเกี่ยวกับสิ่งนี้และที่เหลือก็คือมันไม่ได้เรียก onhashchange แม้ว่าตอนนี้แฮชจะว่างเปล่าเมื่อไม่เคยมีมาก่อน
เคอร์ติส

1
ใน TypeScript ไม่อนุญาตให้ใช้ค่า null สำหรับพารามิเตอร์ที่สองเนื่องจากคำสั่งรับสตริง Mozilla แนะนำสตริงที่ว่างเปล่า
เคอร์ติส

41

เรียบง่ายและสง่างาม:

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

3
ใช้จุดแทนเครื่องหมายทับหากคุณต้องการอยู่ในไดเรกทอรีเดียวกัน
vahanpwns

1
กรุณาตอบอัปเดตเป็นเรื่องที่เกี่ยวกับโน้ต @vahanpwns เพื่อใช้แทน. /การใช้/เปลี่ยน url เป็นเส้นทางของรูท
Isaac Gregson

5
ขอบคุณสำหรับคำตอบนี้ฉันปรับเปลี่ยนเพื่อhistory.replaceState({}, document.title, location.href.substr(0, location.href.length-location.hash.length));กรณีการใช้งานของฉัน
Scott Jungwirth

5
สิ่งนี้ไม่เก็บรักษาข้อความค้นหา url
Vladislav Kostenko

2
กรณีการใช้งานของฉันก็เพื่อแทนที่แทนที่จะผลักดัน แต่สิ่งนี้ทำให้ฉันมีความหมายมากขึ้น:history.replaceState(null, document.title, location.pathname + location.search);
MDMower

16

หากต้องการลบแฮชคุณอาจลองใช้ฟังก์ชั่นนี้

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

นี่จะเป็นการลบแฮชตัวท้ายเช่นกัน เช่น: http://test.com/123#abc -> http://test.com/123

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

การดำเนินการนี้จะลบ
พารามิเตอร์การ

1
@kevgathuku คุณสามารถเพิ่มกลับด้วย location.search เช่น: `window.history.pushState ('', '/', window.location.pathname + window.location.search)`
Chris Gunawardena

6

แล้วเรื่องต่อไปนี้ล่ะ?

window.location.hash=' '

โปรดทราบว่าฉันกำลังตั้งค่าแฮชเป็นหนึ่งช่องว่างไม่ใช่สตริงว่าง


การตั้งค่าแฮชไปยังจุดยึดที่ไม่ถูกต้องจะไม่ทำให้เกิดการรีเฟรช เช่น,

window.location.hash='invalidtag'

แต่ฉันพบทางออกข้างต้นที่จะทำให้เข้าใจผิด สิ่งนี้ดูเหมือนจะบ่งบอกว่ามีจุดยึดในตำแหน่งที่กำหนดพร้อมชื่อที่กำหนดแม้ว่าจะไม่มี ในเวลาเดียวกันการใช้สตริงว่างทำให้หน้าเลื่อนไปด้านบนซึ่งไม่สามารถยอมรับได้ในบางครั้ง การใช้ช่องว่างยังช่วยให้มั่นใจได้ว่าเมื่อใดก็ตามที่คัดลอก URL และคั่นหน้าเว็บและเยี่ยมชมอีกครั้งหน้าจะอยู่ที่ด้านบนสุดและจะไม่มีการเว้นวรรค

และนี่คือคำตอบแรกของฉันใน StackOverflow หวังว่าใครบางคนพบว่ามันมีประโยชน์และมันตรงกับมาตรฐานชุมชน


7
การตั้งค่าแฮชเป็นช่องว่างยังคง # ไว้ที่ท้าย URL ฉันคิดว่าเป้าหมายคือการลบออกโดยสิ้นเชิง
mahemoff

1
มันแฮชเส้นทางในตอนท้ายของ URL คำถามคือวิธีลบนั้น
Gurmeet Singh

ใช่เราจะลบ # ด้วยสายอักขระแฮชได้อย่างไร
Bhavin Thummar

6

คุณสามารถทำได้ดังนี้:

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


1
คำตอบที่ติดดาวไม่ได้ผลสำหรับฉันไม่ว่าจะในกรณีใด แต่อันนี้ทำได้ ขอบคุณ!
Dev

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

2
ในขณะที่รหัสนี้อาจตอบคำถาม แต่มีบริบทเพิ่มเติมเกี่ยวกับสาเหตุและ / หรือวิธีการที่รหัสนี้ตอบคำถามช่วยปรับปรุงมูลค่าระยะยาว
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>

ใส่รหัสนี้ในส่วนหัว


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

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

2

ฉันคิดว่ามันจะปลอดภัยกว่านี้

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

0

ลองทำสิ่งต่อไปนี้:

window.history.back(1);

23
สิ่งนี้จะไม่ตอบคำถามหากผู้ใช้มาที่ URL โดยตรงรวมถึงแฮช
nickb

เคล็ดลับนี้มีประโยชน์มากเมื่อคุณต้องการสร้างลิงค์ไปยังหน้าก่อนหน้า แต่ลิงค์นั้นถูกซ่อนอยู่ในไฟล์ js จำนวนมาก
ValidfroM

สิ่งที่ฉันกำลังมองหา วิธีนี้ใช้งานได้ดีในการลบแฮชแท็กที่เพิ่งสร้างโดยเว็บแอปของฉันเพื่อใช้งานค่าที่ส่งคืนโดยฟังก์ชัน javasript
278859

0

นี่เป็นอีกวิธีในการเปลี่ยนตำแหน่งโดยใช้ href และล้างค่าแฮชโดยไม่ต้องเลื่อน

การแก้ปัญหาความมหัศจรรย์จะมีการอธิบายที่นี่ รายละเอียดที่นี่

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

หมายเหตุ: API ที่เสนอตอนนี้เป็นส่วนหนึ่งของ WhatWG HTML Living Standard



-1

คุณสามารถแทนที่แฮชด้วย null

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

1
คำถามถามว่า "ไม่ทำให้หน้ารีเฟรช" แต่วิธีนี้จะรีเฟรชหน้า คุณควรทราบข้อเท็จจริงนี้ในคำตอบของคุณดังนั้นเราไม่ต้องเสียเวลาไปกับการหาคำตอบว่าคุณกำลังตอบคำถามที่แตกต่างจากคำถามที่เรากำลังพยายามตอบอยู่ที่นี่
Vladimir Kornea

มันไม่รีเฟรชหน้า
Ciprian
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.