2009-02-27 5 views
34

J'ai une fonction javascript qui transmet comme valeur de chaîne de requête une autre chaîne de requête.Comment encoder une chaîne de requête pour qu'elle soit la valeur d'une autre chaîne de requête en javascript?

En d'autres termes, je veux la chaîne de requête à:

http://www.somesite.com/?somequery=%3fkey%3dvalue1%2520%26%2520key2%3value3 

Cependant, si je réoriente comme ceci:

var url = 'http://www.somesite.com/?somequery='; 
url += escape('?key=value1&key2=value2'); 
window.location = url; 

il finit comme http://www.somesite.com?somequery=?key1=value1&key2=value2 dans Firefox et IE7 ce qui signifie que Je ne peux pas analyser la chaîne de requête correctement.

J'ai également essayé d'utiliser le composant encodeURIC qui ne fonctionnait pas non plus.

Existe-t-il une autre fonction ou un hack pour forcer la redirection à conserver la valeur somequery?

Répondre

65

encodeURIComponent fonctionnera. (Vous pouvez ou ne voulez pas le leader, en fonction de ce que le script attend? ».)

var c= 'd e' 
var query= '?a=b&c='+encodeURIComponent(c); 
var uri= 'http://www.example.com/script?query='+encodeURIComponent(query); 
window.location= uri; 

me prend:

http://www.example.com/script?query=%3Fa%3Db%26c%3Dd%2520e

Lorsque vous survolez qu'il peut apparaître une fois décodé dans la barre d'état du navigateur, mais vous vous retrouverez au bon endroit. Escape/unescape() est une mauvaise chose pour encoder les paramètres de requête, il obtient des caractères Unicode et les plus faux. Il n'y a presque jamais de cas où escape() est ce dont vous avez vraiment besoin.

+0

Oui, je suis sûr que l'échappement est obsolète. Bon appel. –

+0

Vous devrez peut-être résoudre '%' dans [requête] – KooiInc

+0

Cela fonctionne - bien que lors de l'analyse de la chaîne de requête, je dois le décoder deux fois maintenant. Il semble que lorsqu'il est codé une fois, il sera décodé par le navigateur mais lorsqu'il est codé deux fois, il ne sera pas décodé du tout. étrange. – rmw

0
javascript:alert(escape('?key=value1&key2=value2')); 

Fonctionne bien pour moi?

2

La méthode native escape fait cela. mais vous pouvez également créer un encodeur personnalisé comme:

function encodeUriSegment(val) { 
    return encodeUriQuery(val, true). 
      replace(/%26/gi, '&'). 
      replace(/%3D/gi, '='). 
      replace(/%2B/gi, '+'); 
} 

Ceci remplacera les clés utilisées dans les chaînes de requête. De plus, vous pouvez l'appliquer à tout autre encodage personnalisé en ajoutant les paires clé-valeur nécessaires.

0
function downloadFile(){ 
     var filePath = "C:/Users/HP/Desktop/Project Folder/DemoProject/"; 

     var fileInfo = "Error_Issue Minor Cosmetic & Major Fatal Issues (Demo_Project) (2017)_GeneratedOn_12_21_2017 21924 AM.xlsx"; 
     if((filePath != undefined && filePath.length > 0) && (fileName != undefined && fileName.length > 0)){ 
     var downloadUrl = "../download?fileName="+encodeURIComponent(fileName)+"&filePath="+encodeURIComponent(filePath); 
     $window.location = downloadUrl; 
     }else{ 
     alert("Please define a fileName for downloading..."); 
     } 
} 
Questions connexes