305

I would like to pass a parameter (i.e. a string) to an Onclick function.

For the moment, I do this:

'<input type="button" onClick="gotoNode(' + result.name + ')" />'

with result.name for example equal to string "Add".

When I click on this button, I have an error that says that "Add is not defined". Since this function call works perfectly with a numeric parameter, I assume that it has something to do with the symbols "" in the string.

How can I fix this problem?

2
  • 2
    It might be better in this case to simply not use inline event handlers. Commented Mar 10, 2012 at 2:09
  • 1
    Your problem is due to the variable not being escaped properly. Check my answer
    – Starx
    Commented Mar 10, 2012 at 2:43

28 Answers 28

451

It looks like you're building DOM elements from strings. You just need to add some quotes around result.name:

'<input type="button" onClick="gotoNode(\'' + result.name + '\')" />'

You should really be doing this with proper DOM methods though.

var inputElement = document.createElement('input');
inputElement.type = "button"
inputElement.addEventListener('click', function(){
    gotoNode(result.name);
});

​document.body.appendChild(inputElement);​

Just be aware that if this is a loop or something, result will change before the event fires and you'd need to create an additional scope bubble to shadow the changing variable.

9
  • 4
    Hi @david..I have one doubt...I want to pass multiple argument in that onclick..how it possible? can you make useful for me..?
    – VIVEK-MDU
    Commented Aug 22, 2013 at 13:25
  • 2
    @david,thanks it solved my string parameter issue but now i have to pass (string, boolean). what to do for that? Commented Jan 21, 2014 at 9:17
  • 2
    @david : can you tell little bit why do we need to add quote around that
    – Hitesh
    Commented Sep 23, 2014 at 13:16
  • 1
    @hitesh if you don't add quotes, the string will be perceived as a variable.
    – Jay Welsh
    Commented Jun 21, 2016 at 8:08
  • @david What do you mean by scope bubble to shadow? Commented Feb 17, 2017 at 9:22
59

A couple of concerns for me with respect to using string escape in onClick and as the number of arguments grow, it will become cumbersome to maintain.

The following approach will have a one hop - On click - take the control to a handler method and handler method, based on the event object, can deduct the click event and corresponding object.

It also provides a cleaner way to add more arguments and have more flexibility.

<button type="button"
        className="btn btn-default"
        onClick="invoke"
        name='gotoNode'
        data-arg1='1234'>GotoNode</button>

In the JavaScript layer:

  invoke = (event) => {
    let nameOfFunction = this[event.target.name];
    let arg1 = event.target.getAttribute('data-arg1');
    // We can add more arguments as needed...
    window[nameOfFunction](arg1)
    // Hope the function is in the window.
    // Else the respective object need to be used
    })
  }

The advantage here is that we can have as many arguments (in above example, data-arg1, data-arg2, etc.) as needed.

5
  • 4
    I'm surprised this isn't getting more upvotes as it is the cleaner method of passing arguments to an event handler. Commented Sep 30, 2016 at 16:47
  • 2
    This does not work, invoke is not called when you click on the button
    – tanguy_k
    Commented May 7, 2019 at 9:10
  • Great solution! If you need to pass Arrays or Objects just use JSON.stringify(obj) in the HTML and JSON.parse(event.target.getAttribute('data-arg')) in the JavaScript-layer
    – leonheess
    Commented Jul 4, 2019 at 8:25
  • @SairamKrish In my case, if i click the button i have set to display id, screenshot : snag.gy/7bzEWN.jpg code : pastiebin.com/5d35674e2fc31
    – Gem
    Commented Jul 22, 2019 at 7:36
  • This may work, but it is an abstruse, atypical implementation that would be hard to follow for another developer that needed to maintain this. Commented Sep 9, 2019 at 23:17
32

I suggest not even using HTML onclick handlers, and use something more common such as document.getElementById.

HTML:

<input type="button" id="nodeGoto" />

JavaScript:

