passing arguments in onclick functions appended from Javascript

Viewed 57

I have a piece of code which looks like the following,

$(document).ready(function(){
  var agr1='#19865 - testArg';
  var arg2=1856
  $('#dv_Test').append('<button onclick="testFunction('+ agr1 +','+ arg2 +')">Test</button>')
});
function testFunction(arg1, arg2) { 
  alert(arg1);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dv_Test"></div>

here I am getting error like the following

testFunction(#19865 - testArg,1856)  

Uncaught SyntaxError: Invalid or unexpected token

and my string agr1 doesn't have "" with itself

how can I solve this issue?

2 Answers

The issue is because the arg1 value is a string and needs to have quotes around it:

$(document).ready(function() {
  var agr1 = '#19865 - testArg';
  var arg2 = 1856
  $('#dv_Test').append('<button onclick="testFunction(\'' + agr1 + '\',' + arg2 + ')">Test</button>')
});

function testFunction(arg1, arg2) {
  alert(arg1);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dv_Test"></div>

However a much better way to do this would be to put those values in data attributes and add a single delegated event handler to handle all dynamically created buttons. Try this:

$(document).ready(function() {
  var agr1 = '#19865 - testArg';
  var arg2 = 1856
  var $div = $('#dv_Test').append('<button data-arg1="' + agr1 + '" data-arg2="' + arg2 + '">Test</button>');
  
  $div.on('click', 'button', function() {
    var $btn = $(this); 
    console.log($btn.data('arg1'), $btn.data('arg2'));
  }); 
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dv_Test"></div>

You need to have quotes around the argument.Alternatively you can try template literals

$(document).ready(function() {
  var agr1 = '#19865 - testArg';
  var arg2 = 1856
  $('#dv_Test').append(`<button onclick="testFunction('${agr1}','${arg2}' )">Test</button>`)
});

function testFunction(arg1, arg2) {
  alert(arg1);
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="dv_Test"></div>

Related