ลบพารามิเตอร์ URL โดยไม่ต้องรีเฟรชหน้า


153

ฉันกำลังพยายามลบทุกอย่างหลังจาก "?" ในเบราว์เซอร์ url บนเอกสารพร้อม

นี่คือสิ่งที่ฉันพยายาม:

jQuery(document).ready(function($) {

var url = window.location.href;
    url = url.split('?')[0];
});

ฉันสามารถทำสิ่งนี้และดูการทำงานด้านล่าง:

jQuery(document).ready(function($) {

var url = window.location.href;
    alert(url.split('?')[0]);
});

มีสองรูปแบบในหนึ่งหน้าและเมื่อมีการส่งแบบฟอร์มหนึ่งจะเพิ่มผลิตภัณฑ์ในรถเข็นและผนวกพารามิเตอร์แบบยาวเข้ากับ url หลังจากรีเฟรชหน้า ดังนั้นฉันต้องการลบพารามิเตอร์นั้นเมื่อเอกสารพร้อมและเริ่มต้นด้วย?
Derek

1
หากคุณต้องการรีเฟรชหน้าทำไมรอ.ready()? คุณไม่จำเป็นต้องรอเพื่อเปลี่ยนเส้นทางไปยัง URL ใหม่หรือใช้.pushState()ตามที่ Joraid แนะนำ
jfriend00

คำตอบ:


227

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


2
คุณลืมที่จะพูดถึงว่านี่เป็นคุณสมบัติ HTML5 เท่านั้น developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/…
Samuel Liew

ทำไมคุณต้องลอกออกจากเครื่องหมายทับสุดท้าย? สิ่งนี้เกี่ยวข้องกับคำถามของ OP อย่างไร พวกเขาต้องการกำจัดสตริงข้อความค้นหา เครื่องหมายคำถามแรกกำหนดจุดเริ่มต้นของสตริงแบบสอบถาม
jfriend00

6
replaceStateดูเหมือนจะเหมาะสมกว่า แต่pushStateจะใช้งานได้ดีนั่นคือจนกว่าคุณจะเริ่มคลิกปุ่มย้อนกลับและไปข้างหน้าในเบราว์เซอร์และคุณรู้ว่ามีเหตุผลว่ามีไลบรารีทั้งหมดสำหรับการทำงานกับ History API
adeneo

@ jfriend00 ตามพฤติกรรมของฟังก์ชั่นสิ่งที่คุณเพิ่มในพารามิเตอร์ที่สามจะถูกวางใน URL หลังชื่อโดเมนหมายถึงหลังจากโดเมน / ใน www.example.com/ มีโอกาสที่ OP อาจมีหลาย / ระหว่างชื่อโดเมนและ? ในกรณีที่เว็บไซต์อยู่ในไดเรกทอรีย่อยดังนั้นจึงขึ้นอยู่กับเขา / เธอที่จะสร้างความตื่นเต้นและทำการปรับแต่ง URL ให้ดีขึ้นเนื่องจากคำถามเกี่ยวกับวิธีการกระตุ้น URL ตอนนี้วิธีการทำให้ถูกต้อง
Mohammed Joraid

ฉันแค่บอกว่าคุณไม่ต้องการสิ่งนี้url.substring(url.lastIndexOf('/') + 1);เลย url.split("?")[0]จะได้รับส่วนก่อนเครื่องหมายคำถามแรกซึ่งเป็นสิ่งที่ฉันคิดว่า OP ขอ คำถามของ OP ถามว่า: "ฉันพยายามลบทุกอย่างหลังจาก"? "ใน URL เบราว์เซอร์"
jfriend00

158

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

window.history.replaceState(null, null, window.location.pathname);

3
KISS (Keep โง่และเรียบง่าย) OP ขอให้ลบทั้งหมดหลังจาก และนี่คือคำตอบที่ง่ายที่สุดที่คุณจะได้รับจากสิ่งที่เขาขอ!
Warface

ไม่ได้ทำงานกับ firefox ในการรีเฟรชรับพารามิเตอร์ยังคงปรากฏขึ้น ใช้งานได้ทั้งการกดและการแทนที่ window.history.replaceState ({หน้า: location.pathname}, document.title, window.location.pathname); window.history.pushState ({หน้า: location.pathname}, document.title, window.location.pathname);
Ajay Singh

