Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   ZeroClipboard, DataTables, копирование текста в буфер (https://javascript.ru/forum/library-toolkit-framework/61656-zeroclipboard-datatables-kopirovanie-teksta-v-bufer.html)

Master_Sergius 29.02.2016 12:53

ZeroClipboard, DataTables, копирование текста в буфер
 
Очень интересная задачка для джаваскриптизёров :)

Итак, по-порядку:

1) суть - нужно скопировать текст из браузера в буфер обмена по нажатию на кнопку;
естественно, задача в некотором смысле дикая, так как браузеры не должны были взаимодействовать с ОС, но... так случилось, и теперь заказчики очень хотят иметь в себя такую фичу;

2) некоторые люди к прелестной библиотеке DataTables - http://www.datatables.net/download/ добавили поддержку ZeroClipboard, дабы можно было копировать в буфер выбранные строки, столбцы и т.п. - https://cdn.datatables.net/tabletools/2.0.3/. Кнопки, привязанные к таблице, работают на ура.

3) Но вот теперь надо сделать отдельную кнопку, которая не привязана к таблице и должна скопировать текст из обычного textarea. Хотелось бы воспользоваться уже тем, что имеется (TableTools с той последней ссылки) и не добавлять в проект отдельно библиотеку ZeroClipboard.js, её флеш-файл, дописывать в зависимости и т.п. Но, вот здесь и начались проблемы.

Вот макет того, что должно быть в реальности, но этот макет почему-то ещё хуже чем аналогичный код в реальном проекте.

3.1) table_zero.html

<html>
    <head>
        <title>Sergius' Sandbox</title>
        <script src="jquery-1.9.1.min.js"></script>
        <script src="jquery.dataTables.min.js"></script>
        <script src="TableTools.min.js"></script>
        <script src="table_zero.js"></script>
    </head>
 
    <body>
        <input type="button" id="show_text" value="Show Text"></input>
        <div>
        <textarea id="text_holder"></textarea>
        </div>
    </body>
</html>


3.2) table_zero.js
function show_text(){
    $('#text_holder').toggle();
    if ($('#show_text').val() == 'Show Text'){
        $('#show_text').val('Hide Text');
        // copy to clipboard
        ZeroClipboard_TableTools.setMoviePath('copy_csv_xls.swf');
        var clip = new ZeroClipboard_TableTools.Client();
        clip.glue("show_text", "copy");
        clip.setText($("#text_holder").val());
    }
    else {
        $('#show_text').val('Show Text');
    }
}
 
document.ready = function(){
    $('#show_text').click(show_text);
    $('#text_holder').val('Hello world');
    $('#text_holder').hide();
}


Лишь таким образом мне удалось заставить его работать (в реальном проекте), но здесь же очевидно, что событие привязывается после первого нажимания на кнопку и копирует лишь со второго раза, когда textarea уже прятается. Когда же я пытался вынести это в document.ready или на начало обработки события - ничего не работало. Пытался также передавать clip как аргумент функции - никаких результатов. И что удивительно, firebug не показывает никаких ошибок.

Вот, собственно, вопросы:

1) что здесь не так?
2) можно ли его всё же заставить работать? или придётся использовать чистый ZeroClipboard?
3) пробовал вариант из https://developers.google.com/web/up...-copy-commands, но он не у всех поддерживается, а флеш работает почти везде, даже на очень старых виртуалках из старыми браузерами и т.п. Поэтому, вряд ли имеется ещё какой-то путь...


Часовой пояс GMT +3, время: 23:24.