0

オブジェクトから URL 引数を作成する小さな関数があります。

function MkArgs(o) {
    var ret = '?';
    for (var i in o) {
        ret += i + '=' + escape(o[i]) + '&';
    }
    return ret.substr(0, ret.length - 1);
}

次に、次のように呼び出すことができます。

MkArgs({
    protocol: 'wsfederation',
    realm: 'https://www.x.com/',
    fedRes: 'Home/FederationResult',
    context: '~/Home/FAQ',
    version: '1.0',
    callback: '?'
});

以下を生成します。

?protocol=wsfederation&realm=https%3A//www.x.com/&fedRes=Home/FederationResult&context=%7E/Home/FAQ&version=1.0&callback=%3F

最後の引数をエスケープしたくないことを除いて、すべて問題ありません。つまり、次のようにします。

callback=?

それ以外の

callback=%3F

文字列内でそれを示す方法はありますか? 私は試し'\?'ましたが、それはうまくいかず、文字列の一部をエスケープから保護する方法に関する参照が見つかりませんでした...

  • e
4

5 に答える 5

1

MkArgs関数は独自のものです。エスケープメカニズムを含めるように変更します。ただし、バックスラッシュは使用しないことをお勧めします。これがあなた自身のコードであるなら、おそらくハックのような特別なケースを入れるのに十分でしょう。

于 2011-08-08T19:17:36.790 に答える
1

それはかなり特殊なケースです。たぶん、関数を変更する必要があります:

function MkArgs(o, isJSONP) {
    var ret = '?';
    for (var i in o) {
        var val = o[i];
        val = escape(val);
        ret += i + '=' + val + '&';
    }
    return ret.substr(0, ret.length - 1) + isJSONP ? '&callback=?':'';
}

そしてそれを呼び出します:

MkArgs({
  protocol: 'wsfederation',
  realm: 'https://www.x.com/',
  fedRes: 'Home/FederationResult',
  context: '~/Home/FAQ',
  version: '1.0'
}, true);
于 2011-08-08T19:27:41.717 に答える
1

escape または encodeURIComponent 関数には、特定の文字を「スキップ」する方法がありません。したがって、エンコードしたくないときにエンコード関数を呼び出すのを避けるか、エンコードしたくない文字を置き換え、エンコードを呼び出してから、元の文字を元に戻すことができます。

特定のキーの値全体のエスケープをスキップしたい場合は、エスケープしたくない特定のキーをチェックして、次のように適切に処理できます。

function MkArgs(o) {
    var ret = '?';
    for (var i in o) {
        var val = o[i];
        if (i != "callback") {
            val = encodeURIComponent(val);
        }
        ret += i + '=' + val + '&';
    }
    return ret.substr(0, ret.length - 1);
}

特定の文字だけをスキップしたい場合は、それらを一意のシーケンスに置き換え、エスケープしてから元に戻すことができます。

function MkArgs(o) {
    var ret = '?';
    for (var i in o) {
        var val = o[i];
        if (i == "callback") {
            val = val.replace(/\?/, "--xx--");  // replace with unique sequence
            val = encodeURIComponent(val);
            val = val.replace(/--xx--/, "?");   // put orig characters back
        } else {
            val = encodeURIComponent(val);
        }
        ret += i + '=' + val + '&';
    }
    return ret.substr(0, ret.length - 1);
}

参考までに、非ASCII文字では機能しないためencodeURIComponent()、非推奨よりも推奨される使用に切り替えたことに注意してください。escape()escape()

于 2011-08-08T19:11:02.367 に答える
0
function MkArgs(o) {
    var ret = '?';
    var lastEl = '';
    for (var i in o) {
        ret += i + '=' + escape(o[i]) + '&';
        lastEl = o[i];
    }
    return ret.substr(0, ret.length - 1 - lastEl.length) + lastEl;
}

これは、オブジェクトの最後の要素に対して機能します。

編集: 古典的なfor inループでは、javascript にはオブジェクトの小道具をループする正確な順序がないため、上記の解決策が機能することが保証されていないようです。
この場合、2 つの解決策があります。

  • エスケープから「保護」したいプロパティがわかっている場合は、ループ内でそのプロパティを確認し、特にエスケープしないようにする必要があります。

    for (var i in o) {
         if(i=="myProp")
         // unescape
         else
         // escape
    }
    
  • プロパティを追加せず、最後のプロパティのみをクエリに追加する場合は、(クエリを作成した後に) 次のようにすることができます。

    var q = MkArgs(o);
    var parts = q.split('=');
    var toUnescape = parts[parts.length-1];
    q = q.substring(0,q.length - toUnescape.length) + unescape(toUnescape);
    
于 2011-08-08T19:32:44.080 に答える
0

返信ありがとうございます。私がやったことは:

function MkArgs(o) {
    var ret = '?';
    for (var i in o) {
        ret += i;
        if (o[i]) ret += '=' + escape(o[i]);
        ret += '&';
    }
    return ret.substr(0, ret.length - 1);
}

次に、次のように呼び出します。

MkArgs({
    protocol: 'wsfederation',
    realm: 'https://www.x.com/',
    fedRes: 'Home/FederationResult',
    context: '~/Home/FAQ',
    version: '1.0',
    'callback=?': null
});

そうすれば、値に依存するのではなく、区別するためのキーに依存します。あまりきれいではありませんが、私が考えることができる最高のものです

于 2011-08-08T22:12:08.753 に答える