Привет всем! У меня возникла проблема при попытке открыть файл с символом ‘#’ в имени через функцию window.open() в JavaScript. Обычная ссылка работает нормально, но window.open() почему-то не справляется.
Я пробовал заменить ‘#’ на ‘%23’, но window.open() почему-то превращает это в ‘%2523’. Похоже, что функция дополнительно экранирует URL.
Кто-нибудь сталкивался с подобным? Есть ли способы обойти это двойное экранирование?
Вот пример кода, который я использую:
function обработатьСсылку(url) {
return url.replace("#", "%23");
}
let путьКФайлу = '\\МойСетевойПуть\Документ#1-АБВГД.RTF';
window.open(обработатьСсылку(путьКФайлу));
При этом браузер пытается открыть ‘file://МойСетевойПуть/Документ%25231-АБВГД.RTF’ и говорит, что файл не найден. Помогите, пожалуйста, разобраться!
Слушай, с этой решёткой в юрлах вечно проблемы. Я обычно для таких случаев использую btoa() - он кодирует строку в base64. Потом на сервере декодируешь обратно. Типа так:
let encodedUrl = btoa(путьКФайлу);
window.open(‘handler.php?file=’ + encodedUrl);
А на сервере уже разбираешься с декодированием. Так точно ничего не поломается при передаче. Еще можно попробовать URL API, если твой браузер его поддерживает. Оно вроде умнее работает с урлами.
слушай, у меня была похожая проблема с хешами в урлах. в итоге помогло использование encodeURIComponent() вместо простой замены. попробуй так:
function обработатьСсылку(url) {
return encodeURIComponent(url);
}
эта функция корректно закодирует все спецсимволы, включая решетку. еще можно попробовать decodeURIComponent() перед открытием, если браузер сам что-то экранирует:
window.open(decodeURIComponent(обработатьСсылку(путьКФайлу)));
надеюсь, это поможет решить проблему с двойным экранированием. дай знать, если получится!
Хм, а ты пробовал использовать encodeURI() вместо ручной замены? Оно вроде как специально для URL и не должно портить решётку. Типа:
let encodedPath = encodeURI(путьКФайлу);
window.open(encodedPath);
Если не поможет, можно ещё поиграться с options в window.open(), там есть всякие настройки. Может, дело в них?