Wednesday, September 30, 2009

[jQuery] Using a selector with .load() doesn't execute script?

I'm trying to load one page into another using the .load() method.
This loaded page contains a script that I want to execute when it has
finished loading. I've put together a simple example to demonstrate:

Index.html:

<html>
<head>
<title>Jquery Test</title>
<script type="text/javascript" src="script/jquery-1.3.2.min.js"></
script>
<script type="text/javascript">
$(document).ready(function()
{
$('#nav a').click(function()
{
$('#contentHolder').load('content.html #toLoad', '', function
() {});
return false;
});
});
</script>
</head>
<body>
<div id="nav">
<a href="content.html">Click me!</a>
</div>
<hr />
<div id="contentHolder">
Content loaded will go here
</div>
</body>
</html>

Content.html:

<div id="toLoad">
This content is from content.html

<div id="contentDiv">
This should fade away.
</div>

<script type="text/javascript">
$('#contentDiv').fadeOut('slow', function() {} );
</script>
</div>

When the link is clicked, the content should load and the second
paragraph should fade away. However it doesn't execute. It is not just
a matter of the DOM not being available, a simple alert("") won't
execute either.

However, if I do away with the #toLoad selector in the .load() call,
it works fine. I am not sure why this is, as the <script> block is
clearly in the scope of the #toLoad div?

Any ideas? If the script from content.html was in the .load()
callback, it works fine.

I have worked around the problem by having the callback use .getScript
() to load "content.js" afterwards and have the JS logic in there.
This is arguably a more elegant solution anyway, but I'm keen to know
*why* the above doesn't work, is it a bug?

Thanks!

No comments: