Как сохранить переменную URL при смене веб-сайта? [Дубликат]

Давайте посмотрим на лес сначала, прежде чем смотреть на деревья.

Здесь есть много информативных ответов с большими подробностями, я не буду повторять ни одного из них. Ключ к программированию в JavaScript имеет сначала правильную ментальную модель общего исполнения.

  1. Ваша точка входа (ов) выполняется в результате события. Например, в браузер загружается тег сценария с кодом. (Соответственно, поэтому вам, возможно, придется заботиться о готовности страницы запускать ваш код, если он требует, чтобы элементы dom были сконструированы первыми и т. Д.)
  2. Ваш код выполняется до завершения, однако многие асинхронные вызовы, которые он делает, без выполнения каких-либо ваших обратных вызовов, включая запросы XHR, установку тайм-аутов, обработчиков событий dom и т. д. Каждый из этих обратных вызовов, ожидающих выполнения, будет находиться в очереди, ожидая, что их очередь будет запущена после других событий
  3. Каждый отдельный обратный вызов XHR-запроса, установленного таймаута или dom события после вызова будет завершен.

Хорошие новости заключается в том, что, если вы хорошо понимаете этот момент, вам никогда не придется беспокоиться о гоночных условиях. Прежде всего вы должны понимать, как вы хотите упорядочить свой код как по существу ответ на разные дискретные события, и как вы хотите объединить их в логическую последовательность. Вы можете использовать обещания или новые асинхронные / ожидающие более высокие уровни в качестве инструментов для этой цели, или вы можете откатывать свои собственные.

Но вы не должны использовать какие-либо тактические инструменты для решения проблемы, пока вам не понравится актуальная проблемная область. Нарисуйте карту этих зависимостей, чтобы знать, что нужно запускать, когда. Попытка ad-hoc подхода ко всем этим обратным вызовам просто не поможет вам.

2136
задан ProgramFOX 31 October 2014 в 14:13
поделиться

11 ответов

Проверьте встроенную функцию encodeURIComponent(str) и encodeURI(str). В вашем случае это должно работать:

var myOtherUrl = 
       "http://example.com/index.html?url=" + encodeURIComponent(myUrl);
2500
ответ дан balexandre 31 August 2018 в 13:16
поделиться

Аналогичная вещь, которую я пробовал с обычным javascript

