Копировать в буфер

15 Apr, 2009

Не самая критичная фича, но весьма специфическая в реализации.

Что это и зачем

Обычно эту кнопку помещают возле всяких «кодов для вставки» видео, или картинок. Чтобы людям было проще копировать. Как-то так:

копирование на bit.lyКопирование ссылки на одном из укоротителей ссылок

копирование на дни.руКопирование кода на dni.ru

Как это делают

Скопировать в буфер в IE можно обычным джаваскриптом:
  1. window.clipboardData.setData('Text','Текст который будет в буфере');
У всех остальных браузеров настройки безопасности по дефолту не позволят это сделать. Потому обычно этот вопрос решали с помощью Flash. Динамически создавался флэш ролик, и в его параметры добавляли текст, который нужно было поместить в буфер. А сам флэш уже имеет доступ к буферу в любой системе-браузере, примерно так:
  1. flash = '<embed src="copy.swf" FlashVars="clipboard='+encodeURIComponent(t)+'" width="0" height="0" type="application/x-shockwave-flash"></embed>';
  2. element.innerHTML = flash;
Ролик запрограммирован так, что при создании сразу копирует свой параметр clipboard пользователю в буфер. Так это всегда и работало. Но.

Проблема

Однако, осенью 2008 в флэше нашелся эксплойт, благодаря которому злоумышленники могли как угодно использовать буфер обмена пользователя без его ведома (собственно, метод описанный выше и был эксплойтом). Поэтому в Flash 10 было введено ограничение
With Flash Player 10, the System.setClipboard() method may be successfully called only through ActionScript that originates from user interaction.
Потому, на самом деле, вся та куча плагинов для jquery, например, которые вы нагуглите по запросу «jquery copy to clipboard» попросту не работает в 10м Flash плеере. При этом, они отлично работают в 8 и 9 версиях (что внесло кучу путаницы в разбирательство с ситуацией). Но учитывая что 10й имеет долю больше 50% нет никакого смысла его игнорировать. Копирование в буфер старым способом больше нельзя считать надежным.

Решение

Так как мне в одном из проектов совершенно обязательно надо было реализовать эту фичу. Пришлось использовать единственный на данный момент вариант. Его я сделал реиспользуемым в своих же интересах. Способ прост: если нельзя скопировать без клика на флэше, значит будем кликать на флэш. Genn помог с самой простой и гибкой реализацией этой идеи. Мы создали флэш-кнопку в качестве параметров которой передаются:
  • clipboard — текст который нужно скопировать в буфер
  • normal — картинка для для дефолтового состояния кнопки
  • hover — картинка для mouseover состояния кнопки
  • pressed — картинка для нажатого состояния кнопки
hover и pressed можно не задавать, тогда кнопка просто не будет изменяться при клике и наведении курсора. Текст из переменной clipboard копируется в буфер при клике на кнопку. Для примера взял две такие картинки:

картинкаЗеленая дефолтовая, синяя для нажатого состояния. Потому что зеленый круче.

И самый простой пример иллюстрирующий применение, там же и другие примеры. Фактически с помощью одного этого ролика можно сделать почти любую нужную кнопку. Для чего я, собственно, это все и затеял =)

Ссылки

Собственно пост я написал чтобы никто не пытался реализовать копирование в буфер с помощью старого джаваскрипта. И чтобы никогда больше не волноваться об этой проблеме самому. =)

Update: Как оказалось этот флэш-метод не работает на Ubuntu c Gnash/swfdec. Однако на этих эмуляторах не работают и никакие другие методы. Спасибо Владимиру за указание на проблему!

54 комментариев к “Копировать в буфер”

