web-dev-qa-db-fra.com

Comment puis-je supprimer la chaîne de requête de l'URL après le chargement de la page?

J'ai une URL à laquelle est attachée une longue chaîne de requête . Après le chargement de la page, je n'ai plus besoin de la chaîne de requête. Je souhaite donc supprimer la chaîne de requête de la barre d'adresse sans recharger la page.

J'ai essayé parent.location.hash = ''; et window.location.href = '/#'

Ils n'ont pas fait de différence.

23
Sangam254

Vous ne pouvez pas faire cela sans recharger la page, imaginez si vous pouviez mettre ce que vous vouliez dans la barre d'adresse du navigateur? Sécurité amusante :)

Bien que vous puissiez maintenant le faire en HTML5 (qui ne fonctionnera que sur les navigateurs le supportant) en utilisant la nouvelle API history , mais de manière réaliste, votre scénario mérite mieux une réécriture au lieu de l'inclure une noix).

Comme vous avez dit que vous n'avez pas besoin de la chaîne de requête après le chargement de la page, vous devriez vraiment publier, puis redirigé vers une autre URL après avoir terminé votre traitement.

7
mattytommo

Comme d'autres l'ont déjà dit, vous pouvez le faire à l'aide de la History API dans les navigateurs modernes (IE10 +, FF4 +, Chrome5 +). Il n'y avait pas d'exemple complet dans les réponses, alors je me suis dit que je partagerais ma solution, car je devais simplement faire la même chose:

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

Si vous utilisez Modernizr , vous pouvez également vérifier si l’API de l’historique est disponible, comme suit:

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

Ceci est réalisable dans les navigateurs modernes en utilisant l'historique api , mais ce n'est probablement pas la meilleure solution à votre problème.

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

Il semble que vous feriez mieux de traiter les données, puis de les rediriger vers la page d'accueil au lieu de renvoyer directement un document HTML.

Étant donné que vous ne souhaitez pas conserver l'URL, elle ne sera pas utile pour la création de signets. Il est donc fort probable que vous feriez mieux de faire une demande POST.

Cela suggère que vous devriez utiliser le modèle POST-Redirect-GET .

16
Quentin

Utilisez history.replaceState({}, "Title", "page.html");

même syntaxe pour pushState. Cependant, vous devrez trouver un moyen de faire comprendre cela à IE.

Un meilleur moyen serait d'utiliser Apache mod_rewrite module. C'est assez facile à utiliser.

2
d4rkpr1nc3

J'ai rencontré le même problème. Ma solution était la suivante: Obtenez la demande comme ceci:

operation.aspx?opr=lock

Après avoir terminé l'opération, redirigez comme ceci:

Response.Redirect("operation.aspx");

Dans la réponse, s'il y a un message, je les imprime comme ceci:

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

J'espère que ça va aider les autres :)

0
Recev Yildiz

Code mis à jour Maintenant, ça va marcher

Ajoutez simplement le code ci-dessous dans la page dont vous souhaitez modifier le lien.

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

N'oubliez pas d'ajouter http://code.jquery.com/jquery-latest.js sur votre page

0
Code Spy

Je veux ajouter une autre façon de faire cela, en particulier pour ceux qui utilisent $routeProvider

Comme cela a été mentionné dans d'autres réponses, vous le faites en utilisant:

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

ou en créant un nouvel enregistrement dans la pile d'historique:

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

Pour une explication très détaillée et intéressante sur l'utilisation de history.pushState et history.replaceState, vous pouvez lire ce message sur SO

TOUTEFOIS si vous utilisez Angular$routeProvider dans votre application, alors cette modification restera capturée si cela correspond à un modèle existant. Pour éviter cela, assurez-vous que $routeProvider a reloadOnSearch flag défini sur false car, par défaut, il s'agit de true.

Par exemple:

$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

J'utilise cet extrait de code dans mes projets personnels où je dois supprimer les paramètres d'URL sans recharger:

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