29.07.2019, 22:36
|
|
Профессор
|
|
Регистрация: 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" не решил моей проблемы.
|
|
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>
|
|
29.07.2019, 23:40
|
|
Профессор
|
|
Регистрация: 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.
|
|
30.07.2019, 00:20
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от Русский
|
Единственный способ защитить текст от копирования - не показывать его никому.
|
Вы опять перепутали! На этот раз защиту текста от копирования с запретом копирования текста.
|
|
30.07.2019, 00:55
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от Русский
|
тогда предлагаю в качестве запрета просто написать на странице: "Не копируй текст!"
|
И как это поможет, чтобы текст не выделялся? Например, в интерактивном приложении, где требуется взаимодействие при помощи мыши или сенсорного экрана, выделение текста, которое может происходит при перемещении, перетаскивании и пр., только мешает. Даже самое простое, типа выделить часть картинки, требует запрет на копирование текста, чтобы не выделялся весь интерфейс! Не говоря уже о том, что это могут быть карты, игры, графики, схемы... Это не значит, что там нужно защищать текст от копирования, там бывает необходим запрет копирования текста, чтобы взаимодействие было адекватным. А текст может копироваться как раз таки при нажатии на кнопку "Скопируй текст!"
Сообщение от Русский
|
а не играться с бессмысленными скриптами.
|
А где вы в моём примере увидели скрипт? Или вы перепутали скрипт со стилями?
Последний раз редактировалось Malleys, 30.07.2019 в 00:59.
|
|
30.07.2019, 08:06
|
Профессор
|
|
Регистрация: 14.01.2015
Сообщений: 12,989
|
|
Сообщение от Malleys
|
защиту текста от копирования с запретом копирования текста
|
А копирование ради забавы? Вся защита на клиенте, это глупости, если пользователь видит, если это ценно и нужно украсть, то все шалости запрета/защиты ничем не помогут.
|
|
30.07.2019, 08:44
|
|
Профессор
|
|
Регистрация: 11.07.2016
Сообщений: 300
|
|
Сообщение от Malleys
|
На телефоне всё выделилось, на компьютере нажми три раза быстро на текст, тоже выделится... И ещё куча способов...
|
Подскажите, а есть ли способ обойти этот баг ? Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт
|
|
30.07.2019, 13:23
|
|
Профессор
|
|
Регистрация: 20.12.2009
Сообщений: 1,714
|
|
Сообщение от laimas
|
Вся защита на клиенте, это глупости
|
Никакие это не глупости, просто вы совершенно не поняли, что я написал! Ещё раз читайте пост №7
И ещё раз прочитайте это...
Сообщение от Malleys
|
в интерактивном приложении, где требуется взаимодействие при помощи мыши или сенсорного экрана, выделение текста, которое может происходит при перемещении, перетаскивании и пр., только мешает
|
Сообщение от Black_Star
|
Подскажите, а есть ли способ обойти этот баг?
|
Какой баг? Я вам представил решение, которое адекватно работает на всех платформах!
Сообщение от Black_Star
|
Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт
|
Это уже проблемы пользователя, который решил залезть в инструменты разработчика и отключить запрет на выделение. Он как бы ведь должен понимать, почему вдруг интерфейс стал выделяться?
UPD Возможно вы перепутали запрет на выделение с защитой от кражи данных! Почему ваш запрет на выделение мышкой (почему это так смешно звучит в 2019?) нельзя считать защитой от кражи данных?
Рассмотрите другие варианты... - скачивание и сохранение при помощи curl
- просмотр исходного кода
- сохранение страницы в браузере
- снимок экрана и программа распознавания текста
Достойной защитой от кражи данных является авторизованный доступ к данным!
Последний раз редактировалось Malleys, 30.07.2019 в 13:46.
|
|
31.07.2019, 01:42
|
|
Профессор
|
|
Регистрация: 01.12.2016
Сообщений: 3,650
|
|
Сообщение от Black_Star
|
Подскажите, а есть ли способ обойти этот баг ? Просто отключение стиля user-select: none; Оно как бы ещё проще чем найти запрещающий скрипт
|
Зачем искать запрещающий скрипт? ctrl + shift + C и клик по вашему блоку.
СSS от дурака оптимальное решение.
|
|
|
|