Я пытаюсь сделать кнопку для выбора содержимого элемента <code>
. Однако это не работает, и я получаю «content.select()
не функция
<body>
<div>
<button type = "button" id = "copyButton" class = "btn btn-primary" onclick = "copyConfig()">Copy Config</button>
<br><br>
<pre><code id = "contentCfg">{{ content }}</code></pre>
</div>
</body>
<script>
function copyConfig() {
const content = document.getElementById("contentCfg").textContent;
content.select();
content.setSelectionRange(0, 99999);
document.execCommand("copy");
}
</script>
Понятия не имею, почему это не сработает, {{ content }}
автоматически заполняется текстом моим шаблоном serve.r
Закончилось исправлением, изменив js на это (добавлены части elem)
function copyConfig() {
const content = document.getElementById("contentCfg").textContent;
const elem = document.createElement("textarea");
document.body.appendChild(elem)
elem.value = content;
elem.select();
elem.setSelectionRange(0, 99999);
document.execCommand("copy");
document.body.removeChild(elem);
}
Вы ответили на свой вопрос менее чем за 10 минут? Браво.
На самом деле вы можете решить эту проблему, используя Document.createRange() , Range.selectNodeContents() и Window.getSelection(), таким образом избегая ненужных манипуляций с DOM.
См. пример на MDN или обсуждение в этом вопросе: Выделение текста в элементе (аналогично выделению мышью)
function copyConfig() {
const contentNode = document.getElementById("contentCfg")
const range = document.createRange();
range.selectNodeContents(contentNode);
const selection = window.getSelection();
selection.removeAllRanges();
selection.addRange(range);
document.execCommand("copy");
}
const copyButton = document.getElementById('copyButton');
copyButton.addEventListener('click', copyConfig);
<div>
<button type = "button" id = "copyButton" class = "btn btn-primary">Copy Config</button>
<br><br>
<pre><code id = "contentCfg">{{ content }}</code></pre>
</div>
textContent
— это значениеstring
, а неHTMLElement
.