В настоящее время я устанавливаю свойство window.location.pathname, чтобы перенаправить пользователя на относительный URL. Новый URL имеет параметры, поэтому строка JavaScript выглядит так:

window.location.pathname = window.location.pathname.substring( 0, window.location.pathname.lastIndexOf( '/' ) + 1 ) + 'myPage.xhtml?u=' + selected_user.Username;

Это успешно в Firefox, однако Chrome кодирует знак вопроса с «% 3F», и запрос впоследствии завершается неудачно.

Я не уверен, правильно ли я использую window.location. Нужно ли мне использовать свойства window.location, такие как pathname или href? Я обнаружил, что как только я устанавливаю одно свойство, местоположение перезагружается, поэтому, например, свойства поиска и пути не могут быть установлены отдельно. Можно ли установить window.location напрямую? Мне нужно только установить относительный URL с параметром.

43
Mark 4 Сен 2010 в 20:14

3 ответа

Лучший ответ

pathname и многие другие свойства location и ссылок отражают только часть URL:

http:  //www.example.com/path/to/example.html?param1=2&param3=4#fragment
^protocol^hostname      ^pathname            ^search           ^hash

Как видите, часть ?... URL не является частью pathname; нет смысла записывать значение, содержащее ? в location.pathname, так как эта часть URL не может содержать знак вопроса. Chrome исправляет вашу ошибку, кодируя символ в последовательности, которая означает буквальный знак вопроса, который не заканчивается pathname.

Эти свойства отлично подходят для разбивки URL на составные части, которые вы можете обработать, но в этом случае вы, вероятно, не захотите писать их. Вместо этого пишите в location.href. Это представляет весь URL, но совершенно нормально написать относительный URL к нему; это будет сработано относительно текущего значения, так что фактически нет необходимости читать и разбивать pathname вообще:

location.href= 'myPage.xhtml?u='+encodeURIComponent(selected_user.Username);

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

61
bobince 4 Сен 2010 в 19:22

Попробуйте установить свойство location.href вместо window.location.pathname.

13
Chris Laplante 4 Сен 2010 в 16:18

Использование window.location.href считается самым безопасным способом установить URL-адрес. Я думаю, что должен решить проблему с кодировкой.

window.location.href = window.location.pathname.substring( 0, window.location.pathname.lastIndexOf( '/' ) + 1 ) + 'myPage.xhtml?u=' + selected_user.Username;

Если это не поможет, приведите пример URL.

7
Pekka 4 Сен 2010 в 16:19