Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy current URL to clipboard

Not sure why this has been so difficult for me today, but for some reason I cannot seem to get it to copy the current URL to the clipboard. Overall, I'm looking for a way to do it without needing to create some hidden text elements.

This is what I'm trying so far:

var shareBtn = document.querySelector(".share-button");

shareBtn.addEventListener('click', function(event) {
  var cpLink = window.location.href;
  cpLink.select();

  try {
    var successful = document.execCommand('copy');
    var msg = successful ? 'successful' : 'unsuccessful';
    console.log('Copy command was ' + msg);
  } catch (err) {
    console.log('Oops, unable to copy');
  }
  event.preventDefault;
});

When I try to go about it using the .select() I get this error: t.select is not a function So I'm not 100% sure what the best way to go about this. Again, without using jQuery (or any other JS library) and not using some sort of hidden textfield.

like image 439
ultraloveninja Avatar asked Apr 02 '18 20:04

ultraloveninja


People also ask

How do you copy a URL in HTML?

Right-click the URL you want to copy. Select 'copy' from the popup menu. Navigate to wherever you wish to share the link, right-click then paste.

How do you copy a URL from a tag?

* When copying the URL of the page, right-click anywhere on the page and open the context menu, then select the format to copy. * When you right-click on a link (an anchor element), you can copy the URL of that link.


Video Answer


3 Answers

You can create a temporary DOM element to hold the URL

Unfortunately there is no standard API for clipboard operations, so we're left with the hacky way of using a HTML input element to fit our needs. The idea is to create an input, set its value to the URL of the current document, select its contents and execute copy.

We then clean up the mess instead of setting input to hidden and polluting the DOM.

var dummy = document.createElement('input'),     text = window.location.href;  document.body.appendChild(dummy); dummy.value = text; dummy.select(); document.execCommand('copy'); document.body.removeChild(dummy); 
like image 158
ppajer Avatar answered Sep 28 '22 03:09

ppajer


2021 update: you can use the Clipboard API like so:

navigator.clipboard.writeText(window.location.href);
like image 30
Aaron Pradhan Avatar answered Sep 28 '22 03:09

Aaron Pradhan


ppajer's answer is indeed all that's needed when the browser handles the copying, without any custom handling of clipboard events being involved.

But if you or some library hook into the copy event (say, window.addEventListener('copy', ...) and then if that handler relies on using window.getSelection(), then a 19 year old Firefox issue will bite you. Like MDN says:

It is worth noting that currently getSelection() doesn't work on the content of <textarea> and <input> elements in Firefox, Edge (Legacy) and Internet Explorer.

So, getSelection() returns a non-null result after HTMLInputElement#select, but without providing the actual selected content. Easily fixed by using a non-input element to temporarily hold the URL:

function copyUrl() {
  if (!window.getSelection) {
    alert('Please copy the URL from the location bar.');
    return;
  }
  const dummy = document.createElement('p');
  dummy.textContent = window.location.href;
  document.body.appendChild(dummy);

  const range = document.createRange();
  range.setStartBefore(dummy);
  range.setEndAfter(dummy);

  const selection = window.getSelection();
  // First clear, in case the user already selected some other text
  selection.removeAllRanges();
  selection.addRange(range);

  document.execCommand('copy');
  document.body.removeChild(dummy);
}

(The above will also work when no custom handler hooks into the copy event.)

like image 22
Arjan Avatar answered Sep 28 '22 03:09

Arjan