Reputation: 3168
I have a div whose content gets dynamically generated from innerHTML and I cant seem to target those elements using jQuery for validation, Eg This is the page:
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="en-US">
<head>
</head>
<body>
<span id="alert1">Alert1</span>
<input type="button" value="Click Me" id="button1" />
<div id="empty"></div>
</body>
</html>
and this is the js code:
<script type = "text/javascript">
$(document).ready(function() {
$('#button1').click(function() {
var html = "uname <input type='text' id='uname'><br />password <input type='text' id='password'><br /><span id='alert'>Alert</span>";
$('#empty').html(html);
});
$('#alert').click(function() {
alert('Alert');
});
$('#alert1').click(function() {
alert('Alert1');
});
});
</script>
The alert for the span with id alert1 works but for id alert which is set using innerHTML or .html() does not work so how to fix this?
Thank you in advance
Upvotes: 2
Views: 3990
Reputation: 8417
The problem here is that when you write like this..
$("#element").click(function() {
alert("Alert!");
});
.. it will only create events handlers for elements that exist when you execute the code. It won't create event handlers for future elements even if they have the same jQuery selector ("#element" in this case).
What you need to do is bind with .on(event, selector, function)
on a parent element, as the events "bubble up" the hierarchy. That way you can handle future events from the specified selector. Personally I would do it like this:
$(document).ready(function() {
$('#button1').click(function() {
var html = "<insert lots of html stuff here>";
$('#empty').html(html);
});
$(document).on("click", "#alert", function() {
alert("Alert!");
});
$(document).on("click", "#alert1", function() {
alert("Alert1!");
});
});
Upvotes: 3
Reputation: 6420
you have to attach the listeners AFTHER you added the objects to the dom!
so afther .html(...)
<script type = "text/javascript">
$(document).ready(function() {
$('#button1').click(function() {
var html = "uname <input type='text' id='uname'><br />password <input type='text' id='password'><br /><span id='alert'>Alert</span>";
$('#empty').html(html);
$('#alert').click(function() {
alert('Alert');
});
});
});
.on()
is also an option. You bind listener independent if they are renderd to the dom or not. But I recommend the first approach. If you are writing larger applications the approach of attaching handlers after creation is much clearer then event delegation automatically attaching event handlers maybe without you even noticing. for 1 or 2 it's ok but if you're adding multiple events to multiple objects (tags, classes) you could loose oversight...
Upvotes: 0
Reputation: 1234
Use .on()
instead of .click()
to bind events at run-time. You may try .live()
but it is deprecated.
Here's the fiddle : http://jsfiddle.net/Akyrk/
Upvotes: 0
Reputation: 167
you should use delegate
$(elements).delegate(selector, events, data, handler);
as per your code
$(document).ready(function() {
$("yourdiv").delegate("#alert, #button, #Alert1", "click", function() {
alert('Alert');
});
});
Upvotes: 1