Tuesday, 30 August 2016

javascript - Attaching click event to a JQuery object not yet added to the DOM




I've been having a lot of trouble attaching the click event to a JQuery object before adding it to the DOM.




Basically I have this button that my function returns, then I append it to the DOM. What I want is to return the button with its own click handler. I don't want to select it from the DOM to attach the handler.



My code is this:



createMyButton = function(data) {

var button = $('
')
.css({
'display' : 'inline',

'padding' : '0px 2px 2px 0px',
'cursor' : 'pointer'
}).append($('').attr({
//'href' : Share.serializeJson(data),
'target' : '_blank',
'rel' : 'nofollow'
}).append($('').css({
"padding-top" : "0px",
"margin-top" : "0px",
"margin-bottom" : "0px"

})));

button.click(function () {
console.log("asdfasdf");
});

return button;
}



The button that is return is unable to catch the click event. However, if I do this (after the button is added to the DOM):



$('#my-button').click(function () {
console.log("yeahhhh!!! but this doesn't work for me :(");
});


It works... but not for me, not what I want.



It seems to be related to the fact that the object is not yet a part of the DOM.




Oh! By the way, I'm working with OpenLayers, and the DOM object that I'm appending the button to is an OpenLayers.FramedCloud (Which is not yet a part of the DOM but will be once a couple of events are triggered.)


Answer



Use this. You can replace body with any parent element that exists on dom ready



$('body').on('click', '#my-button', function () {
console.log("yeahhhh!!! but this doesn't work for me :(");
});



Look here http://api.jquery.com/on/ for more info on how to use on() as it replaces live() as of 1.7+.



Below lists which version you should be using




$(selector).live(events, data, handler); // jQuery 1.3+



$(document).delegate(selector, events, data, handler); // jQuery 1.4.3+



$(document).on(events, selector, data, handler); // jQuery 1.7+




No comments:

Post a Comment

c++ - Does curly brackets matter for empty constructor?

Those brackets declare an empty, inline constructor. In that case, with them, the constructor does exist, it merely does nothing more than t...