TL; DR
1- การปรับเปลี่ยน URL ปัจจุบันและเพิ่ม / ฉีดมัน(URL ที่ปรับเปลี่ยนใหม่)เป็นรายการ URL ใหม่ในรายการประวัติใช้pushState
:
window.history.pushState({}, document.title, "/" + "my-new-url.html");
2- ในการแทนที่ URL ปัจจุบันโดยไม่ต้องเพิ่มลงในรายการประวัติให้ใช้replaceState
:
window.history.replaceState({}, document.title, "/" + "my-new-url.html");
3- ทั้งนี้ขึ้นอยู่บนตรรกะทางธุรกิจ , pushState
จะเป็นประโยชน์ในกรณีเช่น:
คุณต้องการสนับสนุนปุ่มย้อนกลับของเบราว์เซอร์
คุณต้องการที่จะสร้างใหม่ URL, เพิ่ม / แทรก / ผลักดันURL ใหม่เพื่อประวัติศาสตร์รายการและทำให้มัน URL ปัจจุบัน
อนุญาตให้ผู้ใช้บุ๊กมาร์กหน้าด้วยพารามิเตอร์เดียวกัน (เพื่อแสดงเนื้อหาเดียวกัน)
โปรแกรมเข้าถึงข้อมูลผ่านstateObj
แล้วแยกจากสมอ
ตามที่ฉันเข้าใจจากความคิดเห็นของคุณคุณต้องการล้าง URL โดยไม่เปลี่ยนเส้นทางอีกครั้ง
โปรดทราบว่าคุณไม่สามารถเปลี่ยน URL ทั้งหมดได้ คุณสามารถเปลี่ยนสิ่งที่เกิดขึ้นหลังจากชื่อโดเมน ซึ่งหมายความว่าคุณไม่สามารถเปลี่ยนแปลงได้www.example.com/
แต่คุณสามารถเปลี่ยนแปลงสิ่งที่ตามมาได้.com/
www.example.com/old-page-name => can become => www.example.com/myNewPaage20180322.php
พื้นหลัง
เราสามารถใช้:
1- เมธอด pushState ()หากคุณต้องการเพิ่มURL ที่แก้ไขใหม่ในรายการประวัติ
2- เมธอด replaceState ()หากคุณต้องการอัปเดต / แทนที่รายการประวัติปัจจุบัน
.replaceState()
ดำเนินการเหมือนกับ.pushState()
ยกเว้นที่.replaceState()
แก้ไขรายการประวัติปัจจุบันแทนที่จะสร้างรายการใหม่ โปรดทราบว่านี่ไม่ได้ป้องกันการสร้างรายการใหม่ในประวัติเบราว์เซอร์ทั่วโลก
.replaceState()
มีประโยชน์อย่างยิ่งเมื่อคุณต้องการอัปเดตวัตถุสถานะหรือURLของรายการประวัติปัจจุบันเพื่อตอบสนองต่อการกระทำของผู้ใช้
รหัส
ในการทำเช่นนั้นฉันจะใช้เมธอด pushState ()สำหรับตัวอย่างนี้ซึ่งทำงานคล้ายกับรูปแบบต่อไปนี้:
var myNewURL = "my-new-URL.php";//the new URL
window.history.pushState("object or string", "Title", "/" + myNewURL );
อย่าลังเลที่จะแทนที่pushState
ด้วยreplaceState
ตามความต้องการของคุณ
คุณสามารถใช้แทนพารามิเตอร์"object or string"
ด้วย{}
และ"Title"
ด้วยdocument.title
ดังนั้นงบสุดท้ายจะกลายเป็น:
window.history.pushState({}, document.title, "/" + myNewURL );
ผล
โค้ดสองบรรทัดก่อนหน้านี้จะสร้าง URL เช่น:
https://domain.tld/some/randome/url/which/will/be/deleted/
ที่จะเป็น:
https://domain.tld/my-new-url.php
หนังบู๊
ตอนนี้เราลองใช้วิธีอื่น สมมติว่าคุณต้องการเก็บชื่อไฟล์ ชื่อไฟล์มาหลังจากที่ผ่านมาและก่อนสตริงการสืบค้น/
?
http://www.someDomain.com/really/long/address/keepThisLastOne.php?name=john
จะ:
http://www.someDomain.com/keepThisLastOne.php
บางสิ่งเช่นนี้จะทำให้การทำงาน:
//fetch new URL
//refineURL() gives you the freedom to alter the URL string based on your needs.
var myNewURL = refineURL();
//here you pass the new URL extension you want to appear after the domains '/'. Note that the previous identifiers or "query string" will be replaced.
window.history.pushState("object or string", "Title", "/" + myNewURL );
//Helper function to extract the URL between the last '/' and before '?'
//If URL is www.example.com/one/two/file.php?user=55 this function will return 'file.php'
//pseudo code: edit to match your URL settings
function refineURL()
{
//get full URL
var currURL= window.location.href; //get current address
//Get the URL between what's after '/' and befor '?'
//1- get URL after'/'
var afterDomain= currURL.substring(currURL.lastIndexOf('/') + 1);
//2- get the part before '?'
var beforeQueryString= afterDomain.split("?")[0];
return beforeQueryString;
}
UPDATE:
สำหรับแฟนซับหนึ่งคนลองใช้สิ่งนี้ในคอนโซล / firebug ของคุณและ URL หน้านี้จะเปลี่ยนไป:
window.history.pushState("object or string", "Title", "/"+window.location.href.substring(window.location.href.lastIndexOf('/') + 1).split("?")[0]);
URL หน้านี้จะเปลี่ยนจาก:
http://stackoverflow.com/questions/22753052/remove-url-parameters-without-refreshing-page/22753103#22753103
ถึง
http://stackoverflow.com/22753103#22753103
หมายเหตุ:เป็นซามูเอล LiewHTML5
ที่ระบุไว้ในความคิดเห็นด้านล่างคุณสมบัตินี้ได้รับการแนะนำเฉพาะสำหรับ
อีกวิธีหนึ่งคือการเปลี่ยนเส้นทางหน้าเว็บของคุณ (แต่คุณจะสูญเสียสตริงข้อความค้นหา `? 'มันยังคงต้องการหรือมีการประมวลผลข้อมูลหรือไม่)
window.location.href = window.location.href.split("?")[0]; //"http://www.newurl.com";