it-roy-ru.com

Как я могу удалить строку запроса из URL после загрузки страницы?

У меня есть URL с прикрепленной к нему длинной строкой запроса . После загрузки страницы мне не требуется строка запроса. Поэтому я хочу удалить строку запроса из адресной строки без перезагрузки страницы.

Я пробовал parent.location.hash = ''; и window.location.href = '/#'

Они не имели значения.

23
Sangam254

Вы не можете сделать это без перезагрузки страницы, представьте, если бы вы могли поместить все, что вы хотели в адресной строке браузера? Безопасность весело :)

Хотя теперь вы можете сделать это в HTML5 (который будет работать только в браузерах, поддерживающих его), используя новый history API , но реально ваш сценарий лучше всего переписать вместо того, чтобы включить его (кажется, кувалдой взломать орех).

Поскольку вы сказали, что вам не нужна строка запроса после загрузки страницы, вы должны действительно отослать обратно, а затем перенаправить на другой URL-адрес после завершения обработки.

7
mattytommo

Как уже говорили другие, вы можете сделать это с помощью History API в современных браузерах (IE10 +, FF4 +, Chrome5 +). В ответах не было полного примера, поэтому я решил поделиться своим решением, поскольку у меня просто было требование сделать то же самое:

history.pushState(null, "", location.href.split("?")[0]);

Если вы используете Modernizr , вы также можете проверить, доступен ли History API, следующим образом:

if (Modernizr.history) {
    history.pushState(null, "", location.href.split("?")[0]);
}
36
germankiwi

Это достижимо в современных браузерах с использованием истории API , но, вероятно, не является лучшим решением вашей проблемы.

history.replaceState({}, 'some title', '/');

Похоже, вам лучше обработать данные и затем перенаправить на домашнюю страницу, а не возвращать HTML-документ напрямую.

Поскольку вы не хотите хранить URL-адрес, он не будет полезен для создания закладок, поэтому вполне вероятно, что вам будет лучше сделать запрос POST.

Это говорит о том, что вы должны использовать шаблон POST-Redirect-GET .

16
Quentin

Используйте history.replaceState({}, "Title", "page.html");

тот же синтаксис для pushState. Однако вам нужно будет найти способ заставить IE это понять.

Лучшим способом было бы использовать модуль Apache mod_rewrite. Это довольно просто в использовании.

2
d4rkpr1nc3

Я столкнулся с той же проблемой. Мое решение было таким: Получить запрос, как это:

operation.aspx?opr=lock

После завершения операции перенаправьте так:

Response.Redirect("operation.aspx");

В ответе, если есть какое-либо сообщение, я печатаю их так:

if (Session["InfoMessages"] != null)
{
    lblMessage.Text = (string)Session["InfoMessages"];
    Session["InfoMessages"] = null;
}

Я надеюсь, что это поможет другим :)

0
Recev Yildiz

Обновлен код Теперь он будет работать

Просто добавьте ниже код на вашей странице, ссылку которой вы хотите изменить.

// javascript function

   function buildLin(first) {
    var firs = first.toString()
       //alert(firs);
       //document.getElementById("team").value = "1";
           document.location.hash = "#" + firs.replace(/ /g, "_");
        //alert(document.location.hash);
    }

 //jQuery to call above function after page loads

  $(document).ready(function () {
      buildLin(2);
  });

Не забудьте добавить http://code.jquery.com/jquery-latest.js на вашей странице

0
Code Spy

Я хочу добавить еще один способ сделать это, особенно для тех, кто использует $routeProvider

Как уже упоминалось в некоторых других ответах, вы делаете это с помощью:

var yourCurrentUrl = window.location.href.split('?')[0]; 
window.history.replaceState({}, '', yourCurrentUrl ); 

или создав новую запись в стеке истории:

window.history.pushState({}, '', yourCurrentUrl );  

Чтобы получить очень подробное и приятное объяснение работы с history.pushState и history.replaceState, вы можете прочитать этот пост в SO

ОДНАКО, если вы используете Angular$routeProvider в своем приложении, оно все равно сохранит это изменение, если оно будет соответствовать любому существующему шаблону. Чтобы избежать этого, убедитесь, что ваш $routeProvider имеет reloadOnSearch flag установлен в false, потому что по умолчанию это true.

Например:

$routeProvider.when("/path/to/my/route",{
   controller: 'MyController',
   templateUrl: '/path/to/template.html',
   //Secret Sauce
   reloadOnSearch: false//Make sure this is explicitly set to false
});
0
curiousBoy

Я использую этот фрагмент кода в своих личных проектах, где мне нужно удалить параметры URL без перезагрузки:

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