jquery - adding listeners to generated html - javascript

In my .js file I have a button listener that generates following:
$('#add').click(function(){
$('<div id="school-field'+i+'"><fieldset>Remove</fieldset></div>').fadeIn('slow').appendTo('.school');
});
I've been trying to generated listeners to added buttons but I can't get it to work.
I tried to use delegate on 'a' but than it's problem to find div's id. If I have the same div id for all of the generates (div id="school-field"), I do make it work but it deletes the last added elements, not the one where "remove'+i+'" was clicked.
I also tried to define a listener inside it by doing, but it throws exception:
$('#remove'+i'').click(function(){
var div = document.getElementById("school-field'+i+'");
div.parentNode.removeChild(div);
});
How can I get it to work properly?

As of jQuery 1.7 you should use on because live and bind are both deprecated.
$(document).on("click", ".delete", function(event){
//Your code
});
You can use live to automatically bind new DOM elements to event listeners:
http://api.jquery.com/live/
Or you add them manually with bind inside the click event callback of the add button.
http://api.jquery.com/bind/
You just need to use a class or another selector which matches every element for the event listerners.
You can then use closest to match the parent box.
It would look something similar to $(this).closest('div').remove(); to remove the whole parent div.

how about using 'a[id*=remove]' as a selector for on method. eg:
$('first common container your a tags are stored').on('click', 'a[id*=remove]', function () {
// your code to remove elements
});
it's delegated 'version' of on method with a fancy selector that matches a pattern in id attribute

try using .on() like this
$("[id^='remove']").each(function() {
var id = parseInt(this.id.replace("remove", ""));
var elem = $("#remove" + id);
$("#remove" + id).on('click',function(){
var div = document.getElementById("#school-field"+id);
div.parentNode.removeChild(div);
});
});

use jQuery's on method, like mentioned in another answer, but use the event.currentTarget parameter that is sent to your handler.
$('some container you keep your links').on('click', 'a[id*=remove]', function (event) {
$el = $(event.currentTarget).parent();
$el.remove();
});
A similar functionality can be had by using live, but that method is depreciated as of jQuery 1.7
here is a great discussion of the different ways to attach events with jQuery

Related

jQuery onclick event not fire [duplicate]

