2009-02-27 16 views
34

Ich habe eine JavaScript-Funktion, die als Abfragezeichenfolgenwert eine andere Abfragezeichenfolge übergibt.Wie codiert man eine Abfragezeichenfolge, so dass es der Wert einer anderen Abfragezeichenfolge in Javascript ist?

Mit anderen Worten, ich möchte die Abfrage-String sein:

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

aber wenn ich so umleiten:

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

es endet als http://www.somesite.com?somequery=?key1=value1&key2=value2 in Firefox und IE7 was bedeutet, dass Ich kann die Abfragezeichenfolge nicht korrekt analysieren.

Ich versuchte auch mit encodeURIComponent, die auch nicht funktioniert.

Gibt es eine andere Funktion oder einen Hack, um die Weiterleitung zu zwingen, den somequery Wert zu retten?

Antwort

65

encodeURIComponent wird funktionieren. (Sie können oder nicht die führende wollen, je nachdem, was das Skript erwartet '?'.)

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

nimmt mich an:

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

Wenn Sie den Mauszeiger über dass es in der Statusleiste des Browsers einmal dekodiert erscheint, aber Sie werden am richtigen Ort landen.

Escape/Unescape() ist die falsche Sache für die Codierung von Abfrageparametern, es bekommt Unicode-Zeichen und Pluszeichen falsch. Es gibt fast nie einen Fall, in dem die Flucht() das ist, was Sie wirklich brauchen.

+0

Ja, ich bin ziemlich sicher, Flucht ist veraltet. Guter Ruf. –

+0

Vielleicht müssen Sie '%' in [query] lösen – KooiInc

+0

Das funktioniert - obwohl beim Parsen der Abfrage-String muss ich es jetzt zweimal dekodieren. Es scheint, dass wenn es einmal kodiert ist, wird es durch den Browser decodiert werden, aber wenn es zweimal codiert wird, wird es überhaupt nicht decodiert. seltsam. – rmw

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

Funktioniert gut für mich?

2

Native escape Methode macht das. Sie können aber auch einen benutzerdefinierten Encoder erstellen, wie zum Beispiel:

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

Dadurch werden in Abfragezeichenfolgen verwendete Schlüssel ersetzt. Darüber hinaus können Sie es auf andere benutzerdefinierte Codierungen anwenden, indem Sie erforderliche Schlüssel/Wert-Paare hinzufügen.

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..."); 
     } 
} 
Verwandte Themen