Предыдущие статьи Защита контента от копирования. Часть 1, Защита контента от копирования. Часть 2 и Защита контента от копирования. Часть 3 рассказывают, как я пришел к мысли о защите контента, какие варианты нашел в интернете и взял за основу, а так же содержат части конечного скрипта. В этой статье весь скрипт полностью.
Конечный скрип прост и лёгок)
if(document.getElementsByClassName) { getElementsByClass = function(classList, node)
{ return (node || document).getElementsByClassName(classList);
} } else { getElementsByClass = function(classList, node) { var node = node || document, list = node.getElementsByTagName('*'), length = list.length, classArray = classList.split(/\s+/), classes = classArray.length, result = [], i,j; for(i = 0; i < length; i++) for(j = 0; j < classes; j++) if(list[i].className.search('\\b' + classArray[j] + '\\b') != -1) { result.push(list[i]); break; } return result; } } var oProtect = getElementsByClass('protect'), oNotProtect = getElementsByClass('no-protect'); var iProtect = oProtect.length, iNotProtect = oNotProtect.length; for(var i = 0; i < iProtect; i++) { oProtect[i].ondragstart = catchControlKeys; oProtect[i].onselectstart = catchControlKeys; oProtect[i].oncopy = catchControlKeys; oProtect[i].oncontextmenu = catchControlKeys; oProtect[i].onkeypress = catchControlKeys; } for(var i = 0; i < iNotProtect; i++) { oNotProtect[i].ondragstart = disableProtection; oNotProtect[i].onselectstart = disableProtection; oNotProtect[i].oncopy = disableProtection; oNotProtect[i].oncontextmenu = disableProtection; oNotProtect[i].onkeypress = disableProtection; } function disableProtection(event) { e = event || window.event; e.stopPropagation(); return true; } function catchControlKeys(evn) { event = evn
|| window.event; var aRestrict = [117, 85, 99, 67, 97, 65]; /*117, 85 ctrl+u 99, 67 ctrl+c 97, 65 ctrl+a*/ if(aRestrict.indexOf(getKeyCode(event)) >= 0) return false; else if(event.type == 'dragstart'
|| event.type == 'selectstart'
|| event.type == 'contextmenu'
|| event.type == 'copy') return false; return true; } function getKeyCode(e) { var iCode = e.keyCode; if(!iCode) iCode = e.which; return iCode; }
Скрипт рекумендую загружать либо внижу страницы, перед тэгом body, либо использовать onload или jQuery(document).ready();. Иначе не получится ничего найти)
Если вам нужно защитить контент, то пишете такой HTML
<p class="protect"> Ваш текст </p>
Если нужно внутри защищенного узла разрешить какой-то блок (например, адресс электронной почты, номер телефона, форма комментариев), то пишете следующее
<p class="protect">
Здесь нельзя копировать, выделять текст, вызывать меню
<p class="no-protect">
А вот здесь уже можно
</p>
<p>
Здесь нельзя
</p>
</p>
<p class="no-protect">
Вот здесь тоже можно
</p>
<p>
Вот здесь тоже можно
</p>
Как видно, в конечном итоге от начального скрипта из статьи Защита контента от копирования. Часть 1 не осталось практически ничего. Но спасибо его автору за идею и указаное направление для движения.
P.S. В процессе написания скрипта у меня была еще одна функция, но в конечном варианте ее использование стало ненужным. Приведу код здесь, может, кому понадобится. Функция рекурсивно определяет, какой класс у данного элемента, то есть, определяет, защищать контент или нет внутри данного узла. Начинает поиск с элемента, на котором сработало событие, и подымается вверх по дереву, пока не найдет класс protect или no-protect
function checkProtection(element) { if(typeof(element) == 'undefined' || !element || element.nodeName.toLowerCase() == 'body') return true; var sClassName = element.className, parent = element.parentNode; if(typeof(sClassName) == 'undefined' || sClassName == '') { if(parent) return checkProtection(parent); else return true; }else if(sClassName.split(' ').indexOf('protect') >= 0) return true; else if(sClassName.split(' ').indexOf('no-protect') >= 0) return false; else if(parent) return checkProtection(parent); return true; }
Недостаток в том, что при каждом действии на любом узле на странице вызывалась эта функция. Поэтому я решил изменить логику и использовал обработчики на конкретных узлах.
