Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Хаки » Вставка ссылки на сайт при копировании

Вставка ссылки на сайт при копировании


     30.07.2013    беклинк, копирайт    Хаки, Ламерские вопросы    9343

вопрос
Задача сделать так чтоб при копировании текста (стихотворений например) добавлялась ещё и ссылка откуда копируют.
Я нашёл в интернете кучу примеров но все их можно разделить на 2 вида:

1. не работает на dle
Реализация:
var source_link = '<p>Подробнее: <a href="' + location.href + '">' + location.href + '</a></p>';
jQuery(
    function($)
    {
        if (window.getSelection) $('#content div.post').bind(
            'copy',
            function()
            {
                var selection = window.getSelection();
                var range = selection.getRangeAt(0);

                var magic_div = $('<div>').css({ overflow : 'hidden', width: '1px', height : '1px', position : 'absolute', top: '-10000px', left : '-10000px' });
                magic_div.append(range.cloneContents(), source_link);
                $('body').append(magic_div);

                var cloned_range = range.cloneRange();
                selection.removeAllRanges();

                var new_range = document.createRange();
                new_range.selectNode(magic_div.get(0));
                selection.addRange(new_range);

                window.setTimeout(
                    function()
                    {
                        selection.removeAllRanges();
                        selection.addRange(cloned_range);
                        magic_div.remove();
                    }, 0
                );
            }
        );
    }
);

Настраиваемые параметры:

source_link — текст, который будет добавляться к копируемому фрагменту. В данном примере задаётся статически, но при желании генерацию ссылки можно усложнить (например, при копировании с текста с домашней страницы можно возвращать ссылку на статью, из которой взята данная цитата). Для этого в строке magic_div.append(range.cloneContents(), source_link); вместо source_link нужно использовать свою функцию, возвращающую HTML для вставки в копируемый фрагмент.
'#content div.post' — выражение, задающее один или более контейнер с текстом, при копировании которого нужно добавлять ссылку на оригинал. Идея в том, что добавлять ссылку на статью при копировании, скажем, части текста одного из комментариев к статье было бы нелогично. С помощью данного выражения можно задать требуемые защищаемые объекты.

Возможные улучшения: проверка длины копируемого текста. Например, если пользователь копирует меньше 20 слов, не добавлять ссылку. Получить выделенный текст можно через range.cloneContents().textContent.
тут нашёл

и 2. Не копирует форматирование текста. т.е. стихи перестают быть стихами.

Создать текстовой файл copyrtext.js и закидываем его в папку /engine/classes/js/ на своем ресурсе.

function addLink() {     var body_element = document.getElementsByTagName('body')[0];     var selection;     selection = window.getSelection();     var pagelink = "<br /><br  /> Источник: <a href='"+document.location.href+"'>"+document.location.href+"</a><br  />© dle9.com";     var copytext = selection + pagelink;     var newdiv = document.createElement('div');     newdiv.style.position='absolute';     newdiv.style.left='-99999px';     body_element.appendChild(newdiv);     newdiv.innerHTML = copytext;     selection.selectAllChildren(newdiv);     window.setTimeout(function() {         body_element.removeChild(newdiv);     },0);}document.oncopy = addLink;




Остается прописать его в начале страницы main.tpl между тегами

<head><script type="text/javascript" src="/engine/classes/js/copyrtext.js"></script></head>



Нужно рабочее решение. Заранее благодарен за помощь.

Ответил: SX2


Перед вставить

function addLink() {
    var body_element = document.getElementsByTagName('body')[0];
    var selection = window.getSelection();

    // Вы можете изменить текст в этой строчке
    var pagelink = "[b]Источник:[/b] "+document.location.href+"";
    var copytext = selection + pagelink;
    var newdiv = document.createElement('div');
    newdiv.style.position = 'absolute';
    newdiv.style.left = '-99999px';
    body_element.appendChild(newdiv);
    newdiv.innerHTML = copytext;
    selection.selectAllChildren(newdiv);
    window.setTimeout( function() {
        body_element.removeChild(newdiv);
    }, 0);
}
document.oncopy = addLink;

17 комментариев

ПафНутиЙ
Админ

ПафНутиЙ - 30 июля 2013 09:24 -

На сайте включена "Маша"? - это идиотский скрипт "поделиться выделенным текстом в соцсетях".
попробуйте отключить и первый способ ипользовать.

Каков вопрос - таков и ответ. Просто помните об этом.

Chessman
Юзер

Chessman - 30 июля 2013 17:34 -

я так понял маша только в 10 версии появилась. на сайте 9.5

Chessman
Юзер

Chessman - 1 августа 2013 23:31 -

пробовал по очереди убирать все скрипты на сайте. таких не много: кнопка вверх, комменты вконтакте, {ajax}, счётчики, часы (нерабочие). Всё равно не заработало.

Wave
Юзер

Wave - 2 августа 2013 12:07 -

Попробуй этот вариант http://tops.net.ua/jquery_addtocopy/ (рабочий кросбраузерный пример)

Chessman
Юзер

Chessman - 2 августа 2013 18:16 -

вставил в main.tpl
    <script type="text/javascript" src="{THEME}/js/up.js"></script>
    <script type="text/javascript" src="{THEME}/js/addtocopy.js"></script>
    <script type="text/javascript">
        $(function(){
            $("#content").addtocopy({htmlcopytxt: '<br>Подробнее: <a href="'+window.location.href+'">'+window.location.href+'</a>'});
        });
    </script>>

