Копіювати в буфер обміну без Flash


90

Я знайшов багато рішень для копіювання в буфер обміну, але всі вони або з Flash, або для веб-сайтів. Я шукаю метод копіювання в буфер обміну автоматично, без спалаху та для користувача, це для скриптів користувачів і, звичайно, крос-браузера.


Не знайшов жодного, шукав те саме. Я хотів використовувати Flash, або таким чином видалив цю функцію до створення.
eugeneK


1
Без використання FLASH я сумніваюся, що ви можете зробити це в різних браузерах. Але є конкретні рішення, які можуть допомогти вам отримати рішення zeroclipboard
Ракеш Санкар

Ракеш - ваше "конкретне рішення" базується на Flash. Це не буде працювати в будь-якому браузері, яким я користуюся.
RobG

1
@wizztjh метод в stackoverflow.com/questions/400212 / ... для сайту сторони не для боку користувача @Rakesh zeroclipboard це добре , але я хочу , щоб повністю знайти метод без спалаху
Black_Sun

Відповіді:


31

Без Flash це просто неможливо у більшості браузерів. Користувальницький буфер обміну - це ресурс, що стосується безпеки, оскільки він може містити такі речі, як паролі або номери кредитних карток. Таким чином, браузери справедливо не дозволяють доступ до нього Javascript (деякі дозволяють це із попередженням, яке відображається користувачем, або з підписаним кодом Javascript, але жодне з них не є крос-браузерним).


21
Тож, можливо, сторінки не можна читати з буфера обміну, але чому б не писати в нього? = /
Ajedi32

5
Але навіщо тоді дозволяти це відбуватися через прихований спалах, який передбачає нульове сповіщення та зворотний зв’язок користувачів?
Eric Grange

3
@EricGrange: Оскільки ще в середині 1990-х років хтось із Netscape вирішив, що з міркувань продуктивності плагіни браузера будуть власними двійковими файлами і, отже, здатні робити майже все. Тоді Інтернет-світ був набагато простим місцем, і безпека не дуже турбувала.
Michael Borgwardt

4
Хоча ця відповідь була правдивою в 2011 році, браузери пройшли довгий шлях у боротьбі за вбивство флеш-пам’яті. Будь ласка, дивіться мою відповідь нижче.
Ховіс Біддл,

25

Я спробував флеш-рішення, і мені теж не сподобалось. Занадто складний і занадто повільний. Я зробив те, щоб створити текстове поле, вкласти в нього дані та використати поведінку браузера "CTRL + C".

Частина JavaScript jQuery:

// catch the "ctrl" combination keydown
$.ctrl = function(key, callback, args) {
    $(document).keydown(function(e) {
        if(!args) args=[]; // IE barks when args is null
        if(e.keyCode == key && e.ctrlKey) {
            callback.apply(this, args);
            return false;
        }
    });
};

// put your data on the textarea and select all
var performCopy = function() {
    var textArea = $("#textArea1");
    textArea.text('PUT THE TEXT TO COPY HERE. CAN BE A FUNCTION.');
    textArea[0].focus();
    textArea[0].select();
};

// bind CTRL + C
$.ctrl('C'.charCodeAt(0), performCopy);

Частина HTML:
<textarea id="textArea1"></textarea>

Тепер помістіть те, що ви хочете скопіювати, у "ПОСАДІТЬ ТЕКСТ, ЩОБ КОПІЮВАТИ ТУТ. МОЖЕ БУТИ ФУНКЦІЄЮ. ' площі. Мені це добре підходить. Вам просто потрібно скласти одну комбінацію CTRL + C. Єдиним недоліком є ​​те, що на вашому сайті відображатиметься негарна текстова область. Якщо ви використовуєте style = "display: none", рішення для копіювання не буде працювати.


6
Здається, це лише прив’язує функцію Ctrl + C до функції javascript, а не розміщує дані в буфері обміну ОС.
Ізмаїл,

впевнений, це ідея. Зробіть копію браузера для вас. Тут є подібне рішення: knockoutjs.com/examples/clickCounter.html . Коли ви двічі клацаєте, вони створюють текстову область за допомогою javascript із вмістом.
Хуліо Сайто

не працював у мене на osx, тому я додав e.metaKeyу порівнянні клавіатури, але чомусь дія копіювання не запускається. Перегляньте цю скрипку: jsfiddle.net/gableroux/gta67/1
GabLeRoux

2
@GabLeRoux Функція копіювання в сафарі вмикається лише тоді, коли виділено текст. Це раніше працювало, але нещодавно оновлення сафарі зупинило його. Здається, виділення тексту після виклику події зниження клавіш просто більше не вирізає його в цьому браузері. Проте все ще чудово працює в хромі. Ну ну, можливо, доведеться повернутися до використання флеш-пам’ятки саме для цього браузера ...
Аран Малхолланд

Подобається це. Коли ви не можете приховати (з будь-якої причини) елемент, який вам не потрібно бачити, ви завжди можете помістити далеко від початку, наприклад padding-bottom: -1000.
m3nda


10

Це нарешті тут! (Поки ви не підтримуєте Safari або IE8 ... -_-)

Тепер ви дійсно можете обробляти дії з буфером обміну без Flash. Ось відповідна документація:

https://developer.mozilla.org/en-US/docs/Web/API/Document/execCommand

