ฉันจะเปลี่ยน URL ปัจจุบันได้อย่างไร?


101

ฉันมีรหัสต่อไปนี้ที่เปลี่ยนหน้าจากภายใน JavaScript:

var newUrl = [some code to build up URL string];
window.location.replace(newUrl);

แต่จะไม่เปลี่ยน URL บนสุดดังนั้นเมื่อมีคนคลิกปุ่มย้อนกลับจะไม่กลับไปที่หน้าก่อนหน้า

ฉันจะให้ JavaScript เปลี่ยน URL บนสุดได้อย่างไรเพื่อให้ปุ่มย้อนกลับของเบราว์เซอร์ทำงาน

คำตอบ:



40

การกำหนดอย่างง่ายwindow.locationหรือwindow.location.hrefควรจะดี:

window.location = newUrl;

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

  1. ใช้แฮช URL ตัวอย่างเช่นคุณสามารถเปลี่ยนจากexample.comไปexample.com#fooโดยไม่ต้องโหลดหน้าใหม่ คุณสามารถตั้งค่าwindow.location.hashให้เป็นเรื่องง่ายได้ จากนั้นคุณควรฟังhashchangeเหตุการณ์HTML5 ซึ่งจะเริ่มทำงานเมื่อผู้ใช้กดปุ่มย้อนกลับ ไม่รองรับ IE เวอร์ชันเก่า แต่ลองดูjQuery BBQซึ่งทำให้ใช้งานได้ในทุกเบราว์เซอร์

  2. คุณสามารถใช้ประวัติ HTML5 เพื่อแก้ไขเส้นทางโดยไม่ต้องโหลดหน้าซ้ำ นี้จะช่วยให้คุณสามารถเปลี่ยนจากการexample.com/foo example.com/barการใช้สิ่งนี้เป็นเรื่องง่าย:

    window.history.pushState("example.com/foo");

    เมื่อผู้ใช้กด "ย้อนกลับ" คุณจะได้รับpopstateเหตุการณ์ของหน้าต่างซึ่งคุณสามารถฟัง (jQuery):

    $(window).bind("popstate", function(e) { alert("location changed"); });

    น่าเสียดายที่รองรับเฉพาะในเบราว์เซอร์รุ่นใหม่ ๆ เช่น Chrome, Safari และ Firefox 4 beta


เมธอด. replace บนสตริงจะไม่เปลี่ยนสตริงที่ใช้มันจะสร้างสตริงใหม่ " - window.location.replace()เมธอดไม่เหมือนกับString.prototype.replace()เมธอดเพราะwindow.locationไม่ใช่สตริง (เป็นอ็อบเจกต์) window.location.replace()แทนที่ปัจจุบัน ด้วย URL ใหม่ในขณะที่เขียนทับรายการ URL เก่าในประวัติ
Andy E

1
ขอบคุณสำหรับการแก้ไขเราจะอัปเดตคำตอบตามนั้น
bcherry

2
เมื่อมองย้อนกลับไปนี่เป็นคำตอบที่ดีที่สุด document.location.href ไม่มีอะไรใน pushState
buley


7

หากคุณต้องการอัปเดตเส้นทางสัมพัทธ์คุณสามารถทำได้

window.location.pathname = '/relative-link'

"http://domain.com" -> "http://domain.com/relative-link"


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