document.getElementById("nodeGoto").addEventListener("click", function() {
    gotoNode(result.name);
}, false);
6
  • 3
    onclick is not a function, it's a property you have to assign a function to: ....onclick = function() {...}; Commented Mar 10, 2012 at 2:16
  • @FelixKling Thanks for that, my head's still in jQuery mode.
    – Kevin Ji
    Commented Mar 10, 2012 at 2:18
  • 5
    You're assuming there will be just one of these inputs.
    – Madbreaks
    Commented Mar 10, 2012 at 2:18
  • Well the OP's question implies that there will only be one input.
    – Kevin Ji
    Commented Mar 10, 2012 at 2:18
  • I think this option doesn't work for me, because I generate multiple buttons as a result of a search-operation. I could solve this by using a counter to add to the id's but I want to keep it simple and keep it inline
    – JasperTack
    Commented Mar 10, 2012 at 2:26
27

This is a nice and neat way to send a value or object.

<!DOCTYPE html>
<html>
    <body>
        <h1  onclick="test('wow',this)">Click on this text!</h1>
        <script>
            var test = function(value,object) {
                object.innerHTML= value;
            };
        </script>
    </body>
</html>
0
23

I am guessing, you are creating a button using JavaScript itself. So, the error in your code is that, it will render in this form

<input type="button" onClick="gotoNode(add)" />'

At this current state, add will be considered as an identifier like variables or function calls. You should escape the value like this

'<input type="button" onClick="gotoNode(\'' + result.name + '\')" />'
0
13

Try this...

HTML:

<button id="a1" type="button" onclick="return a1_onclick('a1')">a1</button>

JavaScript:

<script language="javascript" type="text/javascript">
    function a1_onclick(id) {
        document.getElementById(id).style.backgroundColor = "#F00";
    }
</script>

Note: be sure of sending arguments between ' ' signs like ('a1') in HTML code

2
  • thanks!! been looking for this prob for couple hourss
    – cweitat
    Commented Jan 26, 2018 at 7:31
  • Does anyone help? In my case, if i click the button i have set to display id, screenshot : snag.gy/7bzEWN.jpg code : pastiebin.com/5d35674e2fc31
    – Gem
    Commented Jul 22, 2019 at 7:37
13

If your button is generated dynamically:

You can pass string parameters to JavaScript functions like the below code:

I passed three parameters where the third one is a string parameter.

var btn ="<input type='button' onclick='RoomIsReadyFunc("+ID+","+RefId+",\""+YourString+"\");'  value='Room is Ready' />";

// Your JavaScript function

function RoomIsReadyFunc(ID, RefId, YourString)
{
  alert(ID);
  alert(RefId);
  alert(YourString);
}
1
  • 1
    Nice, Clean and simple. Thanks
    – user8456867
    Commented Jan 10, 2020 at 15:14
10

