19

I want to dynamically create an <a href="mailto:..."> element, then "click" it. All without modifying the page.

I'm trying this:

$('<a href="mailto:test@test.com">&nbsp;</a>').click();

...to no avail

Curtis
  • 101,612
  • 66
  • 270
  • 352
aidan
  • 9,310
  • 8
  • 68
  • 82

15 Answers15

46

Its not jquery, but it works just fine.

var link = document.createElement('a');
link.href = url;
document.body.appendChild(link);
link.click();    
solipsicle
  • 864
  • 1
  • 9
  • 19
15

To make it work with jQuery, you first need to select the DOM element inside the jQuery object.

$('body').append('<a id="link" href="mailto:test@test.com">&nbsp;</a>');
$('#link')[0].click();

Notice the [0]

fiddle: https://jsfiddle.net/fkwhvvhk/

jBelanger
  • 1,526
  • 18
  • 11
  • 1
    Wow, just retrieve the DOM element _then_ click it. But why jQuery `click()` function don't invoke the DOM one's for each query item? – T-moty May 12 '16 at 10:54
  • 3
    I think this is the least rubbish answer in a sea of rubbish answers. I just added [0] to my code and now it works. Ridiculous. The link is in the DOM, jQuery can find the link, but for no apparent reason it won't click it. No error, nothing. Thank you for this three character fix. – Andrew Jun 22 '17 at 21:58
  • $('#link')[0].click(); gives an error in the console saying "TypeError: $(...)[0] is undefined". JQuery 3.2.1 and modern Firefox browser (ver 68). I too hate 'rubbish' answers... – McAuley Oct 06 '19 at 06:50
  • If you use this solution and you can get an error message "TypeError: $(...)[0] is undefined. The reason is simple, the element dows not exist YET. So you have to wait for it to exist. See my answer how you can do this: https://stackoverflow.com/a/74130818/760777 – RWC Oct 19 '22 at 19:26
15

Clicking on a link means changing window.location, so how about

window.location = "mailto:test@test.com";
Alex Korban
  • 14,916
  • 5
  • 44
  • 55
  • 8
    this doesn't pass referrer information in all browsers, so it's not strictly equivalent to creating a link and clicking it – terrace Jun 19 '12 at 19:26
  • see: http://stackoverflow.com/questions/4762254/javascript-window-location-does-not-set-referer-in-the-request-header – terrace Jun 20 '12 at 17:23
  • 6
    This doesn't solve the question. That only shows you how to change the current windows location. It doesn't answer how to programmatically create an element then programmatically click it. – MingMan Jan 17 '17 at 20:36
10

.click() work with a DOM, not jQuery object

it should be:

$('<a href="mailto:test@test.com"></a>')[0].click();
KevinBui
  • 880
  • 15
  • 27
  • This is the simplest solution to the question. Can also use `jQuery` to avoid conflict with $: jQuery(``)[0].click(); – Grant Jul 07 '20 at 07:45
  • If you use this solution and you can get an error message "TypeError: $(...)[0] is undefined. The reason is simple, the element dows not exist YET. So you have to wait for it to exist. See my answer how you can do this: https://stackoverflow.com/a/74130818/760777 – RWC Oct 19 '22 at 19:28
5

Try something like this...

Demo: http://jsfiddle.net/wdm954/xtTGX/1

$('.a').append('<a class="b" href="mailto:test@test.com">&nbsp;</a>');
$('.b').click(function() {
    window.location = $(this).attr('href');
}).click();
wdm
  • 7,121
  • 1
  • 27
  • 29
2

I have been found some problems with a similar issue and I found the simplest way for me:

    var link = document.createElement('a');

    link.download = 'profile.png';
    link.href = '...';
    link.id = 'example';
    link.class = '...';

    document.body.appendChild(link);

    link.click();

In my case I lost a lot of time trying to do this with jquery, doing $('#example').click()but does not work for me. At least the problem was jquery, I did it without it. I hope that it can be help for somenone. Is a simple way to set an anchor to download an image and do click just after.

Juan Antonio
  • 2,451
  • 3
  • 24
  • 34
2

Yo can create the tag this way:

$('PARENT_TAG').append('<a id="dinamic_link" href="mailto:test@test.com">&nbsp;</a>');
//Now click it
$('#dinamic_link').click();

HTH!

SubniC
  • 9,807
  • 4
  • 26
  • 33
  • 3
    this doesn't seem to work for me. perhaps something is interfering, but `.click()` doesn't seem to work on /any/ link – aidan Jun 29 '11 at 17:07
2

why not just change the window location to the href of the link? Is there any specific reason you need to use a link?

Otherwise:

window.location = 'http://example.com';
Adam Hutchinson
  • 264
  • 3
  • 12
1
$('#something').append('<a id="link" href="mailto:test@yourdomain.com"></a>');
$('#link').trigger('click');
genesis
  • 50,477
  • 20
  • 96
  • 125
  • 3
    this doesn't seem to work for me. perhaps something is interfering, but `.click()` doesn't seem to work on /any/ link – aidan Jun 29 '11 at 17:05
1

I would say you should consider adding the href to a container (mostly div) using .append() and call .click()

$('parent_div').append('<a id="link" href="mailto:test@test.com">&nbsp;</a>');
//Now click it
$('#link').click();
Abdul Kader
  • 5,781
  • 4
  • 22
  • 40
  • 2
    this doesn't seem to work for me. perhaps something is interfering, but `.click()` doesn't seem to work on /any/ link – aidan Jun 29 '11 at 17:07
1

It is not possible to simulate normal clicks. You can only trigger click event handlers that have been bound to an element..

As @Alex has posted, you can change the window.location to achieve the same effect..

Community
  • 1
  • 1
Gabriele Petrioli
  • 191,379
  • 34
  • 261
  • 317
1

Just been doing a tutorial on this!

$("[href='mailto:test@test.com']").click();

This should select all elements with a href attribute with "mailto:test@test.com" as its value.

www.w3schools.com/jquery/jquery_selectors.asp

Gonads
  • 11
  • 2
0

you have to use .on and then call .click . Dynamically generated hyper reference does not work with simple .click()

0

If you want to use jQuery. This is basically the same answer as the answer from jBelanger:

$('body').append('<a id="link" href="mailto:test@test.com">&nbsp;</a>');
$('#link')[0].click();

The problem is $('#link')[0] might not exist YET! You have to wait for it to be created. How to do that? I found the answer here. The following worked for me:

$('body').append('<a id="link" href="mailto:test@test.com">&nbsp;</a>');
waitForElm('#link').then((elm) => { elm.click(); });

function waitForElm(selector) {
    return new Promise(resolve => {
        if (document.querySelector(selector)) {
            return resolve(document.querySelector(selector));
        }

        const observer = new MutationObserver(mutations => {
            if (document.querySelector(selector)) {
                resolve(document.querySelector(selector));
                observer.disconnect();
            }
        });

        observer.observe(document.body, {
            childList: true,
            subtree: true
        });
    });
}
RWC
  • 4,697
  • 2
  • 22
  • 29
-1
var link = document.createElement('<a>')
link.href = "mailto:test@test.com";
link.id = "hitme"
$('#hitme').click();
Vivek
  • 10,978
  • 14
  • 48
  • 66
  • 1
    this doesn't seem to work for me. perhaps something is interfering, but `.click()` doesn't seem to work on /any/ link – aidan Jun 29 '11 at 17:07
  • the first line should be edited as `var link = document.createElement('a')` for it to work properly. – Sanip Jan 29 '23 at 13:53