Защита контента от копирования. Часть 4



Предыдущие статьи Защита контента от копирования. Часть 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') &gt;= 0)
		return true;
 
	else if(sClassName.split(' ').indexOf('no-protect') &gt;= 0)	
			return false;	
	else if(parent)
			return checkProtection(parent);
 
	return true;	
}

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

Благодарность принимаю в виде:

  • "Спасибо" от чистого сердца
  • лайка / шары
  • комментария
  • Яндекс.Денег 4100162037745
  • WebMoney Z150917603458, R351335054010, E199046692457, U207019834816



Оставить комменатрий

Последние 0 комментариев(я)