Когда вы наводите курсор на карточку в Trello и нажимаете Ctrl+ C, URL этой карточки копируется в буфер обмена. Как они это делают?
Насколько я могу судить, Flash-фильм не задействован. У меня установлен Flashblock , и на вкладке сети Firefox не отображается загруженный Flash-фильм. (Это обычный метод, например, ZeroClipboard.)
Как они достигают этой магии?
(Прямо сейчас я думаю, что у меня было прозрение: вы не можете выделить текст на странице, поэтому я предполагаю, что у них есть невидимый элемент, где они создают выделение текста с помощью кода JavaScript, и Ctrl+ Cвызывает поведение браузера по умолчанию, копируя это невидимое текстовое значение узла.)
javascript
coffeescript
clipboard
trello
Boldewyn
источник
источник
Ответы:
Раскрытие: я написал код, который использует Trello ; приведенный ниже код является фактическим исходным кодом, который Trello использует для выполнения трюка с буфером обмена.
На самом деле мы не «получаем доступ к буферу обмена пользователя», вместо этого мы немного помогаем пользователю, выбирая что-то полезное, когда он нажимает Ctrl+ C.
Похоже, вы поняли это; мы используем тот факт, что когда вы хотите нажать Ctrl+ C, вы должны Ctrlсначала нажать клавишу. Когда Ctrlклавиша нажата, мы открываем текстовую область, которая содержит текст, который мы хотим поместить в буфер обмена, и выделяем весь текст в нем, поэтому выбор полностью устанавливается при Cнажатии клавиши. (Затем мы скрываем текстовую область, когда Ctrlключ появляется)
В частности, Trello делает это:
В DOM у нас есть
CSS для буфера обмена:
... и CSS делает это таким образом, что вы не можете видеть текстовую область, когда она появляется ... но она достаточно "видима" для копирования.
Когда вы наводите курсор на карту, она вызывает
... так что помощник буфера обмена знает, что выбрать при Ctrlнажатии клавиши.
источник
Я на самом деле создал расширение Chrome, которое делает именно это, и для всех веб-страниц. Исходный код находится на GitHub .
Я нашел три ошибки с подходом Trello, которые я знаю, потому что я столкнулся с ними сам :)
Копия не работает в этих сценариях:
Я решил # 1, всегда имея скрытый диапазон, а не создавая его, когда пользователь нажимает Ctrl/ Cmd.
Я решил # 2, временно очистив выбор нулевой длины, сохранив позицию каретки, сделав копию и восстановив позицию каретки.
Я еще не нашел исправления для # 3 :) (Для информации, проверьте открытую проблему в моем проекте GitHub).
источник
С помощью кода raincoat ( ссылка на GitHub ) мне удалось получить работающую версию с доступом к буферу обмена с простым JavaScript.
Единственная проблема в том, что эта версия работает только с Chrome. Платформа Trello поддерживает все браузеры. Чего мне не хватает?Согласился благодаря Вадиму Иванову.
Смотрите рабочий пример: http://jsfiddle.net/AGEf7/
источник
el.innerText
был неопределенным, поэтому я изменил последнюю строкуclipboard()
функцииclip.setValue(el.innerText || el.textContent);
на более кросс-браузерную совместимость. ссылка: jsfiddle.net/AGEf7/31Код Даниеля ЛеЧемананта не работал для меня после преобразования его из CoffeeScript в JavaScript ( js2coffee ). Это продолжало бомбить на
_.defer()
линии.Я предположил, что это как-то связано с jQuery deferreds, поэтому я изменил его на
$.Deferred()
и теперь оно работает. Я протестировал его в Internet Explorer 11, Firefox 35 и Chrome 39 с jQuery 2.1.1. Использование такое же, как описано в посте Даниила.источник
Нечто похожее можно увидеть на http://goo.gl, когда вы сокращаете URL.
Существует элемент ввода только для чтения, который фокусируется программно, с нажатием всплывающей подсказки CTRL-Cдля копирования.
Когда вы нажимаете на этот ярлык, входной контент эффективно попадает в буфер обмена. Действительно мило :)
источник