Очень интересная задачка для джаваскриптизёров
Итак, по-порядку:
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, но он не у всех поддерживается, а флеш работает почти везде, даже на очень старых виртуалках из старыми браузерами и т.п. Поэтому, вряд ли имеется ещё какой-то путь...