Quelle est la différence entre window.location = et window.location.replace ()?

Réponses:

408

window.location ajoute un élément à votre historique en ce que vous pouvez (ou devriez pouvoir) cliquer sur "Retour" et revenir à la page actuelle.

window.location.replace remplace l'élément d'historique actuel afin que vous ne puissiez pas y revenir.

Voir window.location:

assign(url): Chargez le document à l'URL fournie.

replace(url): Remplacez le document actuel par celui de l'URL fournie. La différence avec la assign()méthode est qu'après avoir utilisé replace()la page actuelle ne sera pas enregistrée dans l'historique de session, ce qui signifie que l'utilisateur ne pourra pas utiliser le bouton Retour pour y accéder.

Oh et d'une manière générale:

window.location.href = url;

est préféré à:

window.location = url;
cletus
la source
52
Pourquoi serait- window.location.hrefil préféré window.location?
Mathias Bynens
13
Discussion ici: stackoverflow.com/questions/2383401/…
goodeye
1
Question - Si j'utilise window.location.replace(URL)où l'URL est exactement la même que l'URL actuelle, puis-je m'attendre à ce qu'elle soit actualisée / rechargée ou a-t-elle la possibilité de ne rien faire?
user9645
11

TLDR;

utiliser location.hrefou mieux utiliser window.location.href;

Cependant, si vous lisez ceci, vous obtiendrez une preuve indéniable.

La vérité est que c'est bien à utiliser, mais pourquoi faire des choses qui sont discutables. Vous devriez prendre la route la plus élevée et faire comme vous le feriez probablement.

location = "#/mypath/otherside"
var sections = location.split('/')

Ce code est parfaitement correct au niveau de la syntaxe, de la logique, du type, vous savez la seule chose qui ne va pas?

il a locationau lieu delocation.href

Et ça

var mystring = location = "#/some/spa/route"

quelle est la valeur de mystring? est-ce que quelqu'un sait vraiment sans faire de test. Personne ne sait ce qui se passera exactement ici. Enfer je viens d'écrire ceci et je ne sais même pas ce que ça fait. locationest un objet mais j'attribue une chaîne s'il passera la chaîne ou passera l'objet de localisation. Disons qu'il y a une réponse à la façon dont cela devrait être mis en œuvre. Pouvez-vous garantir que tous les navigateurs feront la même chose?

Je peux à peu près deviner que tous les navigateurs géreront la même chose.

var mystring = location.href = "#/some/spa/route"

Que se passe-t-il si vous placez cela en tapuscrit, cela se cassera-t-il parce que le compilateur de type dira que c'est supposé être un objet?

Cette conversation est cependant beaucoup plus profonde que le simple locationobjet. Quelle est cette conversion sur le type de programmeur que vous voulez être?

Si vous prenez ce raccourci, oui ça pourrait aller bien aujourd'hui, ça pourrait aller bien demain, bon sang ça pourrait aller bien pour toujours, mais vous, monsieur, vous êtes maintenant un mauvais programmeur. Ce ne sera pas bien pour vous et cela vous fera défaut.

Il y aura plus d'objets. Il y aura une nouvelle syntaxe.

Vous pouvez définir un getter qui ne prend qu'une chaîne mais renvoie un objet et le pire est que vous penserez que vous faites quelque chose de correct, vous pourriez penser que vous êtes brillant pour cette méthode intelligente parce que les gens ici vous ont honteusement induit en erreur.

var Person.name = {first:"John":last:"Doe"}
console.log(Person.name) // "John Doe"

Avec les getters et les setters, ce code fonctionnerait réellement, mais ce n'est pas parce qu'il peut être fait que c'est `` WISE '' de le faire.

La plupart des gens qui programment adorent programmer et aiment s'améliorer. Au cours des dernières années, je suis devenu assez bon et j'ai beaucoup appris. La chose la plus importante que je connaisse maintenant, surtout lorsque vous écrivez des bibliothèques, c'est la cohérence et la prévisibilité.

Faites les choses que vous pouvez faire régulièrement.