1
history.replaceState (null, null, location.pathname + location.hash) - location.hash เพิ่มถ้าคุณไม่ต้องการที่จะลบว่าเป็นส่วนหนึ่ง
eselk

29

วิธีง่ายๆในการทำเช่นนี้ใช้ได้กับทุกหน้าต้องใช้ HTML 5

// get the string following the ?
var query = window.location.search.substring(1)

// is there anything there ?
if(query.length) {
   // are the new history methods available ?
   if(window.history != undefined && window.history.pushState != undefined) {
        // if pushstate exists, add a new state to the history, this changes the url without reloading the page

        window.history.pushState({}, document.title, window.location.pathname);
   }
}

มันใช้งานได้ดีอย่างน่าอัศจรรย์ น่าเสียดายที่ฉันไม่มีเงื่อนงำแรกว่าทำไมมันถึงทำงาน ขอบคุณทุกคนเหมือนกัน
Matt Cremeens

1
สองบรรทัดแรกตรวจสอบว่ามีอะไรหลังจาก? (ซับสตริงเพิ่งลบ '?') จากนั้นฉันตรวจสอบว่าเบราว์เซอร์รองรับการโทรแบบใหม่หรือไม่และสุดท้ายฉันใช้ pushstate เพื่อเพิ่มสถานะลงในสแต็กของ URL (คุณสามารถกดและป๊อปอัพ URL บนสแต็กนั้น) .pathname เป็น url ท้องถิ่นลบด้วยการค้นหาและลบชื่อโดเมนและคำนำหน้า ( domain.com/THIS?notthis )
Martijn Scheffer


23

ฉันเชื่อว่าวิธีที่ดีที่สุดและง่ายที่สุดสำหรับสิ่งนี้คือ:

var newURL = location.href.split("?")[0];
window.history.pushState('object', document.title, newURL);

11

หากฉันมีแท็กพิเศษที่ท้าย URL ของฉันเช่น: http://domain.com/?tag=12345 นี่คือรหัสด้านล่างเพื่อลบแท็กนั้นเมื่อใดก็ตามที่มีอยู่ใน URL:

<script>
// Remove URL Tag Parameter from Address Bar
if (window.parent.location.href.match(/tag=/)){
    if (typeof (history.pushState) != "undefined") {
        var obj = { Title: document.title, Url: window.parent.location.pathname };
        history.pushState(obj, obj.Title, obj.Url);
    } else {
        window.parent.location = window.parent.location.pathname;
    }
}
</script>

สิ่งนี้ทำให้แนวคิดในการลบพารามิเตอร์ (หรือทั้งหมด) อย่างน้อยหนึ่งพารามิเตอร์ออกจาก URL

ด้วยwindow.location.pathnameคุณจะได้รับทุกอย่างก่อน '?' ใน url

var pathname = window.location.pathname; // ส่งคืนพา ธ เท่านั้น

var url = window.location.href; // ส่งคืน URL แบบเต็ม


ฉันไม่แน่ใจว่านี่เป็นการตอบคำถาม แต่คำถามนั้นไม่ชัดเจน :)
Martijn Scheffer

@MartijnScheffer ใช่ฉันปรับปรุงคำตอบเพื่อตอบคำถามเดิมขอบคุณสำหรับบันทึก
Tarik

10

successผมอยากจะเอาเพียงหนึ่งพระราม นี่คือวิธีที่คุณสามารถทำได้:

let params = new URLSearchParams(location.search)
params.delete('success')
history.replaceState(null, '', '?' + params + location.hash)

#hashนอกจากนี้ยังคงมี


URLSearchParamsจะไม่ทำงานใน IE แต่การทำงานในขอบ คุณสามารถใช้ polyfillหรือ a สามารถใช้ฟังก์ชันnaïve helper สำหรับการรองรับ IE:

function take_param(key) {
    var params = new Map(location.search.slice(1).split('&')
        .map(function(p) { return p.split(/=(.*)/) }))   
    var value = params.get(key)
    params.delete(key)
    var search = Array.from(params.entries()).map(
        function(v){ return v[0]+'='+v[1] }).join('&')
    return {search: search ? '?' + search : '', value: value}
}

สามารถใช้เช่น:

