Скопировать текст в буфер обмена из букмарклета

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

Извлечение достаточно простое, но я действительно застрял, делая копию. В настоящее время я просто alert с текстом и нажатием Ctrl + C, чтобы скопировать текст из окна сообщения, что не идеально.

Я прочитал Как скопировать в буфер обмена в JavaScript и другие вопросы, которые предлагают использовать zeroclipboard, но я понятия не имею, как сделать эту работу из букмарклета, учитывая, что мне приходится загружать внешние ресурсы flash и javascript, чтобы иметь возможность использовать библиотеку.

У меня нет проблем с испорчением страницы DOM для этого или с необходимостью разрешать некоторые разрешения для моего браузера (Google Chrome), учитывая, что это просто закрытый букмарклет.

Любые указатели будут оценены.

Ответ 1

Отказ от ответственности:

  • Я не пытаюсь спамить вас.
  • Я ничего не выиграю, если вы решите использовать этот

Я создал генератор буклетов , чтобы упростить создание букмарклетов.

Включен jQuery, но это не значит, что вам нужно использовать jQuery.

Вы можете проверить источник, чтобы узнать, как импортировать другую script/library в страницу через букмарклет.

В частности, строки, которые импортируют jQuery:

if (!window.zbooks)
  {
    //if zbooks hasn't been set, initialize it

    //s used for the Script element
    var s = document.createElement('script');
    //r used for the Ready state
    var r = false;
    //set the script to the latest version of jQuery
    s.setAttribute('src', 'http://code.jquery.com/jquery-latest.min.js');
    //set the load/readystate events
    s.onload = s.onreadystatechange = function()
    {
/**
 * LOAD/READYSTATE LOGIC
 * execute if the script hasn't been ready yet and:
 * - the ready state isn't set
 * - the ready state is complete
 *   - note: readyState == 'loaded' executes before the script gets called so
 *     we skip this event because it wouldn't have loaded the init event yet.
 */
      if ( !r && (!this.readyState || this.readyState == 'complete' ) )
      {
        //set the ready flag to true to keep the event from initializing again
        r = true;
        //prevent jQuery conflicts by placing jQuery in the zbooks object
        window.zbooks = {'jQuery':jQuery.noConflict()};
        //make a new zbook
        window.zbooks[n] = new zbooks(c);
      }
    };
    //append the jQuery script to the body
    b.appendChild(s);
  }

Я надеюсь, что это поможет.

Ответ 2

Вот как я решил это, используя технику @zzzzBov, упомянутую в его , чтобы импортировать zeroclipboard на странице через букмарклет.

Когда закладок запускается, курсор появляется при наведении курсора на любой объект тела. Щелчок будет скопировать (например) название документа в буфер обмена.

(Ссылки на ресурсы zeroclipboard были заменены заполнителями, и многострочные комментарии использовались, поскольку Chrome, похоже, удаляет все разрывы строк из букмарклетов (или что-то еще))

javascript:

var s = document.createElement('script');
s.setAttribute('src', 'http://example.com/ZeroClipboard.js');

s.onload = s.onreadystatechange = 
  function()
  { 
     ZeroClipboard.setMoviePath( 'http://example.com/ZeroClipboard.swf');
     var clip = new ZeroClipboard.Client();   

     /* glue to the body: sample only, in reality  we should
        probably create a new visible element and glue to that. */
     clip.glue(document.body);   

     clip.setHandCursor( true );

     /* copy to clipboard on mouse-up */
     clip.addEventListener('onMouseUp', 
      function (client) 
      {      
         /* example */
         var toCopy = document.title;        
         clip.setText(toCopy);    

         alert(toCopy + ' copied.');
         clip.hide();
      });  
   };

document.body.appendChild(s);

Ответ 3

Ответ, который немного необычен: откройте пустую страницу, с которой пользователь скопирует текст:

<a href="javascript:window.open('data:text/html, <html contenteditable>sup<script>document.execCommand(\'selectAll\')</script></html>')">
  Copy the text "sup"
</a>

Просто замените sup текстом, который вы хотите скопировать.

Пример JS Bin

Ответ 4

В Github Gist есть небольшая закладка, которая делает ядро ​​того, что вы хотите - копирование в буфер обмена. Он не использует никаких внешних библиотек, которые, на мой взгляд, являются преимуществом.

Как написано, он копирует некоторый статический текст, но в нижней части он говорит об адаптации его к другим видам использования, таким как копирование названия страницы.

Поскольку вы заявили, что "извлечение достаточно просто...", вы должны легко адаптировать этот метод к тому, что хотите.

Я попробовал простую ванильную версию букмарклета, потому что у меня есть статический текст, который мне часто нужно перенести в буфер обмена. Он отлично работает в Chrome 61 без каких-либо изменений. Но обязательно прочитайте комментарии; у некоторых есть предложения по работе с ним в других браузерах и сценариях.

Вот код, который я тестировал, уже заминирован и готов превратиться в букмарклет:

javascript:!function(a){var b=document.createElement("textarea"),c=document.getSelection();b.textContent=a,document.body.appendChild(b),c.removeAllRanges(),b.select(),document.execCommand("copy"),c.removeAllRanges(),document.body.removeChild(b)}("Text To Copy");

У Gist также есть код с предварительной оценкой.