+"2"<- ceci analyse ici la chaîne en un nombre. devez-vous l'utiliser? ou devez-vous utiliser parseInt("2")?

qu'en est-il var num =+"2"?

D'après ce que vous avez appris, dans l'esprit de stackoverflow, je ne suis pas trop, espérons-le.

Si vous commencez à suivre ces 2 mots cohérents et prévisibles. Vous saurez la bonne réponse à une tonne de questions sur stackoverflow.

Permettez-moi de vous montrer comment cela porte ses fruits. Normalement, je place ;sur chaque ligne de javascript que j'écris. Je sais que c'est plus expressif. Je sais que c'est plus clair. J'ai suivi mes règles. Un jour, j'ai décidé de ne pas le faire. Pourquoi? Parce que beaucoup de gens me disent que ce n'est plus nécessaire et que JavaScript peut s'en passer. Alors j'ai décidé de faire ça. Maintenant, parce que je suis devenu sûr de moi-même en tant que programmeur (comme vous devriez apprécier le fruit de la maîtrise d'une langue), j'ai écrit quelque chose de très simple et je ne l'ai pas vérifié. J'ai effacé une virgule et je ne pensais pas avoir besoin de refaire un test pour une chose aussi simple que de supprimer une virgule.

J'ai écrit quelque chose de similaire à ceci dans es6 et babel

var a = "hello world"
(async function(){
  //do work
})()

Ce code a échoué et a pris une éternité à comprendre. Pour une raison quelconque, il a vu

var a = "hello world"(async function(){})()

caché au fond du code source, il me disait "bonjour le monde" n'est pas une fonction.

Pour plus de plaisir, le nœud n'affiche pas les cartes sources du code transpilé.

J'ai perdu tellement de temps stupide. Je présentais également à quelqu'un comment ES6 est génial, puis j'ai dû commencer à déboguer et démontrer à quel point ES6 était sans maux de tête et meilleur. Ce n'est pas convaincant.

J'espère que cela répond à votre question. Ceci étant une vieille question, c'est plus pour la génération future, les gens qui apprennent encore.

Question lorsque les gens disent que cela n'a pas d'importance dans les deux cas. Il y a de fortes chances qu'une personne plus sage et plus expérimentée vous en dise autrement.

que faire si quelqu'un écrase l'objet de localisation. Ils feront une cale pour les navigateurs plus anciens. Il obtiendra une nouvelle fonctionnalité qui doit être ajustée et votre code de 3 ans échouera.

Ma dernière note à méditer.

Écrire un code clair et clair a un effet sur votre code auquel il est impossible de répondre par le bien ou le mal. Ce qu'il fait, c'est que votre code est un catalyseur.

Vous pouvez utiliser plus de plugins de choses, des bibliothèques sans crainte d'interruption entre les codes.

pour mémoire. utilisation

window.location.href

Lpc_dark
la source
24
Longue réponse informative, argumentée avec passion. Mais en plaidant pour l'utilisation de window.location.hrefplus window.location, vous avez oublié que la question demandait en fait la différence entre ceux-ci etwindow.location.replace()
AntonChanning
10
Chaque fois que je vois TLDR, j'attends une réponse PLUS COURTE, pas une réponse 5 fois plus longue.
user9645
4
TLDR; use location.href or better use window.location.href; Le TLDR est cette ligne. Le reste est la "réponse".
Elysiumplain
Je ne pense pas que vous fassiez valoir un argument valable en introduisant un cas d'utilisation inhabituel. ie mystring = location.href = "#/some/spa/route". En outre, de nombreux langages autoriseraient la conversion de type (implicite) d'une manière ou d'une autre. À la fin de la journée, le javascript est un langage typé dynamique, mettez des concepts de type dessus et dites que ce n'est pas bon ne sert à rien.
pomme pomme
1
que faire si quelqu'un écrase l'objet de localisation . eh bien, tout comme dire si quelqu'un écrase consoleou ombre window- Maintenant, vous avez un plus gros problème.
pomme pomme