Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 29.07.2019, 22:36
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Запрет на копирование текста сайта.
Добрый день, уважаемые, вот нашел скрипт который блокирует быстрые клавиши на запрет копирование текста сайта.
<!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" не решил моей проблемы.
Ответить с цитированием
  #2 (permalink)  
Старый 29.07.2019, 23:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,124

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>
Ответить с цитированием
  #3 (permalink)  
Старый 29.07.2019, 23:40
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от 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, 29.07.2019 в 23:53.
Ответить с цитированием
  #4 (permalink)  
Старый 30.07.2019, 00:20
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от Русский
Единственный способ защитить текст от копирования - не показывать его никому.
Вы опять перепутали! На этот раз защиту текста от копирования с запретом копирования текста.
Ответить с цитированием
  #5 (permalink)  
Старый 30.07.2019, 00:55
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

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

Сообщение от Русский
а не играться с бессмысленными скриптами.
А где вы в моём примере увидели скрипт? Или вы перепутали скрипт со стилями?

Последний раз редактировалось Malleys, 30.07.2019 в 00:59.
Ответить с цитированием
  #6 (permalink)  
Старый 30.07.2019, 08:06
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Сообщение от Malleys
защиту текста от копирования с запретом копирования текста
А копирование ради забавы? Вся защита на клиенте, это глупости, если пользователь видит, если это ценно и нужно украсть, то все шалости запрета/защиты ничем не помогут.
Ответить с цитированием
  #7 (permalink)  
Старый 30.07.2019, 08:44
Аватар для Black_Star
Профессор
Отправить личное сообщение для Black_Star Посмотреть профиль Найти все сообщения от Black_Star
 
Регистрация: 11.07.2016
Сообщений: 300

Сообщение от Malleys
На телефоне всё выделилось, на компьютере нажми три раза быстро на текст, тоже выделится... И ещё куча способов...
Подскажите, а есть ли способ обойти этот баг ? Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт
Ответить с цитированием
  #8 (permalink)  
Старый 30.07.2019, 13:23
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Сообщение от laimas
Вся защита на клиенте, это глупости
Никакие это не глупости, просто вы совершенно не поняли, что я написал! Ещё раз читайте пост №7
И ещё раз прочитайте это...
Сообщение от Malleys
в интерактивном приложении, где требуется взаимодействие при помощи мыши или сенсорного экрана, выделение текста, которое может происходит при перемещении, перетаскивании и пр., только мешает




Сообщение от Black_Star
Подскажите, а есть ли способ обойти этот баг?
Какой баг? Я вам представил решение, которое адекватно работает на всех платформах!

Сообщение от Black_Star
Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт
Это уже проблемы пользователя, который решил залезть в инструменты разработчика и отключить запрет на выделение. Он как бы ведь должен понимать, почему вдруг интерфейс стал выделяться?

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

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

Последний раз редактировалось Malleys, 30.07.2019 в 13:46.
Ответить с цитированием
  #9 (permalink)  
Старый 31.07.2019, 01:42
Аватар для j0hnik
Профессор
Отправить личное сообщение для j0hnik Посмотреть профиль Найти все сообщения от j0hnik
 
Регистрация: 01.12.2016
Сообщений: 3,650

Сообщение от Black_Star Посмотреть сообщение
Подскажите, а есть ли способ обойти этот баг ? Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт
Зачем искать запрещающий скрипт? ctrl + shift + C и клик по вашему блоку.
СSS от дурака оптимальное решение.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Парсинг текста с сайта WonderDog Node.JS 0 05.01.2018 10:27
Как с помощью скрипта высчитать ширину полосы прокрутки? LADYX Элементы интерфейса 35 13.11.2017 12:50
Есть ли способ сделать копирование текста по нажатию на кнопку? Александр141 Элементы интерфейса 0 03.02.2017 19:06
background resize IceDvl jQuery 4 25.04.2014 17:54
запрет выделения текста czp Events/DOM/Window 1 18.01.2013 15:59