This question already has answers here:
Event binding on dynamically created elements?
(23 answers)
Closed 5 years ago.
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("button").click(function() {
$("h2").html("<p class='test'>click me</p>")
});
$(".test").click(function(){
alert();
});
});
</script>
</head>
<body>
<h2></h2>
<button>generate new element</button>
</body>
</html>
I was trying to generate a new tag with class name test in the <h2> by clicking the button. I also defined a click event associated with test. But the event doesn't work.
Can anyone help?
The click() binding you're using is called a "direct" binding which will only attach the handler to elements that already exist. It won't get bound to elements created in the future. To do that, you'll have to create a "delegated" binding by using on().
Delegated events have the advantage that they can process events from descendant elements that are added to the document at a later time.
Source
Here's what you're looking for:
var counter = 0;
$("button").click(function() {
$("h2").append("<p class='test'>click me " + (++counter) + "</p>")
});
// With on():
$("h2").on("click", "p.test", function(){
alert($(this).text());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<h2></h2>
<button>generate new element</button>
The above works for those using jQuery version 1.7+. If you're using an older version, refer to the previous answer below.
Previous Answer:
Try using live():
$("button").click(function(){
$("h2").html("<p class='test'>click me</p>")
});
$(".test").live('click', function(){
alert('you clicked me!');
});
Worked for me. Tried it with jsFiddle.
Or there's a new-fangled way of doing it with delegate():
$("h2").delegate("p", "click", function(){
alert('you clicked me again!');
});
An updated jsFiddle.
Use the .on() method with delegated events
$('#staticParent').on('click', '.dynamicElement', function() {
// Do something on an existent or future .dynamicElement
});
The .on() method allows you to delegate any desired event handler to:
current elements or future elements added to the DOM at a later time.
P.S: Don't use .live()! From jQuery 1.7+ the .live() method is deprecated.
Reason:
In jQuery, Click() event Direct binding which attaches the event handler to the element only if the particular element(Html code) exists on the page(after page loads).
Dynamic elements are created with the help of javascript or jquery(not in Html).
It won't consider the future elements(Dynamic) which are created after the page gets loaded.
So the normal click event won't fire on the dynamic element.
Solution :
To overcome this, we should use on() function. on() can delegate the event for both the current and future elements.
Delegated events have the advantage that can attach the handler to the elements which are being added to the document in the future.
Note : delegate(),live() and on() functions have the advantages over the DOM elements. As of JQuery 1.7 delegate() and live() are deprecated(Don't use these).
on() only Can delegate the event for both current and future elements.
So, Your code should be like this
Remove the code from $(document).ready:
$(".test").click(function(){
alert();
});
Change into:
$(document).on('click','.test',function(){
alert('Clicked');
});
Add this function in your js file.
It will work on every browser
$(function() {
$(document).on("click", '#mydiv', function() {
alert("You have just clicked on ");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='mydiv'>Div</div>
Change
$(".test").click(function(){
To
$(".test").live('click', function(){
LIVE DEMO
jQuery .live()
You need to use .live for this to work:
$(".test").live("click", function(){
alert();
});
or if you're using jquery 1.7+ use .on:
$(".test").on("click", "p", function(){
alert();
});
Try .live() or .delegate()
http://api.jquery.com/live/
http://api.jquery.com/delegate/
Your .test element was added after the .click() method, so it didn't have the event attached to it. Live and Delegate give that event trigger to parent elements which check their children, so anything added afterwards still works. I think Live will check the entire document body, while Delegate can be given to an element, so Delegate is more efficient.
More info:
http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/
I found two solutions at the jQuery's documentation:
First: Use delegate on Body or Document
E.g:
$("body").delegate('.test', 'click', function(){
...
alert('test');
});
Why?
Answer: Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.
link: http://api.jquery.com/delegate/
Second: Put the your function at the "$( document )", using "on" and attach it to the element that you want to trigger this.
The first parameter is the "event handler", the second: the element and the third: the function.
E.g:
$( document ).on( 'click', '.test', function () {
...
alert('test');
});
Why?
Answer: Event handlers are bound only to the currently selected elements; they must exist on the page at the time your code makes the call to .on(). To ensure the elements are present and can be selected, perform event binding inside a document ready handler for elements that are in the HTML markup on the page. If new HTML is being injected into the page, select the elements and attach event handlers after the new HTML is placed into the page. Or, use delegated events to attach an event handler, as described next ...
link: https://api.jquery.com/on/
Best way to apply event on dynamically generated content by using delegation.
$(document).on("eventname","selector",function(){
// code goes here
});
so your code is like this now
$(document).on("click",".test",function(){
// code goes here
});
$(.surrounding_div_class).on( 'click', '.test', function () {
alert( 'WORKS!' );
});
Will only work if the DIV with the class .surrounding_div_class is the immediate parent to the object .test
If there is another object in the div that will be filled it wont work.
The problem you have is that you're attempting to bind the "test" class to the event before there is anything with a "test" class in the DOM. Although it may seem like this is all dynamic, what is really happening is JQuery makes a pass over the DOM and wires up the click event when the ready() function fired, which happens before you created the "Click Me" in your button event.
By adding the "test" Click event to the "button" click handler it will wire it up after the correct element exists in the DOM.
<script type="text/javascript">
$(document).ready(function(){
$("button").click(function(){
$("h2").html("<p class='test'>click me</p>")
$(".test").click(function(){
alert()
});
});
});
</script>
Using live() (as others have pointed out) is another way to do this but I felt it was also a good idea to point out the minor error in your JS code. What you wrote wasn't wrong, it just needed to be correctly scoped. Grasping how the DOM and JS works is one of the tricky things for many traditional developers to wrap their head around.
live() is a cleaner way to handle this and in most cases is the correct way to go. It essentially is watching the DOM and re-wiring things whenever the elements within it change.
An alternate and more succinct alternative (IMHO) is to use a raw javascript function that responds to an on click event, then pass the target element back to jQuery if you like. The advantage of this approach is that you can dynamically add your element anywhere, and the click handler will 'just work', and you need not concern yourself with delegating control to parent elements, and so on.
Step 1: Update the dynamic html to fire an onclick event. Be sure to pass the 'event' object as an argument
$("button").click(function() {
$("h2").html("<p class='test' onclick='test(event)'> click me </p>")
});
Step 2: Create the test function to respond to the click event
function test(e){
alert();
});
Optional Step 3: Given you are using jQuery I'm assuming it will be useful to get a reference back to the source button
function test(e){
alert();
// Get a reference to the button
// An explanation of this line is available here
var target = (e.target)? e.target : e.srcElement;
// Pass the button reference to jQuery to do jQuery magic
var $btn = $(target);
});
.live function works great.
It is for Dynamically added elements to the stage.
$('#selectAllAssetTypes').live('click', function(event){
alert("BUTTON CLICKED");
$('.assetTypeCheckBox').attr('checked', true);
});
Cheers,
Ankit.
The Jquery .on works ok but I had some problems with the rendering implementing some of the solutions above. My problem using the .on is that somehow it was rendering the events differently than the .hover method.
Just fyi for anyone else that may also have the problem. I solved my problem by re-registering the hover event for the dynamically added item:
re-register the hover event because hover doesn't work for dynamically created items.
so every time i create the new/dynamic item i add the hover code again. works perfectly
$('#someID div:last').hover(
function() {
//...
},
function() {
//...
}
);
I'm working with tables adding new elements dynamically to them, and when using on(), the only way of making it works for me is using a non-dynamic parent as:
<table id="myTable">
<tr>
<td></td> // Dynamically created
<td></td> // Dynamically created
<td></td> // Dynamically created
</tr>
</table>
<input id="myButton" type="button" value="Push me!">
<script>
$('#myButton').click(function() {
$('#myTable tr').append('<td></td>');
});
$('#myTable').on('click', 'td', function() {
// Your amazing code here!
});
</script>
This is really useful because, to remove events bound with on(), you can use off(), and to use events once, you can use one().
I couldn't get live or delegate to work on a div in a lightbox (tinybox).
I used setTimeout successfullly, in the following simple way:
$('#displayContact').click(function() {
TINY.box.show({html:'<form><textarea id="contactText"></textarea><div id="contactSubmit">Submit</div></form>', close:true});
setTimeout(setContactClick, 1000);
})
function setContactClick() {
$('#contactSubmit').click(function() {
alert($('#contactText').val());
})
}
Also you can use onclick="do_something(this)"inside element
If you have a dinamically added link to some container or the body:
var newLink= $("<a></a>", {
"id": "approve-ctrl",
"href": "#approve",
"class": "status-ctrl",
"data-attributes": "DATA"
}).html("Its ok").appendTo(document.body);
you can take its raw javascript element and add an event listener to it, like the click:
newLink.get(0).addEventListener("click", doActionFunction);
No matter how many times you add this new link instance you can use it as if you where using a jquery click function.
function doActionFunction(e) {
e.preventDefault();
e.stopPropagation();
alert($(this).html());
}
So you will receive a message saying
Its ok
It has better performance than other alternatives.
Extra: You could gain better performance avoiding jquery and using plain javascript. If you are using IE up to version 8 you should use this polyfill to use the method addEventListener
if (typeof Element.prototype.addEventListener === 'undefined') {
Element.prototype.addEventListener = function (e, callback) {
e = 'on' + e;
return this.attachEvent(e, callback);
};
}
You CAN add on click to dynamically created elements. Example below. Using a When to make sure its done. In my example, i'm grabbing a div with the class expand, adding a "click to see more" span, then using that span to hide/show the original div.
$.when($(".expand").before("<span class='clickActivate'>Click to see more</span>")).then(function(){
$(".clickActivate").click(function(){
$(this).next().toggle();
})
});
Use 'on' as click gets bind to the elements already present.
For e.g
$('test').on('click',function(){
alert('Test');
})
This will help.

How can I either target an Appended element using Jquery or Javascript, or how can I add that appened element to the DOM?

I've looked all over the internet with everyone giving the same answer
$(document).on('click', '#targetID', function() {
// do stuff
});
instead of
$('#targetID').click(function() {
// do stuff
});
This is nice and it works fine, if you have a click event. But within that on click function, the part where it says do stuff, how can I now target an appended element? For instance say I append 2 divs back to back.
<div id="mainDiv"></div>
<script>
socket.on('event', function (data) {
$('#mainDiv').append ('<div class="1st" id="'+data.id+'">one</div>
<div class="2nd" id="'+data.id+'">second</div>');
});
$(document).on('click', '.1st', function() {
//and right here i would like to`enter something like
$('.2nd').css('background-color','yellow');
}
</scirpt>
This however seems not to work because to my knowledge, this element hasn't been added to the DOM. So what should I do? Should i use angular.js for this?
PS I've also tried adding the entire appended content into a variable first before appending that variable. and then using variable.find to find the element within to no avail. The variable only has context within that function, but is null in the on click function. Thanks in advance for any information that broadens my understanding of this.
The delegation of 'on' is correct. Once the div element exists in the dom, clicking should work. My only concern is you have named your classname beginning with a number. Maybe name it with an alpha character followed by a number.
The difference between the 2 is the concept of event binding vs event delegation.
$('#targetID').click(function() { is event binding which works on elements as long as they exist in the markup when the page or document loads.
$(document).on('click', '#targetID', function() { is event delegation which means the event would listen to the document for the click event on the element with ID targetID if it exists in the DOM when the page loads or if it is dynamically added.
So In your case, its event delegation since you are dynamically adding the elements. But in order to make it work, you need to register the listener on the document ready event for the document to listen to the event on the element #targetID
<script>
$(document).ready(function() // Add this
{
socket.on('event', function (data) {
$('#mainDiv').append ('<div class="1st" id="'+data.id+'">one</div><div class="2nd" id="'+data.id+'">second</div>');
});
$(document).on('click', '.1st', function() {
//and right here i would like to`enter something like
$('.2nd').css('background-color','yellow');
});
});
</script>
Here's an example : https://jsfiddle.net/nobcp0L7/1/

how to get element value where multiple class name is same in jquery [duplicate]

This question already has answers here:
Event binding on dynamically created elements?
(23 answers)
Closed 5 years ago.
<html>
<head>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$("button").click(function() {
$("h2").html("<p class='test'>click me</p>")
});
$(".test").click(function(){
alert();
});
});
</script>
</head>
<body>
<h2></h2>
<button>generate new element</button>
</body>
</html>
I was trying to generate a new tag with class name test in the <h2> by clicking the button. I also defined a click event associated with test. But the event doesn't work.
Can anyone help?
The click() binding you're using is called a "direct" binding which will only attach the handler to elements that already exist. It won't get bound to elements created in the future. To do that, you'll have to create a "delegated" binding by using on().
Delegated events have the advantage that they can process events from descendant elements that are added to the document at a later time.
Source
Here's what you're looking for:
var counter = 0;
$("button").click(function() {
$("h2").append("<p class='test'>click me " + (++counter) + "</p>")
});
// With on():
$("h2").on("click", "p.test", function(){
alert($(this).text());
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
<h2></h2>
<button>generate new element</button>
The above works for those using jQuery version 1.7+. If you're using an older version, refer to the previous answer below.
Previous Answer:
Try using live():
$("button").click(function(){
$("h2").html("<p class='test'>click me</p>")
});
$(".test").live('click', function(){
alert('you clicked me!');
});
Worked for me. Tried it with jsFiddle.
Or there's a new-fangled way of doing it with delegate():
$("h2").delegate("p", "click", function(){
alert('you clicked me again!');
});
An updated jsFiddle.
Use the .on() method with delegated events
$('#staticParent').on('click', '.dynamicElement', function() {
// Do something on an existent or future .dynamicElement
});
The .on() method allows you to delegate any desired event handler to:
current elements or future elements added to the DOM at a later time.
P.S: Don't use .live()! From jQuery 1.7+ the .live() method is deprecated.
Reason:
In jQuery, Click() event Direct binding which attaches the event handler to the element only if the particular element(Html code) exists on the page(after page loads).
Dynamic elements are created with the help of javascript or jquery(not in Html).
It won't consider the future elements(Dynamic) which are created after the page gets loaded.
So the normal click event won't fire on the dynamic element.
Solution :
To overcome this, we should use on() function. on() can delegate the event for both the current and future elements.
Delegated events have the advantage that can attach the handler to the elements which are being added to the document in the future.
Note : delegate(),live() and on() functions have the advantages over the DOM elements. As of JQuery 1.7 delegate() and live() are deprecated(Don't use these).
on() only Can delegate the event for both current and future elements.
So, Your code should be like this
Remove the code from $(document).ready:
$(".test").click(function(){
alert();
});
Change into:
$(document).on('click','.test',function(){
alert('Clicked');
});
Add this function in your js file.
It will work on every browser
$(function() {
$(document).on("click", '#mydiv', function() {
alert("You have just clicked on ");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id='mydiv'>Div</div>
Change
$(".test").click(function(){
To
$(".test").live('click', function(){
LIVE DEMO
jQuery .live()
You need to use .live for this to work:
$(".test").live("click", function(){
alert();
});
or if you're using jquery 1.7+ use .on:
$(".test").on("click", "p", function(){
alert();
});
Try .live() or .delegate()
http://api.jquery.com/live/
http://api.jquery.com/delegate/
Your .test element was added after the .click() method, so it didn't have the event attached to it. Live and Delegate give that event trigger to parent elements which check their children, so anything added afterwards still works. I think Live will check the entire document body, while Delegate can be given to an element, so Delegate is more efficient.
More info:
http://www.alfajango.com/blog/the-difference-between-jquerys-bind-live-and-delegate/
I found two solutions at the jQuery's documentation:
First: Use delegate on Body or Document
E.g:
$("body").delegate('.test', 'click', function(){
...
alert('test');
});
Why?
Answer: Attach a handler to one or more events for all elements that match the selector, now or in the future, based on a specific set of root elements.
link: http://api.jquery.com/delegate/
Second: Put the your function at the "$( document )", using "on" and attach it to the element that you want to trigger this.
The first parameter is the "event handler", the second: the element and the third: the function.
E.g:
$( document ).on( 'click', '.test', function () {
...
alert('test');
});
Why?
Answer: Event handlers are bound only to the currently selected elements; they must exist on the page at the time your code makes the call to .on(). To ensure the elements are present and can be selected, perform event binding inside a document ready handler for elements that are in the HTML markup on the page. If new HTML is being injected into the page, select the elements and attach event handlers after the new HTML is placed into the page. Or, use delegated events to attach an event handler, as described next ...
link: https://api.jquery.com/on/
Best way to apply event on dynamically generated content by using delegation.
$(document).on("eventname","selector",function(){
// code goes here
});
so your code is like this now
$(document).on("click",".test",function(){
// code goes here
});
$(.surrounding_div_class).on( 'click', '.test', function () {
alert( 'WORKS!' );
});
Will only work if the DIV with the class .surrounding_div_class is the immediate parent to the object .test
If there is another object in the div that will be filled it wont work.
The problem you have is that you're attempting to bind the "test" class to the event before there is anything with a "test" class in the DOM. Although it may seem like this is all dynamic, what is really happening is JQuery makes a pass over the DOM and wires up the click event when the ready() function fired, which happens before you created the "Click Me" in your button event.
By adding the "test" Click event to the "button" click handler it will wire it up after the correct element exists in the DOM.
<script type="text/javascript">
$(document).ready(function(){
$("button").click(function(){
$("h2").html("<p class='test'>click me</p>")
$(".test").click(function(){
alert()
});
});
});
</script>
Using live() (as others have pointed out) is another way to do this but I felt it was also a good idea to point out the minor error in your JS code. What you wrote wasn't wrong, it just needed to be correctly scoped. Grasping how the DOM and JS works is one of the tricky things for many traditional developers to wrap their head around.
live() is a cleaner way to handle this and in most cases is the correct way to go. It essentially is watching the DOM and re-wiring things whenever the elements within it change.
An alternate and more succinct alternative (IMHO) is to use a raw javascript function that responds to an on click event, then pass the target element back to jQuery if you like. The advantage of this approach is that you can dynamically add your element anywhere, and the click handler will 'just work', and you need not concern yourself with delegating control to parent elements, and so on.
Step 1: Update the dynamic html to fire an onclick event. Be sure to pass the 'event' object as an argument
$("button").click(function() {
$("h2").html("<p class='test' onclick='test(event)'> click me </p>")
});
Step 2: Create the test function to respond to the click event
function test(e){
alert();
});
Optional Step 3: Given you are using jQuery I'm assuming it will be useful to get a reference back to the source button
function test(e){
alert();
// Get a reference to the button
// An explanation of this line is available here
var target = (e.target)? e.target : e.srcElement;
// Pass the button reference to jQuery to do jQuery magic
var $btn = $(target);
});
.live function works great.
It is for Dynamically added elements to the stage.
$('#selectAllAssetTypes').live('click', function(event){
alert("BUTTON CLICKED");
$('.assetTypeCheckBox').attr('checked', true);
});
Cheers,
Ankit.
The Jquery .on works ok but I had some problems with the rendering implementing some of the solutions above. My problem using the .on is that somehow it was rendering the events differently than the .hover method.
Just fyi for anyone else that may also have the problem. I solved my problem by re-registering the hover event for the dynamically added item:
re-register the hover event because hover doesn't work for dynamically created items.
so every time i create the new/dynamic item i add the hover code again. works perfectly
$('#someID div:last').hover(
function() {
//...
},
function() {
//...
}
);
I'm working with tables adding new elements dynamically to them, and when using on(), the only way of making it works for me is using a non-dynamic parent as:
<table id="myTable">
<tr>
<td></td> // Dynamically created
<td></td> // Dynamically created
<td></td> // Dynamically created
</tr>
</table>
<input id="myButton" type="button" value="Push me!">
<script>
$('#myButton').click(function() {
$('#myTable tr').append('<td></td>');
});
$('#myTable').on('click', 'td', function() {
// Your amazing code here!
});
</script>
This is really useful because, to remove events bound with on(), you can use off(), and to use events once, you can use one().
I couldn't get live or delegate to work on a div in a lightbox (tinybox).
I used setTimeout successfullly, in the following simple way:
$('#displayContact').click(function() {
TINY.box.show({html:'<form><textarea id="contactText"></textarea><div id="contactSubmit">Submit</div></form>', close:true});
setTimeout(setContactClick, 1000);
})
function setContactClick() {
$('#contactSubmit').click(function() {
alert($('#contactText').val());
})
}
Also you can use onclick="do_something(this)"inside element
If you have a dinamically added link to some container or the body:
var newLink= $("<a></a>", {
"id": "approve-ctrl",
"href": "#approve",
"class": "status-ctrl",
"data-attributes": "DATA"
}).html("Its ok").appendTo(document.body);
you can take its raw javascript element and add an event listener to it, like the click:
newLink.get(0).addEventListener("click", doActionFunction);
No matter how many times you add this new link instance you can use it as if you where using a jquery click function.
function doActionFunction(e) {
e.preventDefault();
e.stopPropagation();
alert($(this).html());
}
So you will receive a message saying
Its ok
It has better performance than other alternatives.
Extra: You could gain better performance avoiding jquery and using plain javascript. If you are using IE up to version 8 you should use this polyfill to use the method addEventListener
if (typeof Element.prototype.addEventListener === 'undefined') {
Element.prototype.addEventListener = function (e, callback) {
e = 'on' + e;
return this.attachEvent(e, callback);
};
}
You CAN add on click to dynamically created elements. Example below. Using a When to make sure its done. In my example, i'm grabbing a div with the class expand, adding a "click to see more" span, then using that span to hide/show the original div.
$.when($(".expand").before("<span class='clickActivate'>Click to see more</span>")).then(function(){
$(".clickActivate").click(function(){
$(this).next().toggle();
})
});
Use 'on' as click gets bind to the elements already present.
For e.g
$('test').on('click',function(){
alert('Test');
})
This will help.

Adding onClick event to dynamically generated buttons?

in Javascript .. If I have a dynamically generated buttons and I want a generic onClick function. How can I do that ?
<script>
for(i=0;i<something.length;i++){
$('body').append('<button id="btnInit'+i+'" >'+i+'</button>');
}
</script>
I don't want to create a unique onClick function for each button. How can I do a single one that applies to all. e.g display its label text when pressed.
You can do this by using a Javascript feature called "event bubbling". Ancestor elements are notified of events on their descendent elements.
In this case, you can attach a click handler to the body element and all clicks on those buttons will trigger an event handler. The nicest way to do this in jQuery is to use the on method:
$(document.body).on('click', 'button', function() {
alert ('button ' + this.id + ' clicked');
});
This will work no matter when the elements are created – before or after the elements were created.
This does exactly the same thing as the live method, but live uses on behind the scenes and is far less efficient and flexible.
If you are using a lower version than jQuery 1.7, use live()
$('input[name^="btnInit"]').live("click", function(){
alert("clicked");
});
for jQuery 1.7+, use on()
$("body").on("click", "input[name^="btnInit"]", function(){
alert("clicked");
});
You may delegate the click event to parents of the dynamically created buttons. Here's a great explanation of how it works: http://davidwalsh.name/event-delegate
In jQuery, you can use the live method. refer to its document at http://api.jquery.com/live/
You can use a live method which will bound event listener to existing elements and those that be created in the future. However this can be written either before or after code where buttons were created
$("button[id^=btnInit]").live("click", function(){
// `this` is reference to each button separately - function will be called many times as how many buttons are
alert( this.id );
})
In newest version of jQuery you can use instead both bind and live an on method and instead unbing and die an off method.
In jQuery >=1.7
$("body").on( "click","button[id^=btnInit]", function(){
// `this` is reference to each button separately - function will be called many times as how many buttons are
alert( this.id );
})

Adding an element dynamically, but jquery onClick functions do not work (SimpleBox)

I am trying to use SimpleBox jQuery plug-in on my website. I have the code such that everytime the user clicks on a div of class "link", a SimpleBox is invoked.
I also have another button that uses javascript to dynamically create divs of class "link" to my page. However, when I try to click these divs, the SimpleBox is not invoked.
<script type="text/javascript">
function createLinkDiv()
{
var parentDiv = document.getElementById ("right");
var linkDiv = document.createElement("div");
numDivs++;
linkDiv.setAttribute("class","link");
linkDiv.setAttribute("id",numDivs);
parentDiv.appendChild(linkDiv);
}
$().ready(function() {
$(".link").click(function(event) {
event.preventDefault();
$("#simplebox").simplebox();
});
$(".close_dialog").click(function() {
event.preventDefault();
$("#simplebox").simplebox('close');
});
});
</script>
Any idea why? Any help would be appreciated! Thanks!
For Dynamically added items use .live() or .delegate() to attach event handlers
$(".link").live("click",function(event) {
event.preventDefault();
$("#simplebox").simplebox();
});
Or
$("#right").delegate(".link","click",function(event) {
event.preventDefault();
$("#simplebox").simplebox();
});
Out of context
I suppose you've placed the the createLinkDiv function since you're calling it through inline javascript. Calling functions via inline javascript is a bit of out of fashion these days. Binding those events in code helps to keep your javascipt code easily maintainable.
$("#createLink").click(function(){
$('<div/>').attr({"class":"link","id":"link_" + $(".link").size() })
//Id shouldn't start with a number (not in HTML5)
.click(linkClick)
//Now you don't have to use live
.appendTo("#right");
});
As a side note, the $().ready() syntax is deprecated; it's better to use $(document).ready or just call $ with a function as a parameter.
To answer your main question, the .click method only binds to elements that exist when it's called. So when you add elements to the DOM later, you're not launching the simplebox on click because the handler hasn't been bound. You could either use .delegate to attach event handlers, or you could add the onclick directly in the creation of the DOM element.
The accepted answer is out of date now. The live() method has been removed from jQuery 1.9 and replaced with the on() method.
The syntax for on() is
$(element).on(event, selector, handler)
So in #jnfr's case, one of his handlers could be re-written as
$(document).on("click",".link",function(event) {
event.preventDefault();
$("#simplebox").simplebox();
});
Hopefully this will be of use to anyone arriving here and getting errors when using live().

Categories

Resources