history.replaceState(
    null, '', take_param('success').search + location.hash)

ทางออกที่ดีมีวิธีใดที่จะไม่เพิ่ม '?' ถ้าไม่มีการส่งต่อพารามิเตอร์?
ricks

2
@RickS แน่นอนtake_paramอยู่แล้วว่าทำ แต่คุณสามารถทำให้การทำเช่นเดียวกันโดยการทำ:URLSearchParams history.replaceState(null, '', (params ? '?' + params : '') + location.hash)หรืออย่างไรก็ตามคุณชอบ
odinho - Velmont


6

วิธีแก้ปัญหาเหล่านี้ไม่ได้ผลสำหรับฉันนี่คือฟังก์ชั่นที่เข้ากันได้กับ IE11 ซึ่งสามารถลบพารามิเตอร์หลายตัวได้:

/**
* Removes URL parameters
* @param removeParams - param array
*/
function removeURLParameters(removeParams) {
  const deleteRegex = new RegExp(removeParams.join('=|') + '=')

  const params = location.search.slice(1).split('&')
  let search = []
  for (let i = 0; i < params.length; i++) if (deleteRegex.test(params[i]) === false) search.push(params[i])

  window.history.replaceState({}, document.title, location.pathname + (search.length ? '?' + search.join('&') : '') + location.hash)
}

removeURLParameters(['param1', 'param2'])

2
//Joraid code is working but i altered as below. it will work if your URL contain "?" mark or not
//replace URL in browser
if(window.location.href.indexOf("?") > -1) {
    var newUrl = refineUrl();
    window.history.pushState("object or string", "Title", "/"+newUrl );
}

function refineUrl()
{
    //get full url
    var url = window.location.href;
    //get url after/  
    var value = url = url.slice( 0, url.indexOf('?') );
    //get the part after before ?
    value  = value.replace('@System.Web.Configuration.WebConfigurationManager.AppSettings["BaseURL"]','');  
    return value;     
}

1

หากต้องการล้างพารามิเตอร์ทั้งหมดโดยไม่ต้องรีเฟรชหน้าและหากคุณใช้ HTML5 คุณสามารถทำได้ดังนี้:

history.pushState({}, '', 'index.html' ); //replace 'index.html' with whatever your page name is

จะเป็นการเพิ่มรายการในประวัติเบราว์เซอร์ คุณสามารถพิจารณาได้replaceStateหากคุณไม่ต้องการเพิ่มรายการใหม่และต้องการเปลี่ยนรายการเก่า


0

ใน jquery ใช้ <

window.location.href =  window.location.href.split("?")[0]

6
ไม่มีอะไร jQuery เกี่ยวกับเรื่องนั้น
j08691

0

นี่คือซับ ES6 หนึ่งที่เก็บรักษาแฮชตำแหน่งและไม่ทำให้ประวัติเบราว์เซอร์สกปรกโดยใช้replaceState:

(l=>{window.history.replaceState({},'',l.pathname+l.hash)})(location)

คุณสามารถเพิ่มข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ยากที่จะเข้าใจว่าสิ่งนี้กำลังทำอะไรอยู่
ricks

2
@RickS มันเป็น IIFE (เรียกใช้ฟังก์ชั่นการแสดงออกทันที) นั่นเป็นเหตุผลว่าทำไมมันถึงอยู่ในวงเล็บ () (ตำแหน่ง) วงเล็บแรกทำให้มันสามารถอยู่ในตัวมันเองในฐานะฟังก์ชั่นนิรนาม (ตำแหน่ง) ในตอนท้ายวัตถุlocationaka ทั่วโลกwindow.locationดังนั้นฟังก์ชั่นสามารถเข้าถึง globals ได้locationเนื่องจากlส่วนที่เหลือเป็น replaceState ขั้นพื้นฐานเช่นเดียวกับคำตอบอื่น ๆ ทั้งหมดเขาได้ทำการเชื่อมโยงชื่อพา ธ และแฮช (example.com/#hash) เป็น URL ใหม่ หวังว่ามันจะย่อยได้ถ้าไม่แจ้งให้ฉันทราบ😉
สามารถ Rau

@Can ทำไมไม่เพียงแค่ใช้window.history.replaceState({}, '', location.pathname + location.hash)? ;)
Fabian von Ellerts

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