Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

jQuery: trying hook a function to the onclick when dynamically adding a DOM element, but it immediately executes the function instead

Tags:

jquery

onclick

I am using jQuery to dynamically (I mean at runtime) add a span element to my page's DOM:

// create add task button
$(document.createElement("span"))
    .attr({ id: activityNameHyphened + "-NewButton", name: activityNameHyphened + "-NewButton" })
    .addClass("smallButton")
    .appendTo(cell1)
    .click(CreateTaskRow(ActivityName));

The problem is the last line: I thought it would add CreateTaskRow(ActivityName) as the handler for the onclick event of the span, just like:

<span onclick="CreateTaskRow(ActivityName);"></span>

which is what I want - but when I run it in the browser, I can see using the debugger that at this line it immediately runs the function instead.

If I can make it clearer: CreateTaskRow() runs when I'm trying to add it to the onclick (I want it to run only when the user actually clicks the span).

Any idea what I'm doing wrong? (and please let me know if my question isn't clear enough)

like image 305
MGOwen Avatar asked Dec 18 '22 07:12

MGOwen


2 Answers

You are actually calling the function and passing the result to the .click() event handler. Try it with a closure (anonymous function) instead:

.click(function() {
    CreateTaskRow(ActivityName);
});

The closure will not be run until the click event is fired.

like image 56
molf Avatar answered May 02 '23 07:05

molf


Try with a closure

$("<span>")
    .attr({ id: activityNameHyphened + "-NewButton", name: activityNameHyphened + "-NewButton" })
    .addClass("smallButton")
    .appendTo(cell1)
    .click(function() { CreateTaskRow(ActivityName); });

Working Demo

Code from the demo -

$(function() {

  var activityNameHyphened = "id1";
  var ActivityName = "This is the highlighted activity";

  $('#clickMe').click(function() {

    $("<span>I've been added</span>")
        .attr({ id: activityNameHyphened + "-NewButton", 
              name: activityNameHyphened + "-NewButton" 
            })
        .addClass("smallButton")
        .appendTo("#here")
        .click(function() { CreateTaskRow(ActivityName); });        
  });    
});


function CreateTaskRow(e)
{
  alert(e);
}
like image 20
Russ Cam Avatar answered May 02 '23 06:05

Russ Cam