Не нравятся результаты поиска? Попробуйте другой поиск!
dle-faq.ru FAQ (все вопросы) Хаки Вставка ссылки на сайт при копировании

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


     30.07.2013    Хаки, Ламерские вопросы    4342

вопрос
Задача сделать так чтоб при копировании текста (стихотворений например) добавлялась ещё и ссылка откуда копируют.
Я нашёл в интернете кучу примеров но все их можно разделить на 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;

Комментарии пользователей (15)

ПафНутиЙ
1064

3393 | 2433

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

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

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

Chessman
2

84 | 29

Chessman - 30 июля 2013 17:34 - Юзер

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

Chessman
2

84 | 29

Chessman - 1 августа 2013 23:31 - Юзер

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

Wave
7

Wave - 2 августа 2013 12:07 - Юзер

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

Chessman
2

84 | 29

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
2

84 | 29

Chessman - 2 августа 2013 18:16 - Юзер

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

Gopr
10

494 | 164

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
4

80 | 18

MAPKOBKA - 19 июля 2014 13:19 - Юзер

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

Wave
7

Wave - 3 августа 2013 10:49 - Юзер

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

SX2
38

122 | 84

SX2 - 2 августа 2013 21:11 - Юзер

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

Chessman
2

84 | 29

Chessman - 7 августа 2013 05:59 - Юзер

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

Chessman
2

84 | 29

Chessman - 7 августа 2013 06:04 - Юзер

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

MAPKOBKA
4

80 | 18

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
2

84 | 29

Chessman - 8 марта 2016 17:29 - Юзер

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

VYanchuk
1

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

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

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

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

 10.10.2012 lexa21reg  Хаки