web-dev-qa-db-ja.com

javascriptの別のクエリ文字列の値になるようにクエリ文字列をエンコードする方法は?

クエリ文字列値として別のクエリ文字列を渡すjavascript関数があります。

つまり、クエリ文字列は次のようになります。

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

ただし、次のようにリダイレクトする場合:

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

最終的にはhttp://www.somesite.com?somequery=?key1=value1&key2=value2は、FirefoxおよびIE7で、クエリ文字列を正しく解析できないことを意味します。

また、どちらも機能しないencodeURIComponentを使用してみました。

somequery値をエスケープしたままにするリダイレクトを強制する別の関数またはハックがありますか??

47
rmw

encodeURIComponentが機能します。 (スクリプトの想定内容に応じて、先頭の「?」が必要な場合と必要ない場合があります。)

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

私を連れて行く:

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

カーソルを合わせると、ブラウザのステータスバーに一度デコードされて表示される場合がありますが、正しい場所に移動します。

escape/unescape()はクエリパラメータをエンコードするための間違ったものであり、Unicode文字を取得し、さらに間違っています。 escape()が本当に必要な場合はほとんどありません。

89
bobince

ネイティブescapeメソッドはそれを行います。ただし、次のようなカスタムエンコーダーを作成することもできます。

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

これにより、クエリ文字列で使用されるキーが置き換えられます。さらに、必要なキーと値のペアを追加することにより、他のカスタムエンコーディングに適用できます。

2
Reyraa
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...");
      }
}
0
BRS13