function fixedEncodeURIComponent(str){
     return encodeURIComponent(str).replace(/[!'()]/g, escape).replace(/\*/g, "%2A");
}
4
ответ дан 2 revs, 2 users 89% 31 August 2018 в 13:16
поделиться

encodeURIComponent () - это путь.

var myOtherUrl = "http://example.com/index.html?url=" + encodeURIComponent(myUrl);

НО вы должны иметь в виду, что существуют небольшие отличия от php-версии urlencode (), и, как упоминалось в @CMS, она не будет кодировать каждый голец. Ребята в http://phpjs.org/functions/urlencode/ сделали js эквивалентным phpencode ():

function urlencode(str) {
  str = (str + '')
    .toString();

  // Tilde should be allowed unescaped in future versions of PHP (as reflected below), but if you want to reflect current
  // PHP behavior, you would need to add ".replace(/~/g, '%7E');" to the following.
  return encodeURIComponent(str)
    .replace(/!/g, '%21')
    .replace(/'/g, '%27')
    .replace(/\(/g, '%28')
    .
  replace(/\)/g, '%29')
    .replace(/\*/g, '%2A')
    .replace(/%20/g, '+');
}
7
ответ дан Adam Fischer 31 August 2018 в 13:16
поделиться

Придерживайтесь encodeURIComponent() . Функция encodeURI() не требует кодирования многих символов, имеющих семантическое значение в URL-адресах (например, «#», «?» И «& amp;»). escape() устарел и не хочет кодировать символы «+», которые будут интерпретироваться как закодированные пробелы на сервере (и, как указано другими здесь, неправильно кодируется URL-адресом не-ASCII-символы).

Существует хорошее объяснение разницы между encodeURI() и encodeURIComponent() в другом месте. Если вы хотите что-то закодировать, чтобы можно было безопасно включить его в качестве компонента URI (например, как параметр строки запроса), вы хотите использовать encodeURIComponent().

1376
ответ дан Community 31 August 2018 в 13:16
поделиться

Чтобы закодировать URL-адрес, как было сказано ранее, у вас есть две функции:

encodeURI()

и

encodeURIComponent()

. Причина в том, что первая сохраняет URL-адрес с риском того, что вы оставите слишком много вещей без сохранения, а второй кодирует все необходимое.

Сперва вы можете скопировать недавно экранированный URL-адрес в адресную строку (например), и это сработает. Однако ваши неограниченные '& amp;' будут вмешиваться в полевые разделители, '=' будут мешать именам полей и значениям, а «+» будут выглядеть как пробелы. Но для простых данных, когда вы хотите сохранить природу URL-адреса того, что вы ускользаете, это работает.

Второе - это все, что вам нужно сделать, чтобы убедиться, что ничто в вашей строке не связано с URL-адресом. Он оставляет различные несущественные символы незанятыми, чтобы URL-адрес оставался максимально понятным для человека без помех. URL-адрес, закодированный таким образом, больше не будет работать как URL-адрес, не отменив его.

Итак, если вы можете потратить время, вы всегда хотите использовать encodeURIComponent () - перед добавлением пар имен / значений кодируйте оба имя и значение, используя эту функцию, прежде чем добавлять их в строку запроса.

У меня возникло трудное время придумывать причины использования encodeURI () - я оставлю это для умных люди.

8
ответ дан Gerard ONeill 31 August 2018 в 13:16
поделиться

Если вы используете jQuery, я бы пошел на метод $.param . Этот URL-адрес кодирует поля сопоставления объектов для значений, которые легче читать, чем вызов метода escape для каждого значения.

$.param({a:"1=2", b:"Test 1"}) // gets a=1%3D2&b=Test+1
35
ответ дан Mark Amery 31 August 2018 в 13:16
поделиться

Вы можете использовать библиотеку esapi и закодировать свой url, используя следующую функцию. Функция терпит, что '/' не теряются для кодирования, пока остальная часть содержимого текста закодирована:

function encodeUrl(url)
{
    String arr[] = url.split("/");
    String encodedUrl = "";
    for(int i = 0; i<arr.length; i++)
    {
        encodedUrl = encodedUrl + ESAPI.encoder().encodeForHTML(ESAPI.encoder().encodeForURL(arr[i]));
        if(i<arr.length-1) encodedUrl = encodedUrl + "/";
    }
    return url;
}

https://www.owasp.org/index.php/ESAPI_JavaScript_Readme

0
ответ дан Mohith Maratt 31 August 2018 в 13:16
поделиться

Ничто не работало для меня. Все, что я видел, это HTML-страница входа в систему, возвращающаяся на клиентскую сторону с кодом 200. (302 сначала, но тот же Ajax-запрос, загружающий страницу входа в другой Ajax-запрос, который должен был быть перенаправлением, а не загрузкой простого текст страницы входа в систему).

В контроллере входа я добавил эту строку:

Response.Headers["land"] = "login";

И в глобальном обработчике Ajax я сделал это:

$(function () {
    var $document = $(document);
    $document.ajaxSuccess(function (e, response, request) {
        var land = response.getResponseHeader('land');
        var redrUrl = '/login?ReturnUrl=' + encodeURIComponent(window.location);
        if(land) {
            if (land.toString() === 'login') {
                window.location = redrUrl;
            }
        }
    });
});

Теперь у меня нет никаких проблем, и это работает как прелесть.

2
ответ дан Peter Mortensen 31 August 2018 в 13:16
поделиться

Лично я считаю, что многие API-интерфейсы хотят заменить «" на «+», поэтому я использую следующее:

encodeURIComponent(value).replace(/%20/g,'+');

escape реализовано по-разному в разных браузерах, а encodeURI t кодирует большинство символов, которые являются функциональными в URI (например, # и даже /) - это делается для использования на полном URI / URL-адресе, не нарушая его.

ПРИМЕЧАНИЕ. Вы используете encodeURIComponent для значения строки запроса (не имена полей / значений и определенно не весь URL). Если вы сделаете это любым другим способом, он не будет кодировать символы типа =,?, & Amp ;, возможно, оставив вашу строку запроса открытой.

Пример:

const escapedValue = encodeURIComponent(value).replace(/%20/g,'+');
const url = 'http://example.com/?myKey=' + escapedValue;
66
ответ дан Ryan Taylor 31 August 2018 в 13:16
поделиться

Кодировать строку URL
    var url = $(location).attr('href'); //get current url
    //OR
    var url = 'folder/index.html?param=#23dd&noob=yes'; //or specify one

var encodedUrl = encodeURIComponent(url); console.log(encodedUrl); //outputs folder%2Findex.html%3Fparam%3D%2323dd%26noob%3Dyes for more info go http://www.sitepoint.com/jquery-decode-url-string

1
ответ дан Sangeet Shah 31 August 2018 в 13:16
поделиться

Чтобы предотвратить двойное кодирование, рекомендуется декодировать url перед кодированием (если вы имеете дело с введенными пользователем URL-адресами, например, которые могут быть уже закодированы).

Допустим, что у нас есть abc%20xyz 123 как вход (одно пространство уже закодировано):

encodeURI("abc%20xyz 123")            //   wrong: "abc%2520xyz%20123"
encodeURI(decodeURI("abc%20xyz 123")) // correct: "abc%20xyz%20123"
3
ответ дан serg 31 August 2018 в 13:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: