Javascript onclick function is called immediately (not when clicked)?
I am trying to create a link, which looks and feels like an <a>
tag item, but runs a function instead of using the href.
When I try to apply the onclick function to the link it immediately calls the function regardless of the fact that the link was never clicked. Any attempt to click the link thereafter fails.
What am I doing wrong?
HTML
<div id="parent">
<a href="#" id="sendNode">Send</a>
</div>
Javascript
startFunction();
function secondFunction()
window.alert("Already called!?");
function startFunction()
var sentNode = document.createElement('a');
sentNode.setAttribute('href', "#");
sentNode.setAttribute('onclick', secondFunction());
//sentNode.onclick = secondFunction();
sentNode.innerHTML = "Sent Items";
//Add new element to parent
var parentNode = document.getElementById('parent');
var childNode = document.getElementById('sendNode');
parentNode.insertBefore(sentNode, childNode);
JsFiddle
As you can see I tried two different ways of adding this onclick function, both of which have the same effect.
javascript html onclick
add a comment |
I am trying to create a link, which looks and feels like an <a>
tag item, but runs a function instead of using the href.
When I try to apply the onclick function to the link it immediately calls the function regardless of the fact that the link was never clicked. Any attempt to click the link thereafter fails.
What am I doing wrong?
HTML
<div id="parent">
<a href="#" id="sendNode">Send</a>
</div>
Javascript
startFunction();
function secondFunction()
window.alert("Already called!?");
function startFunction()
var sentNode = document.createElement('a');
sentNode.setAttribute('href', "#");
sentNode.setAttribute('onclick', secondFunction());
//sentNode.onclick = secondFunction();
sentNode.innerHTML = "Sent Items";
//Add new element to parent
var parentNode = document.getElementById('parent');
var childNode = document.getElementById('sendNode');
parentNode.insertBefore(sentNode, childNode);
JsFiddle
As you can see I tried two different ways of adding this onclick function, both of which have the same effect.
javascript html onclick
because you are calling it immediatelysecondFunction()
, to pass a function you just use its namesecondFunction
– Patrick Evans
Apr 8 '15 at 22:39
This is a function invocation vs function reference issue. More info: stackoverflow.com/questions/11757075/…
– Utkanos
Apr 8 '15 at 22:40
@PatrickEvans that's what I thought originally, but doing that doesn't run the function at all.
– leigero
Apr 8 '15 at 22:40
1
Then you need to look at your console for errors, for instance your jsfiddle is throwing an error because you have set it to have your code executed in the head and not using a dom ready event like onload
– Patrick Evans
Apr 8 '15 at 22:44
add a comment |
I am trying to create a link, which looks and feels like an <a>
tag item, but runs a function instead of using the href.
When I try to apply the onclick function to the link it immediately calls the function regardless of the fact that the link was never clicked. Any attempt to click the link thereafter fails.
What am I doing wrong?
HTML
<div id="parent">
<a href="#" id="sendNode">Send</a>
</div>
Javascript
startFunction();
function secondFunction()
window.alert("Already called!?");
function startFunction()
var sentNode = document.createElement('a');
sentNode.setAttribute('href', "#");
sentNode.setAttribute('onclick', secondFunction());
//sentNode.onclick = secondFunction();
sentNode.innerHTML = "Sent Items";
//Add new element to parent
var parentNode = document.getElementById('parent');
var childNode = document.getElementById('sendNode');
parentNode.insertBefore(sentNode, childNode);
JsFiddle
As you can see I tried two different ways of adding this onclick function, both of which have the same effect.
javascript html onclick
I am trying to create a link, which looks and feels like an <a>
tag item, but runs a function instead of using the href.
When I try to apply the onclick function to the link it immediately calls the function regardless of the fact that the link was never clicked. Any attempt to click the link thereafter fails.
What am I doing wrong?
HTML
<div id="parent">
<a href="#" id="sendNode">Send</a>
</div>
Javascript
startFunction();
function secondFunction()
window.alert("Already called!?");
function startFunction()
var sentNode = document.createElement('a');
sentNode.setAttribute('href', "#");
sentNode.setAttribute('onclick', secondFunction());
//sentNode.onclick = secondFunction();
sentNode.innerHTML = "Sent Items";
//Add new element to parent
var parentNode = document.getElementById('parent');
var childNode = document.getElementById('sendNode');
parentNode.insertBefore(sentNode, childNode);
JsFiddle
As you can see I tried two different ways of adding this onclick function, both of which have the same effect.
javascript html onclick
javascript html onclick
edited Apr 8 '15 at 22:39
asked Apr 8 '15 at 22:38
leigero
2,46783355
2,46783355
because you are calling it immediatelysecondFunction()
, to pass a function you just use its namesecondFunction
– Patrick Evans
Apr 8 '15 at 22:39
This is a function invocation vs function reference issue. More info: stackoverflow.com/questions/11757075/…
– Utkanos
Apr 8 '15 at 22:40
@PatrickEvans that's what I thought originally, but doing that doesn't run the function at all.
– leigero
Apr 8 '15 at 22:40
1
Then you need to look at your console for errors, for instance your jsfiddle is throwing an error because you have set it to have your code executed in the head and not using a dom ready event like onload
– Patrick Evans
Apr 8 '15 at 22:44
add a comment |
because you are calling it immediatelysecondFunction()
, to pass a function you just use its namesecondFunction
– Patrick Evans
Apr 8 '15 at 22:39
This is a function invocation vs function reference issue. More info: stackoverflow.com/questions/11757075/…
– Utkanos
Apr 8 '15 at 22:40
@PatrickEvans that's what I thought originally, but doing that doesn't run the function at all.
– leigero
Apr 8 '15 at 22:40
1
Then you need to look at your console for errors, for instance your jsfiddle is throwing an error because you have set it to have your code executed in the head and not using a dom ready event like onload
– Patrick Evans
Apr 8 '15 at 22:44
because you are calling it immediately
secondFunction()
, to pass a function you just use its name secondFunction
– Patrick Evans
Apr 8 '15 at 22:39
because you are calling it immediately
secondFunction()
, to pass a function you just use its name secondFunction
– Patrick Evans
Apr 8 '15 at 22:39
This is a function invocation vs function reference issue. More info: stackoverflow.com/questions/11757075/…
– Utkanos
Apr 8 '15 at 22:40
This is a function invocation vs function reference issue. More info: stackoverflow.com/questions/11757075/…
– Utkanos
Apr 8 '15 at 22:40
@PatrickEvans that's what I thought originally, but doing that doesn't run the function at all.
– leigero
Apr 8 '15 at 22:40
@PatrickEvans that's what I thought originally, but doing that doesn't run the function at all.
– leigero
Apr 8 '15 at 22:40
1
1
Then you need to look at your console for errors, for instance your jsfiddle is throwing an error because you have set it to have your code executed in the head and not using a dom ready event like onload
– Patrick Evans
Apr 8 '15 at 22:44
Then you need to look at your console for errors, for instance your jsfiddle is throwing an error because you have set it to have your code executed in the head and not using a dom ready event like onload
– Patrick Evans
Apr 8 '15 at 22:44
add a comment |
1 Answer
1
active
oldest
votes
You want .onclick = secondFunction
NOT .onclick = secondFunction()
The latter calls (executes) secondFunction
whereas the former passes a reference to the secondFunction
to be called upon the onclick
event
function start()
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = secondFunction;
a.appendChild(document.createTextNode("click me"));
document.body.appendChild(a);
function secondFunction()
window.alert("hello!");
start();
You could also use elem#addEventListener
a.addEventListener("click", secondFunction);
// OR
a.addEventListener("click", function(event)
secondFunction();
event.preventDefault();
);
@leigero — the code in JS Fiddle doesn't match the code in this answer
– Quentin
Apr 8 '15 at 22:46
@leigero: Of course your fiddle doesn't work. The answer however works.
– slebetman
Apr 8 '15 at 22:47
@leigero yes it does work. See the appended snippet.
– user633183
Apr 8 '15 at 22:47
Thanks. Stupid mistake that was only made complicated by trying to trouble shoot it in JsFiddle.
– leigero
Apr 8 '15 at 22:54
codepen.io/anon/pen/bNPGYv
– Sai Phani
Apr 8 '15 at 22:54
add a comment |
Your Answer
StackExchange.ifUsing("editor", function ()
StackExchange.using("externalEditor", function ()
StackExchange.using("snippets", function ()
StackExchange.snippets.init();
);
);
, "code-snippets");
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "1"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f29526556%2fjavascript-onclick-function-is-called-immediately-not-when-clicked%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
You want .onclick = secondFunction
NOT .onclick = secondFunction()
The latter calls (executes) secondFunction
whereas the former passes a reference to the secondFunction
to be called upon the onclick
event
function start()
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = secondFunction;
a.appendChild(document.createTextNode("click me"));
document.body.appendChild(a);
function secondFunction()
window.alert("hello!");
start();
You could also use elem#addEventListener
a.addEventListener("click", secondFunction);
// OR
a.addEventListener("click", function(event)
secondFunction();
event.preventDefault();
);
@leigero — the code in JS Fiddle doesn't match the code in this answer
– Quentin
Apr 8 '15 at 22:46
@leigero: Of course your fiddle doesn't work. The answer however works.
– slebetman
Apr 8 '15 at 22:47
@leigero yes it does work. See the appended snippet.
– user633183
Apr 8 '15 at 22:47
Thanks. Stupid mistake that was only made complicated by trying to trouble shoot it in JsFiddle.
– leigero
Apr 8 '15 at 22:54
codepen.io/anon/pen/bNPGYv
– Sai Phani
Apr 8 '15 at 22:54
add a comment |
You want .onclick = secondFunction
NOT .onclick = secondFunction()
The latter calls (executes) secondFunction
whereas the former passes a reference to the secondFunction
to be called upon the onclick
event
function start()
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = secondFunction;
a.appendChild(document.createTextNode("click me"));
document.body.appendChild(a);
function secondFunction()
window.alert("hello!");
start();
You could also use elem#addEventListener
a.addEventListener("click", secondFunction);
// OR
a.addEventListener("click", function(event)
secondFunction();
event.preventDefault();
);
@leigero — the code in JS Fiddle doesn't match the code in this answer
– Quentin
Apr 8 '15 at 22:46
@leigero: Of course your fiddle doesn't work. The answer however works.
– slebetman
Apr 8 '15 at 22:47
@leigero yes it does work. See the appended snippet.
– user633183
Apr 8 '15 at 22:47
Thanks. Stupid mistake that was only made complicated by trying to trouble shoot it in JsFiddle.
– leigero
Apr 8 '15 at 22:54
codepen.io/anon/pen/bNPGYv
– Sai Phani
Apr 8 '15 at 22:54
add a comment |
You want .onclick = secondFunction
NOT .onclick = secondFunction()
The latter calls (executes) secondFunction
whereas the former passes a reference to the secondFunction
to be called upon the onclick
event
function start()
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = secondFunction;
a.appendChild(document.createTextNode("click me"));
document.body.appendChild(a);
function secondFunction()
window.alert("hello!");
start();
You could also use elem#addEventListener
a.addEventListener("click", secondFunction);
// OR
a.addEventListener("click", function(event)
secondFunction();
event.preventDefault();
);
You want .onclick = secondFunction
NOT .onclick = secondFunction()
The latter calls (executes) secondFunction
whereas the former passes a reference to the secondFunction
to be called upon the onclick
event
function start()
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = secondFunction;
a.appendChild(document.createTextNode("click me"));
document.body.appendChild(a);
function secondFunction()
window.alert("hello!");
start();
You could also use elem#addEventListener
a.addEventListener("click", secondFunction);
// OR
a.addEventListener("click", function(event)
secondFunction();
event.preventDefault();
);
function start()
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = secondFunction;
a.appendChild(document.createTextNode("click me"));
document.body.appendChild(a);
function secondFunction()
window.alert("hello!");
start();
function start()
var a = document.createElement("a");
a.setAttribute("href", "#");
a.onclick = secondFunction;
a.appendChild(document.createTextNode("click me"));
document.body.appendChild(a);
function secondFunction()
window.alert("hello!");
start();
edited Apr 8 '15 at 22:47
answered Apr 8 '15 at 22:42
user633183
67.9k21135175
67.9k21135175
@leigero — the code in JS Fiddle doesn't match the code in this answer
– Quentin
Apr 8 '15 at 22:46
@leigero: Of course your fiddle doesn't work. The answer however works.
– slebetman
Apr 8 '15 at 22:47
@leigero yes it does work. See the appended snippet.
– user633183
Apr 8 '15 at 22:47
Thanks. Stupid mistake that was only made complicated by trying to trouble shoot it in JsFiddle.
– leigero
Apr 8 '15 at 22:54
codepen.io/anon/pen/bNPGYv
– Sai Phani
Apr 8 '15 at 22:54
add a comment |
@leigero — the code in JS Fiddle doesn't match the code in this answer
– Quentin
Apr 8 '15 at 22:46
@leigero: Of course your fiddle doesn't work. The answer however works.
– slebetman
Apr 8 '15 at 22:47
@leigero yes it does work. See the appended snippet.
– user633183
Apr 8 '15 at 22:47
Thanks. Stupid mistake that was only made complicated by trying to trouble shoot it in JsFiddle.
– leigero
Apr 8 '15 at 22:54
codepen.io/anon/pen/bNPGYv
– Sai Phani
Apr 8 '15 at 22:54
@leigero — the code in JS Fiddle doesn't match the code in this answer
– Quentin
Apr 8 '15 at 22:46
@leigero — the code in JS Fiddle doesn't match the code in this answer
– Quentin
Apr 8 '15 at 22:46
@leigero: Of course your fiddle doesn't work. The answer however works.
– slebetman
Apr 8 '15 at 22:47
@leigero: Of course your fiddle doesn't work. The answer however works.
– slebetman
Apr 8 '15 at 22:47
@leigero yes it does work. See the appended snippet.
– user633183
Apr 8 '15 at 22:47
@leigero yes it does work. See the appended snippet.
– user633183
Apr 8 '15 at 22:47
Thanks. Stupid mistake that was only made complicated by trying to trouble shoot it in JsFiddle.
– leigero
Apr 8 '15 at 22:54
Thanks. Stupid mistake that was only made complicated by trying to trouble shoot it in JsFiddle.
– leigero
Apr 8 '15 at 22:54
codepen.io/anon/pen/bNPGYv
– Sai Phani
Apr 8 '15 at 22:54
codepen.io/anon/pen/bNPGYv
– Sai Phani
Apr 8 '15 at 22:54
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f29526556%2fjavascript-onclick-function-is-called-immediately-not-when-clicked%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
because you are calling it immediately
secondFunction()
, to pass a function you just use its namesecondFunction
– Patrick Evans
Apr 8 '15 at 22:39
This is a function invocation vs function reference issue. More info: stackoverflow.com/questions/11757075/…
– Utkanos
Apr 8 '15 at 22:40
@PatrickEvans that's what I thought originally, but doing that doesn't run the function at all.
– leigero
Apr 8 '15 at 22:40
1
Then you need to look at your console for errors, for instance your jsfiddle is throwing an error because you have set it to have your code executed in the head and not using a dom ready event like onload
– Patrick Evans
Apr 8 '15 at 22:44