Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Запрет на копирование текста сайта. (https://javascript.ru/forum/misc/78121-zapret-na-kopirovanie-teksta-sajjta.html)

Black_Star 29.07.2019 22:36

Запрет на копирование текста сайта.
 
Добрый день, уважаемые, вот нашел скрипт который блокирует быстрые клавиши на запрет копирование текста сайта.
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Closed Site</title>
    <script>
        "use strict";
        function preventSelection(element) {
         //запрещает выделение мышкой и комбинации клавиш Ctrl + A и Ctrl + U и Ctrl + S
            function preventSelection(element) {
                var preventSelection = false;
                var event = event || window.event;
                var sender = event.target || event.srcElement;


                function addHandler(element, event, handler) {
                    if (element.attachEvent) element.attachEvent('on' + event, handler);
                    else if (element.addEventListener) element.addEventListener(event, handler, false);
                }

                function removeSelection() {
                    if (window.getSelection) {
                        window.getSelection().removeAllRanges();
                    } else if (document.selection && document.selection.clear)
                        document.selection.clear();
                }

                //запрещаем выделять текст мышкой
                addHandler(element, 'mousemove', function () {
                    if (preventSelection) removeSelection();
                });
                addHandler(element, 'mousedown', function (event) {

                    preventSelection = !sender.tagName.match(/INPUT|TEXTAREA/i);
                });

                //запрещаем нажатие клавищ Ctrl + A и Ctrl + U и Ctrl + S
                function killCtrlA(event) {
                    if (sender.tagName.match(/INPUT|TEXTAREA/i)) return;
                    var key = event.keyCode || event.which;
                    if ((event.ctrlKey && key == 'U'.charCodeAt(0)) || (event.ctrlKey && key == 'A'.charCodeAt(0)) || (event.ctrlKey && key == 'S'.charCodeAt(0)))  // 'A'.charCodeAt(0) можно заменить на 65
                    {
                        removeSelection();
                        if (event.preventDefault) event.preventDefault();
                        else event.returnValue = false;
                    }
                }

                addHandler(element, 'keydown', killCtrlA);
                addHandler(element, 'keyup', killCtrlA);
            }

            preventSelection(document);

        }

        preventSelection(document);
    </script>
</head>
<body>

<h1>If you see this sentence, that mean something go wrong !</h1>

</body>
</html>

Подскажите, пожалуйста, почему в консоль сыпятся ошибки на строке
var sender = event.target || event.srcElement; ? Как это можно исправить ? (Я нашел что event.srcElement используется для старых версий FF) но почему-то "use strict" не решил моей проблемы.

рони 29.07.2019 23:09

Black_Star,
код устарел и мало полезен.
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Closed Site</title>
    <script>
        "use strict";

         //запрещает выделение мышкой и комбинации клавиш Ctrl + A и Ctrl + U и Ctrl + S
            function preventSelection(element) {
                var preventSelection = false;
                function addHandler(element, event, handler) {
                    if (element.attachEvent) element.attachEvent('on' + event, handler);
                    else if (element.addEventListener) element.addEventListener(event, handler, false);
                }

                function removeSelection() {
                    if (window.getSelection) {
                        window.getSelection().removeAllRanges();
                    } else if (document.selection && document.selection.clear)
                        document.selection.clear();
                }

                //запрещаем выделять текст мышкой
                addHandler(element, 'mousemove', function () {
                    if (preventSelection) removeSelection();
                });
                addHandler(element, 'mousedown', function (event) {
                     var event = event || window.event;
                     var sender = event.target || event.srcElement;
                    preventSelection = !sender.tagName.match(/INPUT|TEXTAREA/i);
                });

                //запрещаем нажатие клавищ Ctrl + A и Ctrl + U и Ctrl + S
                function killCtrlA(event) {
                    var event = event || window.event;
                    var sender = event.target || event.srcElement;
                    if (sender.tagName.match(/INPUT|TEXTAREA/i)) return;
                    var key = event.keyCode || event.which;
                    if ((event.ctrlKey && key == 'U'.charCodeAt(0)) || (event.ctrlKey && key == 'A'.charCodeAt(0)) || (event.ctrlKey && key == 'S'.charCodeAt(0)))  // 'A'.charCodeAt(0) можно заменить на 65
                    {
                        removeSelection();
                        if (event.preventDefault) event.preventDefault();
                        else event.returnValue = false;
                    }
                }

                addHandler(element, 'keydown', killCtrlA);
                addHandler(element, 'keyup', killCtrlA);
            }

            preventSelection(document);


    </script>
</head>
<body>

<h1>If you see this sentence, that mean something go wrong !</h1>

</body>
</html>

Malleys 29.07.2019 23:40

Цитата:

Сообщение от Black_Star
на запрет копирование текста

На телефоне всё выделилось, на компьютере нажми три раза быстро на текст, тоже выделится... И ещё куча способов...

СSS-свойство user-select позволяет контролировать, когда пользователь может выделять текст...
<!doctype html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
	<meta http-equiv="X-UA-Compatible" content="ie=edge">
	<title>Closed Site</title>
	<style>
		body {
			-moz-user-select: none;
			-webkit-user-select: none;
			-ms-user-select: none;
			user-select: none;
		}
	</style>
</head>

<body>
	<h1>If you see this sentence, that mean something go wrong !</h1>
</body>

</html>


Black_Star, рони, а если текст нельзя выделять, то должен ли курсор быть в виде символа, указывающего, что возможно текстовое выделение, а именно то, что для текста действуют выделения и контекстные меню, характерные для полей текстового ввода?

Malleys 30.07.2019 00:20

Цитата:

Сообщение от Русский
Единственный способ защитить текст от копирования - не показывать его никому.

Вы опять перепутали! На этот раз защиту текста от копирования с запретом копирования текста.

Malleys 30.07.2019 00:55

Цитата:

Сообщение от Русский
тогда предлагаю в качестве запрета просто написать на странице: "Не копируй текст!"

И как это поможет, чтобы текст не выделялся? Например, в интерактивном приложении, где требуется взаимодействие при помощи мыши или сенсорного экрана, выделение текста, которое может происходит при перемещении, перетаскивании и пр., только мешает. Даже самое простое, типа выделить часть картинки, требует запрет на копирование текста, чтобы не выделялся весь интерфейс! Не говоря уже о том, что это могут быть карты, игры, графики, схемы... Это не значит, что там нужно защищать текст от копирования, там бывает необходим запрет копирования текста, чтобы взаимодействие было адекватным. А текст может копироваться как раз таки при нажатии на кнопку "Скопируй текст!"

Цитата:

Сообщение от Русский
а не играться с бессмысленными скриптами.

А где вы в моём примере увидели скрипт? Или вы перепутали скрипт со стилями?

laimas 30.07.2019 08:06

Цитата:

Сообщение от Malleys
защиту текста от копирования с запретом копирования текста

А копирование ради забавы? Вся защита на клиенте, это глупости, если пользователь видит, если это ценно и нужно украсть, то все шалости запрета/защиты ничем не помогут.

Black_Star 30.07.2019 08:44

Цитата:

Сообщение от Malleys
На телефоне всё выделилось, на компьютере нажми три раза быстро на текст, тоже выделится... И ещё куча способов...

Подскажите, а есть ли способ обойти этот баг ? Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт

Malleys 30.07.2019 13:23

Цитата:

Сообщение от laimas
Вся защита на клиенте, это глупости

Никакие это не глупости, просто вы совершенно не поняли, что я написал! Ещё раз читайте пост №7
И ещё раз прочитайте это...
Цитата:

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





Цитата:

Сообщение от Black_Star
Подскажите, а есть ли способ обойти этот баг?

Какой баг? Я вам представил решение, которое адекватно работает на всех платформах!

Цитата:

Сообщение от Black_Star
Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт

Это уже проблемы пользователя, который решил залезть в инструменты разработчика и отключить запрет на выделение. Он как бы ведь должен понимать, почему вдруг интерфейс стал выделяться?

UPD Возможно вы перепутали запрет на выделение с защитой от кражи данных! Почему ваш запрет на выделение мышкой (почему это так смешно звучит в 2019?) нельзя считать защитой от кражи данных?
Рассмотрите другие варианты...
  • скачивание и сохранение при помощи curl
  • просмотр исходного кода
  • сохранение страницы в браузере
  • снимок экрана и программа распознавания текста

Достойной защитой от кражи данных является авторизованный доступ к данным!

j0hnik 31.07.2019 01:42

Цитата:

Сообщение от Black_Star (Сообщение 510901)
Подскажите, а есть ли способ обойти этот баг ? Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт

Зачем искать запрещающий скрипт? ctrl + shift + C и клик по вашему блоку.
СSS от дурака оптимальное решение.


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