https://developers.google.com/web/updates/2015/04/cut-and-copy-commands?hl=uk

https://msdn.microsoft.com/en-us/library/hh801227%28v=vs.85%29.aspx#copy


3

У той час як з нетерпінням чекаючи підтримки Xbrowser з буфера обміну API ...


Це буде чудово працювати в Chrome, Firefox, Edge, IE

IE запропонує користувачеві лише один раз отримати доступ до буфера обміну.
Safari (5,1 на момент написання статті) не підтримує execCommandдляcopy/cut

/**
 * CLIPBOARD
 * https://stackoverflow.com/a/33337109/383904
 */
const clip = e => {
  e.preventDefault();
  
  const cont = e.target.innerHTML;
  const area = document.createElement("textarea");
  
  area.value = e.target.innerHTML; // or use .textContent
  document.body.appendChild(area);
  area.select();
 
  if(document.execCommand('copy')) console.log("Copied to clipboard");
  else prompt("Copy to clipboard:\nSelect, Cmd+C, Enter", cont); // Saf, Other
  
  area.remove();
};


[...document.querySelectorAll(".clip")].forEach(el => 
  el.addEventListener("click", clip)
);
<a class="clip" href="#!">Click an item to copy</a><br>
<a class="clip" href="#!"><i>Lorem</i></a><br>
<a class="clip" href="#!"><b>IPSUM</b></a><br>

<textarea placeholder="Paste here to test"></textarea>

Всі браузери (крім Firefox , який здатний обробляти тільки міміку типу "plain/text", наскільки я перевірив) ще не реалізовані в Clipboard API . Тобто, намагаючись прочитати подію буфера обміну в Chrome за допомогою

var clipboardEvent = new ClipboardEvent("copy", {
        dataType: "plain/text",
        data: "Text to be sent to clipboard"
});

throws : Uncaught TypeError: Нелегальний конструктор

Найкращий ресурс неймовірного безладу, який відбувається серед браузерів та буфера обміну, можна переглянути тут (caniuse.com) (→ Дотримуйтесь коментарів у розділі "Примітки" ).
MDN каже, що базовою підтримкою є "(ТАК)" для всіх браузерів, що є неточним, оскільки можна очікувати, що принаймні API працюватиме взагалі.


1

Ви можете використовувати буфер обміну, локальний для сторінки HTML. Це дозволяє копіювати / вирізати / вставляти вміст ВНУТРІ HTML-сторінки, але не з / у сторонні програми або між двома HTML-сторінками.

Ось як ви можете написати власну функцію для цього (перевірено в chrome та firefox):

Ось FIDDLE, який демонструє, як ви можете це зробити.

Я також вставлю сюди скрипку для довідки.


HTML

<p id="textToCopy">This is the text to be copied</p>
<input id="inputNode" type="text" placeholder="Copied text will be pasted here" /> <br/>

<a href="#" onclick="cb.copy()">copy</a>
<a href="#" onclick="cb.cut()">cut</a>
<a href="#" onclick="cb.paste()">paste</a>

JS

function Clipboard() {
    /* Here we're hardcoding the range of the copy
    and paste. Change to achieve desire behavior. You can
    get the range for a user selection using
    window.getSelection or document.selection on Opera*/
    this.oRange = document.createRange();
    var textNode = document.getElementById("textToCopy");
    var inputNode = document.getElementById("inputNode");
    this.oRange.setStart(textNode,0);
    this.oRange.setEndAfter(textNode);
    /* --------------------------------- */
}

Clipboard.prototype.copy = function() {
    this.oFragment= this.oRange.cloneContents();
};

Clipboard.prototype.cut = function() {
    this.oFragment = this.oRange.extractContents();
};

Clipboard.prototype.paste = function() {
    var cloneFragment=this.oFragment.cloneNode(true)
    inputNode.value = cloneFragment.textContent;
};

window.cb = new Clipboard();

Привіт mtBrona. Чи є спосіб, як ви приєднаєте якийсь jsfiddle до цього? Не вдається його активувати
neoswf

Чи можемо ми пропустити рядок тут замість елемента
Удай А. Навапара

Це працює лише тоді, коли ви всередині того самого window. Це не справжній буфер обміну, доступний для ОС та іншої вкладки браузера. Також відбір можна легко зробити, використовуючи, select()а не простоwindow.getSelection()
Роко К. Бульян

0

document.execCommand('copy')буде робити те, що ти хочеш. Але в цій темі не було прикладів, які можна було б використовувати безпосередньо, але ось що:

var textNode = document.querySelector('p').firstChild
var range = document.createRange()
var sel = window.getSelection()

range.setStart(textNode, 0)
range.setEndAfter(textNode)
sel.removeAllRanges()
sel.addRange(range)
document.execCommand('copy')

-2

Немає шляху, вам доведеться використовувати спалах. Існує плагін JQuery під назвою jquery.copy, який надав перехресне копіювання та вставлення за допомогою файлу flash (swf). Це схоже на те, як працює підсвітка синтаксису в моєму блозі.

Після посилання на файл jquery.copy.js все, що вам потрібно зробити для переміщення даних у буфер обміну, запускає наступне:

$.copy("some text to copy");

Приємно і просто;)


Посилання порушено (файли більше не можна завантажувати)
SeinopSys
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.