1.guestar | 02 Mar, 2010
Фича клевая, юзаю ее уже давно, спасибо, Akella! Но недавно наткнулся на проблему - если в копируемом тексте есть знак процента (%) - то он, и неско следующих после него символов пытаются отобразиться как закодированный в 16ричной системе символ, и в итоге если в копируемом коде есть например <div style='width: 100%; overflow: hidden;'&ght; то в буфере окажется <div style='width: 100 overflow: hidden;'&ght; странная штука, как-то заквотить знак процента у меня не получилось. понять, собственно, из-за чего так происходит - тоже. Может быть есть какое-нить решение?
2.guestar | 02 Mar, 2010
Фича клевая, юзаю ее уже давно, спасибо, Akella! Но недавно наткнулся на проблему - если в копируемом тексте есть знак процента (%) - то он, и неско следующих после него символов пытаются отобразиться как закодированный в 16ричной системе символ, и в итоге если в копируемом коде есть например ф то в буфере окажется странная штука, как-то заквотить знак процента у меня не получилось. понять, собственно, из-за чего так происходит - тоже. Может быть есть какое-нить решение?
3.Олег | 04 Mar, 2010
Как-то загрузил Яндекс.Бар для теста на FF, запустил плагин Temper Data (которые позволяет контролировать HTTP запросы). Так вот Яндекс подгружает clipboard.swf по которому я догадался, что они пытаются через Яндекс.Бар контролировать буфер обмена... без ведома юзера. не понимаю почему из-за безопасности это отключили, ну из буфера копировать опасно, а в буфер не очень.
4.Олег | 04 Mar, 2010
т.е. браузеры отключили возможность копирования. о Я.баре написал как о "злоумышленнике" :-)
5.Data:URL средствами браузера | 24 Feb, 2010
[...] флэшки (флэшукапец, ага). Подробно об этом написано в блоге CSSing.org.ua, я же использовал слегка допиленную версию [...]
6.ekwo | 05 Oct, 2009
А как всем? Часто приходится использовать такие функции в проектах?
7.crazydima | 07 Jul, 2009
Так интересно. Все общаются между собой...
8.GodCow | 23 Jun, 2009
Спасибо за способ, давно искал
9.chif | 21 Jun, 2009
Ролик как-то неадекватно повел себя при первой загрузке, повторно уже все нормально (Firefox 3.5 rc2 / flash10). К сожалению толком не успел заметить что что-то не так, т.к. все-таки заметил ненормальное поведение и тут же обновил страницу :)
10.chif | 21 Jun, 2009
Извиняюсь *что что-то не так = что конкретно не так
11.Vladimir | 15 Jun, 2009
Ubuntu 9.04, FireFox 3.0.11, ни один из примеров не работает :-(
12.Ваня | 11 Jun, 2009
> Итого: для меня задача не решена. Тем не менее, за публикацию спасибо. Объясните, что именно Вы не решили? Может, я смогу Вам помочь.
13.Елена | 10 Jun, 2009
Самый нужный вариант копирования
14.Simpledream | 14 May, 2009
Не сказал бы что такая уж бесполезная, есть сервисы где така штука облегчает жизнь - промт например
15.Vladimir | 16 Jun, 2009
UPD: поставил плагин Adobe Flash Player, с ним работает; gnash и swfdec с буфером обмена работать не хотят.
16.NickSun | 23 May, 2009
Копирует отлично, только вот прозрачность картинок не поддерживается :( Добавте в примере в тег строчку bgcolor="red" и все станет ясно. Можно это как-то исправить?
17.MAN | 12 May, 2009
по мне так бесполезная вообще штука, даже когда вижу на сайтах такое, по привычке копирую по старинке)
18.shinkareff | 27 May, 2009
Самый нужный вариант копирования ( а именно - код ссылки для публикации на другом сайте) не работает. Причина - повторяющиеся двойные кавычки, то о чём написал 6 мая "u1tr0n" в комменте №18. Для моего уровня подготовки задача нерешаемая. Поиск не помог. Пример с таблицей от Ivan Nemytchenko из №13 громоздкий и очень специфичный. А ссылка на "Автоматизированный вариант с mootools" вообще не работает. Итого: для меня задача не решена. Тем не менее, за публикацию спасибо. Если есть какой-то вариант выполнить копирование куска кода вида "гиперлинк" - подскажите, пожалуйста.
19.u1tr0n | 06 May, 2009
Спасибо огромное, но нашел один баг, если передать, к примеру, clipboard=http://site/upload/4F3KmtVdOP.jpg то кнопка перестает быть кнопкой и становится чем-то со скролингом (только в IE, В FF3 все норм) хз как с этим бороться, можно взять URL в одиночные ковычки но тогда и текст в буфере будет тоже с одиночной ковычкой, а мне это неподходит
20.mega.genn.org &raquo; Flash 10 Antipasti и жизнь URL | 18 Apr, 2009
[...] перестала работать. К счастью, akella придумал как с этим бороться: можно создать флеш-ролик, который будет вести себя [...]
21.olexiy | 18 Apr, 2009
чтобы там не говорили в комментариях выше, Ваша реализация единственная, которая работает у меня.
22.akella | 18 Apr, 2009
Спасибо за ссылку! добавил ее в пост.
Нет, таки можно обойтись без клика на флэше.
Где именно? По вашей ссылке написано обратное, там просто реализовано джаваскриптом то, о чем говорил Давид в 5м комментарии. Отличный универсальный способ для тех у кого будет много кнопок скопировать на страничке, и слишком громоздкий для тех у кого она будет одна или две. Все равно большое спасибо! Я в своих поисках такого не нашел.
23.Ivan Nemytchenko | 18 Apr, 2009
Нет, таки можно обойтись без клика на флэше. И да, все сделано до вас: http://clck.ru/6Ic
24.alex | 20 Apr, 2009
Сделал всё по вашему "рецепту" - работает, спасибо :)
25.akira | 16 Apr, 2009
А у меня такая реализация :) http://riamatic.com/2009/01/20/clipboard-javascript-flash/
26.Artem.Chertov | 16 Apr, 2009
Круто, спасибо, Юра.
27.enternet | 16 Apr, 2009
2 Андрей Серебряков «Щёлкните, чтобы активировать и использовать этот элемент» на данный момент присутствует только в старых версиях IE6/IE7 без сервиспаков и в Опере. Так что проблемы в общем-то и нет никакой. Не хочет юзер обновляться - его проблемы, использует юзер Оперу - это или его проблемы или проблемы Оперы. Для нас как разработчиков этой прблемы уже и нет, по сути.
28.Genn | 16 Apr, 2009
DenisX, зачем?
29.Андрей Серебряков | 16 Apr, 2009
Спасибо за решение. Осталось только исключить появление «Щёлкните, чтобы активировать и использовать этот элемент» ;)
30.Вовко | 16 Apr, 2009
Флеш ест детей!!!11адин пыщь-пыщь
31.Давид Мзареулян | 16 Apr, 2009
Аналогичная трабла возникла с флэшевыми загрузчиками файлов, которые перестали работать на десятке. Но вообще, проще не городить дизайн кнопки во флэше, а сделать прозрачную кнопку, которую и натягивать поверх любого нужного интерфейсного элемента (написанного уже на нормальном HTML).
32.akella | 16 Apr, 2009
Да-да, но при отображении прозрачной кнопки поверх не будет эффектов =(, а этот ролик сделан так, что и его можно отобразить прозрачно поверх чего-то, будет работать.
33.DenisX | 16 Apr, 2009
было бы круто, если бы по RSS приходили картинки :)
34.Андрей Серебряков | 16 Apr, 2009
В Опере тоже такая штука присутствует. Я попробовал внедрить пример через SWFObject, вроде работает. Сам скрипт в сжатом состоянии весит около 9 Кб, и работает достаточно надёжно.
35.akella | 16 Apr, 2009
Тут уж наверное ничего не поделаешь с настройками безопасности IE. Можно через джаваскрипт обходить, но все так ненадежно... =( Остается только надеяться что пользователей ИЕ это все так задолбало что они отключили эту фичу.
36.Юрко | 16 Apr, 2009
Тупі теревені, кому воно потрібно? Хай жмакають Сtrl-c, а то всі такі ледащі, що скоро їм їсти буде лінно. Ще й той Флеш, що його треба заборонити!!! Він калічить комп'ютери, якщо ви не знали. В мого друга згорів новий Асус ноутбук через той флше!
37.Alex | 08 Jul, 2010
Всё вроде хорошо, но вот есть проблема! Мне нужно чтоб кнопка скопировала [http://www.zippyshare.com/mediaplayer/mediaplayer.swf?file=http://www21.zippyshare.com/downloadMusic%3Fkey%3D29157749xx&volume=80&autostart=false&frontcolor=0x000000&backcolor=0xa63500&lightcolor=0xffffff&type=flv] но копируется только [http://www.zippyshare.com/mediaplayer/mediaplayer.swf?file=http://www21.zippyshare.com/downloadMusic%3Fkey%3D29157749xx] - это. Скрипт категорически отказывается копировать всё что находиться после символа & Что делать?
38.akella | 12 Jul, 2010
Попробуйте закодировать этот символ
39.ZEOS | 09 Jan, 2012
akella, я так понимаю Вы автор темы! Огромное спасибо за этот способ. Могли бы Вы предоставить исходник этой флешки? :) А также добавьте туда такую же функциональность, как в способе, который я указал выше, чтобы можно было запускать JS код при клике на кнопку.
40.ZEOS | 09 Jan, 2012
Нашел в интернете такой же способ, как у автора: http://cfruss.blogspot.com/2009/01/copy-to-clipboard-swf-button-cross.html FlashVars txtToCopy - the text that you wish to copy to the clipboard js - javascript to be executed upon clicking the COPY button
41.Александр | 28 Nov, 2011
Не работает в windows-1251, то есть не поддерживаются русские буквы, пробовал конвертировать на своей стороне - решения не нашел. Может можно в флеше включить конвертирование с 1251 в UTF-8?
42.Копировать строку в буфер обмена | Мой блог | 02 Oct, 2011
[...] и ничего не получилось.  Немного погуглив, благодаря статье и статье удалось найти приемлемое решение, но уже с [...]
43.akella | 09 Jan, 2012
Исходника к сожалению не сохранилось, только .swf =(
44.ZEOS | 09 Jan, 2012
Я связался с Геннадием и он возможно сможет найти исходник или сделать новый + исправить разные ошибки! В любом случае спасибо вам ребят! ;)
45.ZEOS | 09 Jan, 2012
Спасибо автору! Единственный рабочий вариант, который у меня заработал во всех браузерах и даже недобраузере :)
46.ZEOS | 10 Jan, 2012
guestar, чтобы скопировать текст со знаком (%) пишите вместо этого знака (%25) Пример: было: стало:
47.Ostr0ffskiy | 14 Dec, 2015
Большое спасибо, всё работает.
48.Zamkigiz | 30 Jan, 2021
Здравствйте! [url=http://zamenazamka.pp.ua/forum][img]https://saucyintruder.org/wp-content/uploads/2/6/a/26a7fcd940540391bfdc3ffdb8f26244.jpeg [/img][/url] Если захлопнулась дверь или застрял ключ РІ дверной скважине, срочно звоните нам 8 , РјС‹ приедем РІ течение 20 РјРёРЅСѓС‚ после вызова РІ Р±СѓРґРЅРё, выходные Рё праздничные РґРЅРё СЃ РґРѕ ! Профессиональный локомастер откроет замок любой двери или заменит РІСЃСЋ запорную систему РІ квартире, офисе, автомобиле, сейфе. РњС‹ работаем СЃ цилиндрическими, навесными, кодовыми, врезными Рё РґСЂСѓРіРёРјРё видами замков. Р’СЃРµ операции проводятся легально, СЃ гарантией. Если Р’С‹ используете необычную или сложную систему, РјС‹ РІСЃРµ равно поможем Вам Рё откроем любую дверь! Вскрытие дверных замков — РѕРґРЅР° РёР· самых непредсказуемых услуг. Сегодня существует более 10 популярных запорных механизмов, каждый РёР· которых имеет СЃРІРѕРё особенности строения Рё взлома. Поэтому предугадать, сколько стоит починить именно Ваше устройство, заранее невозможно. Р’РѕС‚ СЃРїРёСЃРѕРє самых распространенных проблем Рё стартовые цены РЅР° услуги нашей Компании. Современные методики взлома замков — это очень тонкая Рё деликатная работа. Мастера, которые выезжают РЅР° обслуживание замковых систем, выполняют РІСЃРµ операции профессиональными инструментами, РѕРЅРё РЅРµ вредят устройству. Самые востребованные техники разблокировки, которыми пользуются наши специалисты:. Наши мастера работают РїРѕ следующей схеме: клиент оставляет заявку РїРѕ телефону 8 РћРЅР° мгновенно передается СЃРІРѕР±РѕРґРЅРѕРјСѓ специалисту РІ нужном районе, РѕРЅ связывается СЃ клиентом, чтобы уточнить детали поломки Рё взять СЃ СЃРѕР±РѕР№ необходимое оборудование Рё новый механизм, если требуется. Между обращением Рё приездом мастера РїСЂРѕС…РѕРґРёС‚ обычно РЅРµ более 20 РјРёРЅСѓС‚. РћРЅ осматривает объект, уточняет СЃ клиентом стоимость услуг Рё приступает Рє делу. Сам процесс работы занимает РѕС‚ 5 РґРѕ 40 РјРёРЅСѓС‚ РІ зависимости РѕС‚ метода. РљРѕРіРґР° дверь открыта, клиент рассчитывается СЃ мастером Рё получает квитанцию Рё гарантию РЅР° ремонт Рё запчасти, если РѕРЅРё были нужны. Профессионалы РІ области ремонта бытовой техники РЅРµ рекомендуют пользователю без специальных знаний вмешиваться РІ сложные аппараты. РўРѕ же правило касается попыток самостоятельно починить или взломать запорное устройство без профильных навыков или хотя Р±С‹ понимания, что Р·Р° тип замка перед Вами. Попытки открыть дверь РїСЂРёРІРѕРґСЏС‚ Рє таким последствиям:. Пожалуйста, РЅРµ пытайтесь расшатать ключ РІ скважине, выбить замочную личинку или цилиндр без мастера. Малейшая оплошность быстро приведет Рє более долгому Рё РґРѕСЂРѕРіРѕРјСѓ ремонту. Р—Р° эти РіРѕРґС‹ РјС‹ доказали СЃРІРѕР№ профессионализм Рё ответственность перед клиентами. Достоинства нашей Компании проверены временем:. Чтобы вызвать специалиста РїСЂСЏРјРѕ сейчас, позвоните РїРѕ телефону 8 РњС‹ поможем Вам уже сегодня! Задавайте Ваши РІРѕРїСЂРѕСЃС‹ РїРѕ ремонту любой бытовой техники или электроники. РњС‹ смогли помочь уже посетителям нашего сайта. Оставить заявку Заявка. Задать РІРѕРїСЂРѕСЃ. РњС‹ работаем без выходных, используем только качественные запчасти Рё предоставляем гарантию! Наши цены Вскрытие дверных замков — РѕРґРЅР° РёР· самых непредсказуемых услуг. Наша услуга Примерная стоимость Разблокировка дверных замков РѕС‚ рублей Вскрытие сейфа РѕС‚ рублей Вскрытие автомобиля РѕС‚ рублей Замена квартирного запора РѕС‚ рублей Установка РЅРѕРІРѕРіРѕ замочного блока РѕС‚ рублей. Электронная почта. Добавить изображение Файл РЅРµ выбран. Оставить отзыв. Согласен СЃ условиями обработки персональных данных. Вызов мастера. Отправьте заявку Рё РјС‹ свяжемся СЃ Вами РІ течение 15 РјРёРЅСѓС‚. Услуги РїРѕ вскрытию дверных замков Рё металлических дверей РІ РњРѕСЃРєРІРµ. Работаем СЃРѕ всеми типами замков Рё входных металлических дверей. Вам требуется вскрытие двери без повреждений? РњС‹ знаем правильное решение Рё сможем открыть любой замок!В  ремонт Рё реставрация металлических дверей РѕС‚ рублей; слесарные работы РїРѕ сварке, резке Рё сверлению металла РѕС‚ рублей; установка замка без доработки дверного кармана РѕС‚ рублей; врезка замка РІ РЅРѕРІРѕРµ место металлической двери РѕС‚ рублей; установка Рё замена личинки замка РІС…РѕРґРЅРѕР№ двери РѕС‚ рублей; перекодировка СЃРѕ сменой комплекта ключей РѕС‚ рублей; установка Рё ремонт дверных ручек РѕС‚ рублей. Подробнее о [url=http://zamenazamka.pp.ua/forum]замена личинки РЅР° РІС…РѕРґРЅРѕР№ двери[/url].
49.Jamesfus | 30 Jan, 2021
homemyfeel.ru - Лучшие идеи дизайна интерьера переходите на сайт [url=https://homemyfeel.ru/]https://homemyfeel.ru/[/url]
50.KevinRhymn | 30 Jan, 2021
Интересный пост _________________ pin up букмекерская приложение - https://kazinopinup.onlinebestrealmoneygame.xyz, pin up букмекерская промокод.
51.JefferyBug | 30 Jan, 2021
The Vogue Choice where we share your passion. That’s why we have gathered a remarkable collection of fashion products in such categories as sunglasses and Women Belts to name a few. You will not regret the decision to buy from this online shop thanks to a rich selection of goods, affordable prices and outstanding customer service.
52.jessicaam60 | 30 Jan, 2021
Scandal porn galleries, dailu updated lists http://gaydildo.bloglag.com/?raquel desi baba porn milhouse and lisa porn roxy porn star mid 90 s lexie porn video first crazy fist porn
53.Williamnek | 30 Jan, 2021
Спасибо, давно искал _________________ pin up скачать бесплатно на андроид - https://kazinopinup.playrealmoneygamestop.xyz, pin up скачать how open.
54.Ciolsi | 30 Jan, 2021
[url=https://avcialis.com/]cialis and viagra sales[/url] buy generic cialis online usa NOT