Avec javascript, comment puis-je ajouter un paramètre de chaîne de requête à l'URL s'il n'est pas présent ou s'il est présent, mettre à jour la valeur actuelle? J'utilise jquery pour mon développement côté client.
javascript
jquery
query-string
amateur
la source
la source
String#split
prend un deuxième paramètre pour les divisions maximales. jQuerymap
sera également utile.Réponses:
J'ai écrit la fonction suivante qui accomplit ce que je veux réaliser:
la source
[?|&]
devrait être[?&]
var
juste avant la déclaration de séparateur.value = encodeURIComponent(value);
dans la première ligne, sinon les sauts de ligne ne sont pas correctement échappés.J'ai étendu la solution et l'ai combinée avec une autre que j'ai trouvée pour remplacer / mettre à jour / supprimer les paramètres de la chaîne de requête en fonction de l'entrée des utilisateurs et en tenant compte de l'ancre des URL.
Ne pas fournir de valeur supprimera le paramètre, en fournir un ajoutera / mettra à jour le paramètre. Si aucune URL n'est fournie, elle sera récupérée à partir de window.location
Mise à jour
Il y avait un bug lors de la suppression du premier paramètre dans la chaîne de requête, j'ai retravaillé l'expression régulière et testé pour inclure un correctif.
Deuxième mise à jour
Comme suggéré par @ JarónBarends - Vérifiez la valeur de réglage pour vérifier par rapport à undefined et null pour autoriser la définition de valeurs 0
Troisième mise à jour
Il y avait un bogue où la suppression d'une variable de chaîne de requête directement avant un hashtag perdrait le symbole du hashtag qui a été corrigé
Quatrième mise à jour
Merci à @rooby d'avoir signalé une optimisation d'expression régulière dans le premier objet RegExp. Réglez l'expression régulière sur ([? &]) En raison d'un problème avec l'utilisation de (\? | &) Trouvé par @YonatanKarni
Cinquième mise à jour
Suppression de la déclaration de hachage var dans l'instruction if / else
la source
value
ceci supprimera les variables de la chaîne de requête lorsque vous définissez leur valeur sur 0. donc au lieu deif (value) {}
vous devez utiliserif (typeOf value !== 'undefined' && value !== null) {}
hash
est déclarée deux fois;)le utilitaire URLSearchParams peut être utile pour cela en combinaison avec
window.location.search
. Par exemple:Maintenant, il
foo
a été défini surbar
qu'il existe ou non.Cependant, l'affectation ci-dessus
window.location.search
entraînera un chargement de page, donc si ce n'est pas souhaitable, utilisez le API Historique comme suit:Maintenant, vous n'avez plus besoin d'écrire votre propre expression rationnelle ou logique pour gérer l'existence possible de chaînes de requête.
Cependant, la prise en charge du navigateur est médiocre car elle est actuellement expérimentale et n'est utilisée que dans les versions récentes de Chrome, Firefox, Safari, iOS Safari, navigateur Android, Android Chrome et Opera. À utiliser avec un polyfill si vous décidez de l'utiliser.
Mise à jour: le support du navigateur s'est amélioré depuis ma réponse d'origine.
la source
Unable to set property '__URLSearchParams__:0.8503766759030615' of undefined or null reference
sur ie11 vous obtenez cette erreur. ce n'est pas un pollyfill s'il ne fonctionne pas comme solution de rechange.newRelativePathQuery
l'astuce:var newRelativePathQuery = window.location.pathname + '?' + searchParams.toString() + window.location.hash;
Basé sur la réponse de @ amateur (et intégrant maintenant le correctif du commentaire @j_walker_dev), mais en tenant compte du commentaire sur les balises de hachage dans l'url, j'utilise ce qui suit:
Modifié pour corriger
[?|&]
en regex qui devrait bien sûr être[?&]
comme indiqué dans les commentairesModifier: version alternative pour prendre également en charge la suppression des paramètres d'URL. J'ai utilisé
value === undefined
comme moyen d'indiquer la suppression. Pourrait utiliservalue === false
ou même un paramètre d'entrée séparé comme souhaité.Voyez-le en action sur https://jsfiddle.net/bp3tmuxh/1/
la source
var separator
ligne à droite au-dessus du retour corrige un bug avec "/ app # / cool? Fun = true". Cela choisirait un "&" comme séparateur même s'il n'y a pas encore de paramètres de chaîne de requête réels. Seuls les clients.[?|&]
devrait être juste[?&]
(sinon cela correspondra|
)."([?|&])"
n'est pas bon. Veuillez corriger cela soitvar re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
ouvar re = new RegExp("([?&])" + key + "=.*?(&|#|$)", "i");
(une belle extension à d'autres égards!)var re = new RegExp("(?|&)" + key + "=.*?(&|#|$)", "i");
ne fonctionne pas, le second fonctionneVoici ma bibliothèque pour le faire: https://github.com/Mikhus/jsurl
la source
Je me rends compte que cette question est ancienne et qu'il a été répondu à mort, mais voici mon coup de poignard. J'essaie de réinventer la roue ici parce que j'utilisais la réponse actuellement acceptée et la mauvaise gestion des fragments d'URL m'a récemment mordu dans un projet.
La fonction est ci-dessous. C'est assez long, mais il a été conçu pour être aussi résistant que possible. J'adorerais des suggestions pour le raccourcir / l'améliorer. J'ai mis en place une petite suite de tests jsFiddle pour cela (ou d'autres fonctions similaires). Si une fonction peut réussir chacun des tests là-bas, je dis que c'est probablement bien d'y aller.
Mise à jour: je suis tombé sur une fonction intéressante pour utiliser le DOM pour analyser les URL , j'ai donc incorporé cette technique ici. Il rend la fonction plus courte et plus fiable. Accessoires à l'auteur de cette fonction.
la source
window.location.search est en lecture / écriture.
Cependant, la modification de la chaîne de requête redirigera la page sur laquelle vous vous trouvez et provoquera une actualisation à partir du serveur.
Si ce que vous essayez de faire est de maintenir l'état côté client (et de le rendre potentiellement compatible avec les signets), vous voudrez modifier le hachage URL au lieu de la chaîne de requête, ce qui vous maintient sur la même page (window.location. le hachage est en lecture / écriture). C'est ainsi que les sites Web comme twitter.com procèdent.
Vous voudrez également que le bouton de retour fonctionne, vous devrez lier les événements javascript à l'événement de changement de hachage, un bon plugin pour cela est http://benalman.com/projects/jquery-hashchange-plugin/
la source
S'il n'est pas défini ou si vous souhaitez mettre à jour avec une nouvelle valeur, vous pouvez utiliser:
C'est en Javascript simple, soit dit en passant.
ÉDITER
Vous voudrez peut-être essayer d'utiliser le plugin jquery query-object
la source
Voici mon approche: le
location.params()
fonction (illustrée ci-dessous) peut être utilisée comme getter ou setter. Exemples:Étant donné que l'URL est
http://example.com/?foo=bar&baz#some-hash
,location.params()
retourne un objet avec tous les paramètres de la requête:{foo: 'bar', baz: true}
.location.params('foo')
reviendra'bar'
.location.params({foo: undefined, hello: 'world', test: true})
changera l'URL enhttp://example.com/?baz&hello=world&test#some-hash
.Voici la
params()
fonction, qui peut éventuellement être affectée à l'window.location
objet.la source
C'est ma préférence, et elle couvre les cas auxquels je peux penser. Quelqu'un peut-il penser à un moyen de le réduire à un seul remplacement?
la source
Je sais que c'est assez ancien mais je veux lancer ma version de travail ici.
REMARQUE Il s'agit d'une version modifiée de @elreimundo
la source
Ma prise d'ici (compatible avec "use strict"; n'utilise pas vraiment jQuery):
Exemple d'utilisation:
la source
Sur la base de la réponse donnée par @ellemayo, j'ai trouvé la solution suivante qui permet de désactiver la balise de hachage si vous le souhaitez:
Appelez ça comme ceci:
Résulte en:
la source
typeof value !== 'undefined' && value !== null
est plus explicite, maisvalue != null
signifie la même chose et est plus concis.Voici une version plus courte qui prend en charge
Code:
La description de l' expression régulière peut être trouvée ici .
REMARQUE : Cette solution est basée sur la réponse @amateur, mais avec de nombreuses améliorations.
la source
Code qui ajoute une liste de paramètres à une URL existante à l'aide d'ES6 et de jQuery:
Où listOfParams est comme
Exemple d'utilisation:
Tests rapides:
la source
Une approche différente sans utiliser d'expressions régulières . Prend en charge les ancres de hachage à la fin de l'URL ainsi que plusieurs caractères de point d'interrogation (?). Devrait être légèrement plus rapide que l'approche par expression régulière.
la source
Utilisez cette fonction pour ajouter, supprimer et modifier le paramètre de chaîne de requête de l'URL basé sur jquery
Ajouter un nouveau paramètre et le modifier à l'URL
Supprimer l'existant
la source
En utilisant,
jQuery
nous pouvons faire comme ci-dessousEn variable
new_url
nous aurons de nouveaux paramètres de requête.Référence: http://api.jquery.com/jquery.param/
la source
Pour donner un exemple de code à modifier
window.location.search
comme suggéré par Gal et tradyblix:la source
Code de script Java pour rechercher une chaîne de requête spécifique et remplacer sa valeur *
la source
Oui, j'ai eu un problème où ma chaîne de requête débordait et se dupliquait, mais cela était dû à ma propre lenteur. donc j'ai joué un peu et travaillé sur js jquery (en fait grésillement) et C # magick.
Donc je viens de réaliser qu'après que le serveur a fini avec les valeurs passées, les valeurs n'ont plus d'importance, il n'y a pas de réutilisation, si le client voulait faire la même chose évidemment, ce sera toujours une nouvelle demande, même si c'est la mêmes paramètres étant passés. Et c'est tout côté client, donc certains cache / cookies, etc. pourraient être cool à cet égard.
JS:
HTML:
C #:
Pas de doublons, chaque demande est aussi unique que vous l'avez modifiée, et en raison de la façon dont celle-ci est structurée, il est facile d'ajouter dynamiquement plus de requêtes depuis le dom.
la source
Voici une méthode alternative utilisant les propriétés intégrées de l'élément HTML d'ancrage:
la source
si vous souhaitez définir plusieurs paramètres à la fois:
même fonction que chez amateur
si jslint vous donne une erreur, ajoutez ceci après la boucle for
la source
http://abc.def/?a&b&c
).Il y a beaucoup de réponses maladroites et inutilement compliquées sur cette page. La note la plus élevée, @ amateur, est assez bonne, bien qu'elle ait un peu de peluches inutiles dans le RegExp. Voici une solution légèrement plus optimale avec un nettoyant RegExp et un
replace
appel plus propre :En prime, s'il
uri
ne s'agit pas d'une chaîne, vous n'obtiendrez pas d'erreurs en essayant d'appelermatch
oureplace
sur quelque chose qui peut ne pas implémenter ces méthodes.Et si vous souhaitez gérer le cas d'un hachage (et que vous avez déjà vérifié le format HTML correctement formaté), vous pouvez tirer parti de la fonction existante au lieu d'écrire une nouvelle fonction contenant la même logique:
Ou vous pouvez apporter de légères modifications à la réponse par ailleurs excellente de @ Adam:
la source
separator
n'est pas défini dansupdateQueryStringParamsNoHash
. DansupdateQueryStringParameter
, tout tombe en panne si le paramètre que vous remplacez ne reçoit pas de valeur (par exemplehttp://abc.def/?a&b&c
).Cela devrait servir le but:
la source