
Содержание
Часто встречаются сайты, на которых можно скопировать текст при помощи специальной кнопки. Для качественной вёрстки страниц я обычно применяю набор инструментов от Twitter Bootstrap 5, новая версия которого успешно выпущена и полностью готова к полноценной разработке. В этом наборе не хватает только выше упомянутой кнопки, но её можно реализовать используя код на JavaScript.
Разработчики Bootstrap в новом решении надумали отказаться от библиотеки jQuery, поэтому я напишу код на чистом JS. Для всплывающих подсказок применю модуль Tooltips «из коробки», а также добавлю для красоты немного иконок из набора «Bootstrap Icons».
Разметка HTML
В минимальном исполнении разметку можно выполнить так:
<div class="copy-clipboard text-center text-muted m-auto">
<span>Скопировать эту строку</span><button title="Скопировать" class="btn btn-outline-secondary btn-sm shadow-none ms-3">Кнопка</button>
</div>
Здесь важно указать контейнеру класс .copy-clipboard
, а внутри него расположить строку <span>
и кнопку <button>
. При нажатии на кнопку строка будет скопирована в буфер обмена (Clipboard).
Примечание:
размножать необходимо именно контейнеры<div>
с классом.copy-clipboard
Код JavaScript
Теперь создадим непосредственно сам код, который отвечает за всю процедуру копирования.
Пример:
let copyList = document.querySelectorAll( '.copy-clipboard' );
let copyArray = Array.prototype.slice.call( copyList );
function tooltipUpdate( button, tooltip, title ) {
tooltip.dispose();
button.setAttribute( 'title', title );
tooltip = new bootstrap.Tooltip( button );
tooltip.show();
return tooltip;
}
copyArray.map( function ( copy ) {
let text = copy.querySelector( 'span' ).innerText;
let button = copy.querySelector( 'button' );
let tooltip = new bootstrap.Tooltip( button );
button.addEventListener( 'mouseover', function () {
tooltip = tooltipUpdate( button, tooltip, 'Скопировать' );
} );
button.addEventListener( 'click', function () {
window.navigator.clipboard.writeText( text );
tooltip = tooltipUpdate( button, tooltip, 'Готово!' );
} );
} );
Ранее для копирования текста применялась функция document.execCommand('copy')
. Она устарела, официально не поддерживается, но многие сайты продолжают её использовать. Особенность функции в том, что кроме поля <input>
она ничего не могла скопировать и приходилось интерактивно создавать это поле, помещать в него текст, а затем удалять.
Теперь можно применить конструкцию window.navigator.clipboard.writeText(text)
для копирования текста напрямую из других тегов, таких как <span>
, <p>
, <div>
и др.
Посмотрите упрощённый пример по ссылке.
Пример Bootstrap 5 и Tooltips
Приведу практический пример разметки для Twitter Bootstrap 5. Здесь подключены различные библиотеки для наведения красоты, но все они из линейки продуктов Bootstrap. В коде есть небольшие изменения: вместо кнопки используется иконка <i>
, а в остальном – просто более наглядный вариант.
Интерактивный пример можно посмотреть по данной ссылке.
<!doctype html>
<html lang="ru" class="h-100">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" integrity="sha256-z8OR40MowJ8GgK6P89Y+hiJK5+cclzFHzLhFQLL92bg=" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/bootstrap-icons@1.5.0/font/bootstrap-icons.css" integrity="sha256-PDJQdTN7dolQWDASIoBVrjkuOEaI137FI15sqI3Oxu8=" crossorigin="anonymous">
<title>Пример копирования текста с применением Twitter Bootstrap 5 Tooltips | onstartup.ru</title>
</head>
<body class="d-flex h-100 bg-light">
<div class="container m-auto">
<div class="row justify-content-center">
<div class="col-auto">
<div class="card shadow">
<div class="card-header text-center">
<h1 class="display-6">Пример копирования текста<br>Twitter Bootstrap 5 Tooltips</h1>
</div>
<div class="card-body">
<div class="table-responsive">
<table class="table table-borderless mb-0">
<tbody>
<tr>
<th scope="row">ПРИМЕР 1:</th>
<td>
<div class="copy-clipboard d-flex justify-content-between">
<span class="lead h5">Скопировать строку 1</span><i class="bi bi-clipboard-plus btn p-1 pt-0" data-bs-toggle="tooltip" title="Скопировать"></i>
</div>
</td>
</tr>
<tr>
<th scope="row">ПРИМЕР 2:</th>
<td>
<div class="copy-clipboard d-flex justify-content-between">
<span class="lead h5">Скопировать строку 2</span><i class="bi bi-clipboard-plus btn p-1 pt-0" data-bs-toggle="tooltip" title="Скопировать"></i>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/js/bootstrap.bundle.min.js" integrity="sha256-KuvCVS19rfTjoLgMyDDCdOkRRlhNrY4psEM4uezts2M=" crossorigin="anonymous"></script>
<script>
let copyList = document.querySelectorAll( '.copy-clipboard' );
let copyArray = Array.prototype.slice.call( copyList );
function tooltipUpdate( button, tooltip, title ) {
tooltip.dispose();
button.setAttribute( 'title', title );
tooltip = new bootstrap.Tooltip( button );
tooltip.show();
return tooltip;
}
copyArray.map( function ( copy ) {
let text = copy.querySelector( 'span' ).innerText;
let button = copy.querySelector( 'i' );
let tooltip = new bootstrap.Tooltip( button );
button.addEventListener( 'mouseover', function () {
tooltip = tooltipUpdate( button, tooltip, 'Скопировать' );
this.classList.remove( 'bi-clipboard-check' );
this.classList.add( 'bi-clipboard-plus' );
} );
button.addEventListener( 'click', function () {
window.navigator.clipboard.writeText( text );
tooltip = tooltipUpdate( button, tooltip, 'Готово!' );
this.classList.remove( 'bi-clipboard-plus' );
this.classList.add( 'bi-clipboard-check' );
} );
} );
</script>
</body>
</html>
Узнайте о том, как подключить Bootstrap к WordPress через CDN.
А как скопировать текст из String в буфер обмена? или из хотя бы скрытого блока <p> или <div> ?
т.е. определенный текст в виде отчета формируется в String, а при нажатии на кнопку "копировать" он оказывается в буфере обмена.
Просто поместите результат в переменную
text
. Процедура копирования будет выполнена через конструкциюwindow.navigator.clipboard.writeText(text)
.При использовании скрытого поля присвойте ему CSS класс
copy-clipboard
и внутри контейнера разместите текстовую строку с тегомspan
.Подскажите пожалуйста, где менять или как прописать параметры всплывающих подсказок, размер, цвет, шрифт? Я не большой специалист, по этому не могу понять где это находится. У меня сайт темный и черные подсказки не подходят.
Спасибо.
Благодарю за вопрос, Дмитрий. Стили подсказок можно изменить через CSS, можете посмотреть пример и найти классы по ключевому слову “tooltip”. В данном файле используется синтаксис препроцессора SASS:
https://onstartup.ru/wp-content/themes/onstartup/assets/sass/main.scss
Спасибо.
Но tooltip нужно прописать в html или любой другой класс присвоить подсказке, что бы прописать в CSS. Вот этого я и не могу понять, где присваивать?
У меня вот такой код сейчас, все что в этом примере лишнее, я убрал:
HTML:
Вот пример изменения шрифта и цвета Tooltip для Bootstrap 5. Поместите данный код внутри тега <head> и обязательно после подключения файлов CSS от самого Bootstrap:
Стили для Bootstrap 4:
Если не сложно, сделайте за меня пожалуйста :)), а то я не спец и не знаю скриптов, а тем более что такое SASS. Все работает как в примере, но нужно только сделать CSS, дальше его я сам уже подредактирую.
Спасибо.
Все, нашел я этот tooltip и все что связано с оформлением подсказки в bootstrap.min.css.
Спасибо.
Так вы потеряете все изменения при обновлении на новую версию Bootstrap, поэтому лучше не редактировать файлы напрямую, а использовать дополнительные стили.
Спасибо Вам Огромное! Все сделал, все работает. Да, подставляя бутстрап 5-й версии частично стили слетают, по этому оставил 4-ю и что бы не перебирать ее с 5-й в свой style.css скопировал все нужное, так-как css который Вы выложили выше, не совсем работает, в частности нет стрелочки под плашкой.
Стиль стрелочки такой:
Целый месяц бился, что бы все идеально работало. Сделал сам подсказку при наведении, но так-как с скриптами я не особо дружу, могу только корректировать, то в моем скрипте не корректно работала функция при нажатии, вываливался alert и я его никак не мог побороть (без него тоже нельзя было), так-как знаний не хватает. Этот скрипт работает как надо, но не понятно, почему он не работает отдельно от bootstrap.bundle.min.js, где-то что-то в нем не хватает.
Всплывающие подсказки основаны на дополнительном компоненте (https://popper.js.org/), который содержится в полной версии скрипта
bootstrap.bundle.min.js
В документации предлагается разделить эти компоненты, при необходимости: https://getbootstrap.com/docs/4.6/getting-started/introduction/#js.
Обращайтесь, Дмитрий. Буду рад помочь!
Также добро пожаловать на наш форум, который только развивается и может стать полезным для вебмастера.
Возникла проблема. Локально подсказка работает и при нажатии копируется текст, а вот при загрузке на сервер только горит подсказка при наведении, а при нажатии ничего не происходит. Пробовал менять местоположение скрипта bootstrap.bundle.min.js ничего не дает.
Как это решить и из-за чего так происходит?
Дмитрий, откройте в браузере просмотр лога: Ctrl + Shift + i
Перейдите на вкладку
Консоль
и подскажите какие ошибки отображаются после нажатия на кнопку копирования текста.И вот на этой странице можно посмотреть об ошибке:
https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Errors/Unexpected_type
Я пробовал скрипт не запихивать в bootstrap, а размещать на странице html, все равно не работает.
Какая-то ерунда. Скрипт рабочий. Если ввожу адрес своего сайта, то не работает, а если по ссылке через cPanel, то фаерфокс написал, что "не безопасное подключение", но я все равно разрешил подключится и после этого все работает. В других браузерах не работает так же. И если через панель, я разрешил подключаться, то потом в новой вкладке введя адрес, опять показывает, что "соединение не защищено" и опять копирование не работает.
Очень похоже на какие--либо неполадки в области SSL на хостинге. JavaScript к подобным ситуациям весьма критичен.
То есть, получается нужно приобрести SSL сертификат? Я в этом не разбираюсь, не знаю как делается и на что влияет. У меня на сайте есть какой-то SSL сертификат предоставленный бесплатно при регистрации домена.
Дмитрий, посмотрите внимательно на методы подключения файлов, протоколы http и https должны совпадать в данном случае.
Всё верно, если сайт ещё на стадии развития, то рекомендуется обезопасить соединение средствами сертификата SSL (достаточно бесплатной версии предлагаемой хостингом). В приведённом примере данной статьи применяется безопасное соединение, изменять которое я не рекомендую.
Спасибо, попробую выяснить с тех поддержкой хостинга, потому что у меня есть сертификат с обозначением (самозаверенный), но с ним (только этот) скрипт не работает.
А если все же мне нужно в скрипте понять на не безопасное соединение, то что и где нужно прописать?
Тогда потребуется заменить https на http в коде скрипта, попробуйте в качестве проверки.
Нет, не работает. Везде где https заменил на http, ноль реакции.
Тех поддержка уже ответила, что да, без сертификата скорее всего работать не будет.
Короче, прийдется раскошелится еще почти на 200 Евро. В принципе в нем все равно и другой толк есть, хоть у меня на сайте и нет регистрации пользователей и вообще какой либо информации о них.
Вероятно потому, что сервер Bootstrap принудительно перенаправляет на безопасное соединение https.
Я живу в Ирландии, хостинг ирландский, тут у них все серьезно с безопасностью. Даже при покупке домена требовали у меня документы. 🙂
Обычная практика 🙂