Причина такого поведения кроется в том, как вы написали слушатель события click.
В строке ipLink.addEventListener('click', copyClipboard(ipLink.textContent)); вы фактически сразу вызываете функцию copyClipboard и передаете ее возвращаемое значение в addEventListener в качестве функции обратного вызова. Это означает, что текст будет скопирован в буфер обмена сразу после выполнения сценария, а не после щелчка по ссылке.
Чтобы исправить это, необходимо передать ссылку на функцию copyClipboard в addEventListener, а не вызывать ее. Это можно сделать с помощью анонимной функции, вызывающей copyClipboard и передающей ее в addEventListener:
ipLink.addEventListener('click', function() {
copyClipboard(ipLink.textContent);
});
При таком изменении текст будет копироваться в буфер обмена только при нажатии на ссылку