Also you can use the grave accent symbol ( ` ) in a string

Try:

`<input type="button" onClick="gotoNode('${result.name}')" />`

For more information, visit MDN and Stack Overflow.

By Chrome, Edge, Firefox (Gecko), Opera, Safari support, but it does not support Internet Explorer.

7

If the requirement is to reference the global object (JavaScript) in your HTML code, you can try this. [Don't use any quotes (' or ") around the variable]

Fiddle reference.

JavaScript:

var result = {name: 'hello'};
function gotoNode(name) {
    alert(name);
}

HTML:

<input value="Hello" type="button" onClick="gotoNode(result.name)" />​
5
  • I get an error when I try this solution: the part "+ result.name +" is used as string in this case
    – JasperTack
    Commented Mar 10, 2012 at 2:28
  • what is "result" object? Is it a global variable declared in JS? like ... var result = {name: 'javascript'}; Commented Mar 10, 2012 at 2:30
  • result contains a record from the jowl library: it's a json-structure with attributes name, type, ...
    – JasperTack
    Commented Mar 10, 2012 at 2:36
  • Jaspack, I have updated the answer. Does it work for you now? Commented Mar 10, 2012 at 2:37
  • Thank you for the example, but that doesn't work in my case: the result variable isn't global, but is a variable within a procedure. So when I call the function with result.name, result isn't known
    – JasperTack
    Commented Mar 10, 2012 at 2:45
5

Multiple parameters:

bounds.extend(marker.position);
bindInfoWindow(marker, map, infowindow,
    '<b>' + response[i].driver_name + '</b><br>' +
    '<b>' + moment(response[i].updated_at).fromNow() + '</b>
     <button onclick="myFunction(\'' + response[i].id + '\',\'' + driversList + '\')">Click me</button>'
);
2

You can pass a reference or string value. Just put the function inside the double commas "" as per the below snapshot:

Enter image description here

2

Here is a jQuery solution that I'm using.

jQuery

$("#slideshow button").click(function(){
    var val = $(this).val();
    console.log(val);
});

HTML

<div id="slideshow">
    <img src="image1.jpg">
    <button class="left" value="back">&#10094;</button>
    <button class="right" value="next">&#10095;</button>
</div>
0
1

If you need to pass a variable along with the 'this' keyword, the below code works:

var status = 'Active';
var anchorHTML = '<a href ="#" onClick = "DisplayActiveStatus(this,\'' + status + '\')">' + data+ '</a>';
1
  • var status = 'Active'; var anchorHTML = '<a href ="#" onClick = "DisplayActiveStatus(this,\'' + status + '\')">' + data+ '</a>';
    – Arun
    Commented Jun 30, 2020 at 4:57
1

If to use for generation of a set of buttons with different parameters of handlers.

JavaScript Closures

let some_button = document.createElement( "button" );
some_button.type = "button";

some_button.onclick = doWithParam( some_param );

function doWithParam( param ){
    return function(){
        alert( param ); // <-- Your code here
    }
}

If we do:

some_button.onclick = foo( some_param );
function foo( param ){
    alert( param );
}

then function foo starts after every updating page.

If we do:

for( let i = 0; i < 10; ++i ){
    var inputElement = document.createElement('input');
    inputElement.type = "button"
    inputElement.addEventListener('click', function(){
        gotoNode(result.name);
    });

 ​   document.body.appendChild(inputElement);​
}

then for all buttons created in the loop, the last value of the parameter is "result.name".

0
1
<!----  script ---->
<script>
function myFunction(x) {
  document.getElementById("demo").style.backgroundColor = x; 
}
</script>

<!---- source ---->
<p id="demo" style="width:20px;height:20px;border:1px solid #ccc"></p>

<!----  buttons & function call ----> 
<a  onClick="myFunction('red')" />RED</a> 
<a  onClick="myFunction('blue')" />BLUE</a> 
<a  onClick="myFunction('black')" />BLACK</a>
1
  • 2
    Please don't post only code as answer, but also provide an explanation what your code does and how it solves the problem of the question. Answers with an explanation are usually more helpful and of better quality, and are more likely to attract upvotes.
    – Tyler2P
    Commented Jan 6, 2021 at 12:24
1

This is work for me:

$(element).attr("onClick", 'functionName(' + "\"" + Object.attribute + "\"" + ')');

Just add \ slash in ()

※Multiple parameters example

"functionName(" + "'" + parameter1 + "','" + parameter2 + "','" + parameter3 + "','" + parameter4 + "','" + parameter5 + "','" + parameter6 + "')"
0
let task = {....}

<button onclick="myFunction('${task}')">Continue task</button></li>
0
0

In Razor, you can pass parameters dynamically:

<a href='javascript:void(0);' onclick='showtotextbox(@Model.UnitNameVMs[i].UnitNameID, "@Model.UnitNameVMs[i].FarName","@Model.UnitNameVMs[i].EngName","@Model.UnitNameVMs[i].Symbol" );'>@Model.UnitNameVMs[i].UnitNameID</a>
0

If you are using ASP.NET you can use JavaScript:

HTML

<input type='button' value='test' onclick='javascript: EditSelectedOptionName(x,y)' />"

JavaScript

function EditSelectedOptionName(id, name) {
    console.log(id);
    console.log(name);
}
1
0

For passing multiple parameters you can cast the string by concatenating it with the ASCII value. Like, for single quotes we can use &#39;:

var str = "&#39;" + str + "&#39;";

The same parameter you can pass to the onclick() event. In most of the cases it works with every browser.

0
<style type="text/css">
    #userprofile{
        display: inline-block;
        padding: 15px 25px;
        font-size: 24px;
        cursor: pointer;
        text-align: center;
        text-decoration: none;
        outline: none;
        color: #FFF;
        background-color: #4CAF50; // #C32836
        border: none;
        border-radius: 15px;
        box-shadow: 0 9px #999;
        width: 200px;
        margin-bottom: 15px;
    }
    #userprofile:hover {
        background-color: #3E8E41
    }

    #userprofile:active {
        background-color: #3E8E41;
        box-shadow: 0 5px #666;
        transform: translateY(4px);
    }

    #array {
        border-radius: 15px 50px;
        background: #4A21AD;
        padding: 20px;
        width: 200px;
        height: 900px;
        overflow-y: auto;
    }
</style>
if (data[i].socketid != "") {
    $("#array").append("<button type='button' id='userprofile' class='green_button' name=" + data[i]._id + " onClick='chatopen(name)'>" + data[i].username + "</button></br>");
}
else {
    console.log('null socketid  >>', $("#userprofile").css('background-color'));
    //$("#userprofile").css('background-color', '#C32836 ! important');

    $("#array").append("<button type='button' id='userprofile' class='red_button' name=" + data[i]._id + " onClick='chatopen(name)'>" + data[i].username+"</button></br>");
    $(".red_button").css('background-color','#C32836');
}
1
  • 2
    Please explain your code, this answer by itself is not useful Commented Feb 13, 2019 at 6:14
0

If you are adding buttons or link dynamically and facing the issue then this may be help. I solved it by this way:

var link= $(contentData1[i]).find("td:first font b a").attr("href",'javascript:onClick=openWin(\'' + tdText + '\')');

I am new to HTML, jQuery and JavaScript. So maybe my code will not be optimized or syntax, but it was working for me.

0

Not escaping double quotes is the cause of OP's problem. A readable approach to escape double quotes is using backticks (MDN). Here is a sample solution:

my_btn.setAttribute('onclick', `my_func("${onclick_var1}", "${onclick_var2}")`);

0

You can use this:

'<input id="test" type="button" value="' + result.name + '" />'

$(document).on('click', "#test", function () {
    alert($(this).val());
});

It worked for me.

1
  • What does ".." (two) mean? Commented Oct 8, 2020 at 22:30
0
<button style="background-color: gray;color:white;" onclick="displayAlert('the message')">alert</button>
<script>
    function displayAlert(msg){
        alert(msg);
    }

</script>
1
  • 2
    When answering you should include a description of your code so that others can understand how it addresses the question as asked.
    – Besworks
    Commented Jun 1, 2022 at 19:23
0
<button onclick='viewComment(\"string_value"\",\""+comment+"\")' class='btn btn-primary btn-grad'> View Comment </button>;

function viewComment(empl_id, comment) { //enter code here }

1
  • You are not yet done with completly writing your answer post. While editing try for How to Answer. Use this info stackoverflow.com/help/formatting If this was an accident or an intentional test post please delete it, or it risks being perceived as a rude extend of carelessness.
    – Yunnosch
    Commented May 19 at 5:33
-1

The following works for me very well,

<html>
<head>
    <title>HTML Form</title>
</head>
<body>
    <form>
        <input type="button" value="ON" onclick="msg('ON')">
        <input type="button" value="OFF" onclick="msg('OFF')">
    </form>
    <script>
        function msg(x){
            alert(x);
        }
    </script>
</body>
</html>
1
  • 1
    OP is not asking about a constant value. This does not answer the question.
    – RubioRic
    Commented May 11, 2018 at 9:23
-1

You can use this code in your button onclick method:

<button class="btn btn-danger" onclick="cancelEmployee(\''+cancelButtonID+'\')" > Cancel </button>

Not the answer you're looking for? Browse other questions tagged or ask your own question.