Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Запрет на кодирование ссылки (https://javascript.ru/forum/misc/80062-zapret-na-kodirovanie-ssylki.html)

arkadii_parovozov 22.04.2020 18:09

Запрет на кодирование ссылки
 
Всем привет!

Есть домен в зоне .рф и естественно ссылка тоже состоит из кириллицы, пример:

Код:

https://сайт.рф/каталог
но при копировании, браузер кодирует кириллицу в ссылке и в итоге получаем это:

Код:

https://сайт.рф/%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3
Можно ли запретить ему это делать? Или может есть другие способы решить эту проблему. Как я понял js не имеет доступа к буферу клиента. Да и событие в системном окне тоже не получиться отловить.

В общем, как решить эту проблему?

Nexus 22.04.2020 19:25

Цитата:

Сообщение от arkadii_parovozov
как решить эту проблему?

А в чем, собственно, проблема? Не красиво?

arkadii_parovozov 22.04.2020 19:42

Цитата:

Сообщение от Nexus (Сообщение 523219)
А в чем, собственно, проблема? Не красиво?

ну да. Плюс ко всему бывает что нужно скопировать и вставить в таблицу (ексель например) в виде текста, а там километр непонятных символов. Не руками же перепечатывать. Это один из примеров, а так еще если поделится ссылкой, то некоторые могут просто не перейти, так как испугаются непонятного текста.

MC-XOBAHCK 22.04.2020 19:55

Используйте латиницу для урлов, а лучше вообще смените домен на .ru или другую зону на латинице.

Кириллические домены многие уже к 2012 году отлюбили. Ни мыла вам, ни нормальной ссылки. Заморочек больше чем выхлопа. Я серьёзно, обдумайте вариант смены, ну или мучайтесь с этим дальше.

Malleys 22.04.2020 20:32

Цитата:

Сообщение от arkadii_parovozov
Как я понял js не имеет доступа к буферу клиента

Для этого есть Clipboard API, а вам нужен метод — navigator.clipboard.writeText (для поддержки Safari я вам рекомендую использовать polyfill)

Цитата:

Сообщение от arkadii_parovozov
но при копировании, браузер кодирует кириллицу в ссылке и в итоге получаем это

Всё правильно, в URL кодируются многие символы, чтобы адрес ссылки мог быть представим в разных контекстах. Это полностью рабочий адрес ссылки.

В JS link.href возвращает URI независимо от того, как в разметке представлен атрибут href — как URI, или как IRI (т. е. в данном примере — https://xn--80aswg.xn--p1ai/%D0%BA%D...BB%D0%BE%D0%B3)

Если у вас в разметке адрес представлен в атрибуте href как IRI, то вам достаточно его прочитать и записать в буфер обмена. В примере нажатие на кнопку запускает процесс копирования...
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard-polyfill/2.8.6/clipboard-polyfill.js"></script>
<a id="link" href="https://сайт.рф/каталог">сайт.рф/каталог</a>

<script>

const button = document.createElement("button");
button.textContent = "Копировать адрес ссылки";

button.addEventListener("click", event => {
	const iri = document.querySelector("a#link").getAttribute("href");
		
	clipboard.writeText(iri).then(() => {
		alert('Ccылка скопирована! ' + iri);
	});
});

document.body.appendChild(button);
	
</script>


Если же у вас в разметке адрес представлен в атрибуте href как URI, то вам нужна сторонняя библиотека для того, чтобы перевести URI в IRI.
<script src="https://cdnjs.cloudflare.com/ajax/libs/clipboard-polyfill/2.8.6/clipboard-polyfill.js"></script>
<script src="https://unpkg.com/uri-js@4.2.2/dist/es5/uri.all.min.js"></script>

<a id="link" href="https://xn--80aswg.xn--p1ai/%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3">сайт.рф/каталог</a>

<script>

const button = document.createElement("button");
button.textContent = "Копировать адрес ссылки";

button.addEventListener("click", event => {
	const iri = URI.serialize(URI.parse(document.querySelector("a#link").href), { iri: true });
		
	clipboard.writeText(iri).then(() => {
		alert('Ccылка скопирована! ' + iri);
	});
});

document.body.appendChild(button);
	
</script>


Если вы не уверены, что у вас используется в атрибуте href (URI или IRI), то я вам рекомендую использовать последний пример. Сторонний код вы можете скачать к себе в проект.

Цитата:

Сообщение от MC-XOBAHCK
Используйте латиницу для урлов, а лучше вообще смените домен на .ru или другую зону на латинице.

Все браузеры уже давно поддерживают IRI, если только речь не о старых (ну о реально старых) браузерах!

MC-XOBAHCK 22.04.2020 20:47

Цитата:

Сообщение от Malleys
се браузеры уже давно поддерживают IRI, если только речь не о старых (ну о реально старых) браузерах!

Я не о браузерах имел ввиду, а о неудобстве кириллических доменов и урлов.

Насколько я понял, человек спрашивает о копировании урла из браузерной строки.

Malleys 22.04.2020 20:58

Цитата:

Сообщение от MC-XOBAHCK
неудобстве кириллических доменов и урлов.

Причём тут только кириллица? IRI предполагает использование всего Unicode, что конечно очень удобно, поскольку тогда любой адрес легко читаем.

А неудобство возникает из-за того, что в некоторых местах до сих пор используется URI, когда полностью прекратится использование URI и произойдёт переход на IRI, то такие проблемы исчезнут.

Даже если домен не содержит символы Unicode, которых нет в ASCII, такие символы могут встречаться в query string. Сравните...

URI — https://www.google.com/search?q=%D0%...%D0%B8% D0%B5

IRI — https://www.google.com/search?q=программирование

Конечно же вариант IRI удобен и для чтения и для разбора...

MC-XOBAHCK 22.04.2020 21:56

URI и IRI это в настройках сервера?
URI встречаю постоянно (наверное в документациях), но честно - даже не задумываюсь что это такое. Про IRI наверное сегодня первый раз от вас услышал.

arkadii_parovozov 23.04.2020 09:04

Malleys, спасибо большое за развернутый ответ с примерами. Но к сожалению речь идет именно о копировании из адресной строки браузера.

voraa 23.04.2020 09:20

Странно,
Когда я ввожу в адресную строку
Код:

https://сайт.рф/каталог
Потом копирую ее и просто вставляю в текстовый редактор
При копировании из Файрфокса получаю
Код:

https://сайт.рф/%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3
А при копировании из Хрома
Код:

https://xn--80aswg.xn--p1ai/%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3


Часовой пояс GMT +3, время: 01:25.