페이지를 새로 고치지 않고 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- 히스토리 항목에 새로운 수정 된 URL을 추가하려는 경우 pushState () 메소드 .

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

대체 자유롭게 pushStatereplaceState요구 사항에 따라.

paramter "object or string"{}and "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;     
}

최신 정보:

한 라이너 팬의 경우, 콘솔 / 파이어 버그에서 이것을 시도하면이 페이지 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

참고 :사무엘 Liew는 아래의 의견에 표시된,이 기능 만 도입되었습니다 HTML5.

다른 방법은 실제로 페이지를 리디렉션하는 것입니다 (그러나 쿼리 문자열 '?'을 잃어 버릴 수 있습니다. 여전히 필요하거나 데이터가 처리 되었습니까?).

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, 세 번째 매개 변수에 추가 한 내용은 도메인 이름 다음에, 즉 도메인 뒤 /www.example.com/에서와 같이 URL에 배치됩니다. OP에 도메인 이름과? 사이에 여러 개의 /가있을 수 있습니다. 웹 사이트가 하위 디렉토리에있는 경우 URL을 채취하는 방법에 대한 질문이 있었으므로 이제는 올바르게 가져 오는 방법에 대한 질문이 있었으므로 URL을 수정하고 더 잘 개선해야합니다.
모하메드 조 라드

나는 당신이 전혀 필요하지 않다고 말하고 있습니다 url.substring(url.lastIndexOf('/') + 1);. url.split("?")[0]OP가 요청한 것으로 생각되는 첫 번째 물음표 앞에 부분이 표시됩니다. OP의 질문은 "브라우저 URL에서"? "뒤에있는 모든 것을 제거하려고합니다"입니다.
jfriend00

158

이것들은 모두 오해의 소지가 있으므로 단일 페이지 앱에서 다른 페이지로 이동하지 않는 한 브라우저 기록에 추가하고 싶지 않습니다. 페이지를 변경하지 않고 매개 변수를 제거하려면 다음을 사용해야합니다.

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

3
KISS (계속 바보 같은 간단한). OP는? 그리고 이것은 당신이 그가 요구 한 것에 대해 얻을 수있는 가장 간단한 대답입니다!
Warface

파이어 폭스에서 작동하지 않았습니다. 새로 고칠 때 get 매개 변수가 계속 나타납니다. 푸시와 바꾸기를 모두 사용합니다. 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);
   }
}

이것은 놀랍게 잘 작동합니다. 불행히도, 왜 그것이 작동하는지에 대한 첫 번째 단서가 없습니다. 모두 감사합니다.
매트 Cremeens

1
처음 두 줄은? 뒤에 아무 것도 없는지 확인합니다. (substring은 '?'를 제거합니다) 그런 다음 브라우저가 새로운 pushstate 호출을 지원하는지 확인하고 마지막으로 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.


URLSearchParamsIE에서는 작동하지 않지만 Edge에서는 작동합니다 . 당신은 할 수 polyfill을 사용 하거나이 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

8

더 나은 솔루션 :

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

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

다음은 위치 해시를 보존하고 replaceState다음 을 사용하여 브라우저 기록을 오염시키지 않는 ES6 one liner입니다 .

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

이것에 대해 더 많은 정보를 추가 할 수 있습니까, 이것이 무엇을하는지 이해하기 어렵습니다.
Ricks

2
@RickS IIFE (즉시 호출 된 함수 표현식)이므로 괄호로 묶인 이유는 () (위치) 첫 번째 괄호는 익명 함수로 자신을 유지할 수있게하고 끝에 (위치)는 즉시 전달하는 함수를 호출합니다 글로벌 location일명 window.location함수가 전역에 액세스 할 수 있도록 객체는, locationl, 나머지는 모두 다른 답변에서와 같이 기본 replaceState이, 그는 새로운 URL로 경로와 해시 (example.com/#hash)를 합치입니다. 그것이 알려지지 않으면 소화
할 수

@ 왜 그냥 사용할 수 window.history.replaceState({}, '', location.pathname + location.hash)없습니까? ;)
Fabian von Ellerts

@FabianvonEllerts 실제로 좋은 질문입니다. 실제로 location두 번 쓸 필요는 없지만 😁 변수에 할당 할 필요가 없거나 Joey에 더 있습니까?
Can Rau
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.