и создал файлик /js/addtocopy.js
/**
* @author Falchenko Maxim aka be3
* @plugin_page http://tops.net.ua/jquery_addtocopy/
* @desc Adds a link to the copied text
* @version 1.2
* @example
* $("#content").addtocopy();
* @license free
**/
jQuery.fn.addtocopy = function(usercopytxt) {
    var options = {htmlcopytxt: '<br>Источник: <a href="'+window.location.href+'">'+window.location.href+'</a><br>', minlen: 25, addcopyfirst: false}
    $.extend(options, usercopytxt);
    var copy_sp = document.createElement('span');
    copy_sp.id = 'ctrlcopy';
    copy_sp.innerHTML = options.htmlcopytxt;
    return this.each(function(){
        $(this).mousedown(function(){$('#ctrlcopy').remove();});
        $(this).mouseup(function(){
            if(window.getSelection){    //good times
                var slcted=window.getSelection();
                var seltxt=slcted.toString();
                if(!seltxt||seltxt.length<options.minlen) return;
                var nslct = slcted.getRangeAt(0);
                seltxt = nslct.cloneRange();
                seltxt.collapse(options.addcopyfirst);
                seltxt.insertNode(copy_sp);
                if (!options.addcopyfirst) nslct.setEndAfter(copy_sp);
                slcted.removeAllRanges();
                slcted.addRange(nslct);
            } else if(document.selection){    //bad times
                var slcted = document.selection;
                var nslct=slcted.createRange();
                var seltxt=nslct.text;
                if (!seltxt||seltxt.length<options.minlen) return;
                seltxt=nslct.duplicate();
                seltxt.collapse(options.addcopyfirst);
                seltxt.pasteHTML(copy_sp.outerHTML);
                if (!options.addcopyfirst) {nslct.setEndPoint("EndToEnd",seltxt); nslct.select();}
            }
        });
  });
}

Chessman
Юзер

Chessman - 2 августа 2013 18:16 -

Не работает. Кэш чистил и в браузере и в движке

Gopr
Юзер

Gopr - 3 августа 2013 00:25 -

Chessman попробуйте еще такой вариант:
function addLink(){var a=document.getElementsByTagName("body")[0];var b;b=window.getSelection();var c=" сайт.ru";var e=b+c;var d=document.createElement("div");d.style.position="absolute";d.style.left="-99999px";a.appendChild(d);d.innerHTML=e;b.selectAllChildren(d);window.setTimeout(function(){a.removeChild(d)},0)}document.oncopy=addLink;
Это аналог второго скрипта в вашем вопросе единственное, что код сжат и к скопированному тексту будет добавляться не кликабельная ссылка а просто текстовая. Так даже не заметней будет при "правка копировать", "правка вставить". Код рабочий проверял во всех браузерах кроме Ei,

MAPKOBKA
Юзер

MAPKOBKA - 19 июля 2014 13:19 -

Спасибо.
запустилось на DLE 10,1
вставил в конец dle_js.js
жалко не сохраняет форматирование

Wave
Юзер

Wave - 3 августа 2013 10:49 -

<div id="content">
текст который будет копироваться и к нему будет прибавляться ссылка.
</div>

SX2
Эксперт

SX2 - 2 августа 2013 21:11 -

Парсер порезал ответ Код

Самая сложная часть работы – решиться приступить к ней.

Chessman
Юзер

Chessman - 7 августа 2013 05:59 -

Заработал и первый вариант описанный в вопросе. Дело было в cжатии js. Но результат такой же как и dj втором варианте.
Код предложенный SX2 так же работает и так же сбрасывает форматирование текста.

Chessman
Юзер

Chessman - 7 августа 2013 06:04 -

этот коммент надо удалить. не заработало.

MAPKOBKA
Юзер

MAPKOBKA - 22 июля 2014 14:27 -

Нашел способ с форматированием.

var source_link = '<p>Узнать детали: <a href="' + location.href + '">' + location.href + '</a></p>';
jQuery(
    function($)
    {
        if (window.getSelection) $('#dle-content').bind(
            'copy',
            function()
            {
                var selection = window.getSelection();
                var range = selection.getRangeAt(0);

                var magic_div = $('<div>').css({ overflow : 'hidden', width: '1px', height : '1px', position : 'absolute', top: '-10000px', left : '-10000px' });
                magic_div.append(range.cloneContents(), source_link);
                $('body').append(magic_div);

                var cloned_range = range.cloneRange();
                selection.removeAllRanges();

                var new_range = document.createRange();
                new_range.selectNode(magic_div.get(0));
                selection.addRange(new_range);

                window.setTimeout(
                    function()
                    {
                        selection.removeAllRanges();
                        selection.addRange(cloned_range);
                        magic_div.remove();
                    }, 0
                );
            }
        );
    }
);

Chessman
Юзер

Chessman - 8 марта 2016 17:29 -

код из топика вроде. не работает почему-то

jeka6774
Юзер

jeka6774 - 1 февраля 2017 01:35 -

Спасибо за скрипт.

VYanchuk
Юзер

VYanchuk - 16 февраля 2016 14:22 -

Статья по теме добавления ссылки на сайт в скопированный текст на Drupal 7 https://shneider-host.ru/blog/drupal-7-dobavlenie-ssylki-na-sayt-v-skopirovannyy-tekst.html

torber
Юзер

torber - 21 августа 2020 15:48 -

Понимаю, что с времени публикации вопроса прошло уже много времени, НО возможно кто-то подскажет как сделать чтобы ссылка появлялась не в конце копируемого текста а где-то в середине?

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

 10.10.2012 lexa21reg  Хаки
наверх