Функции 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);
}
К вашему сведению, я перешел на использование encodeURIComponent()
, которое рекомендуется вместо устаревшего escape()
, потому что escape()
не работает для символов, отличных от ascii.