I'm not certain you've determined the exact problem you're having. There are probably 2 problems going on here, layering to create the impression you've come to:
1) jQuery .bind() and its shortcut functions like .click(), .hover() etc bind at the time they're called, not continuously like CSS rules.
So for example this:
$(document).ready(function() {
$('div.stuff').click(function(){alert('Hi');}
});
<div class=stuff>Say hi</div>
Will not work on new HTML inserted into the document after the page first loaded, because $(document).ready() fires when the body tag closes/when jQuery finishes initializing, whichever is second, and not again when you load your new HTML.
A naive answer is to use .live()
$('div.stuff').live('click', function(){alert('Hi');}
This will cause new HTML loaded into the page to fire if it contains a div with class stuff, because jQuery listens for live events on the body tag, which remains in place, and then matches the tag that fired the event to see if it matches the selector. That second step is a little expensive, and with a lot of live selectors your page will respond to events slowly. That's bad.
The better answer is to load the new HTML, and bind. Maybe something like this:
function pageBinds() {
$('div.stuff').click(function(){alert('Hi');}
}
$(document).ready(pageBinds);
function loadPage() {
$.ajax(...)
pageBinds();
}
This gets you performant binds that respond to the loaded content.
You might consider unbinding before loading new content, as leaving the existing events bound can pollute jQuery depending on the event and the browser, but it would take a lot of events and a lot of page loads to have a major impact on a desktop (a smartphone might feel it a little faster). Unbinding would be more involved, though.
2) Script tags in innerHTML'd content are ignored.
This confounds many an ASP.Net programmer using UpdatePanels, which do exactly what you're coding here in PHP. Any script tags in the page you load may as well not be there - the browser just tosses them. In order to run script with your HTML, you need to explicitly execute it using eval() or a couple other more complex tricks.
You can resolve this by loading any content as script separator html. So you use a separator character sequence, have the AJAX call you built separate the incoming string with .split(), eval the script portion, and innerHTML the HTML.