jQuery .load() and sub-pages
I am not just a newbie with Javascript. I am developing a simple site to get my hands on web programming. The web site is simple and structure is like this:
- A simple ul/li/css based navigation menu
- Su开发者_JAVA技巧b pages are loaded in "div" using jQuery, when ever user click appropriate menu item.
- Some of the sub-pages are using different jQuery based plugins such as LightWindow, jTip etc.
The jQuery function that loads the sub-page is like this:
function loadContent(htmlfile){
jQuery("#content").load(htmlfile);
};
The menu items fires loadContent method like this:
<li><a href="javascript:void(0)" onclick="loadContent('overview.html');return false">overview</a></li>
This loads a sub-page name "overview.html" inside the "div".
That's it.
Now this is working fine but some of the sub-pages using jQuery based plugins are not working well when loaded inside the "div". If you load them individually in the browser they are working fine.
Based on above I have few qustions:
Most of the plugins are based on jQuery and sub-pages are loaded inside the "index.html" using "loadContent" function. Do I have to call
<script type="text/javascript" src="js/jquery-1.4.2.min.js"></script>
on each and every sub-page?
If a page is using a custom jQuery plugin, then where do I call it? In "index.html" or on the page where I am using it?
I think whatever script you will call in "index.html", you don't to have call them again in any of the sub pages you are using. Am I right here?
All my sub-pages are similar to this one: This is screenshot.html. Working fine when I load locally in a browser but not working when loaded using jQuery's load() function inside "index.html"
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en-US" xml:lang="en-US" xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type='text/javascript' src='js/prototype.js'></script>
<script type='text/javascript' src='js/scriptaculous/scriptaculous.js'></script>
<script type='text/javascript' src='js/lightview.js'></script>
<link rel="stylesheet" type="text/css" href="css/lightview.css" />
</head>
<body>
<h3 style="text-align:left;">Screenshots</h3>
<div align="center">
<a class="lightview" href="images/ss_win1.png" title="Title"><img src="images/ss_win1_thumb.png" alt="" class="whiteborder"/></a>
<a class="lightview" href="images/ss_win2.png" title="Title"><img src="images/ss_win2_thumb.png" alt="" class="whiteborder"/></a>
<a class="lightview" href="images/ss_win3.png" title="Title"><img src="images/ss_win3_thumb.png" alt="" class="whiteborder"/></a>
</div>
</body>
</html>
Suppose you are using a plugin named myPlugin
. You initialize it inside index.html like this:
jQuery(function() {
jQuery('#selector').myPlugin();
});
Now as you load content dynamically using .load()
and a page that contains #selector
is returned, the plugin won't work. The reason for this is simple: the #selector
element did not exist when you called .myPlugin()
, so the loaded #selector
is not affected.
You have to call .myPlugin()
again after using .load()
to apply the plugin to the new elements:
function loadContent(htmlfile) {
jQuery('#content').load(htmlfile, function(response) {
jQuery(response).find('#selector').myPlugin();
});
}
To specifically answer your questions:
No, including jQuery once is enough.
You call it in index.html, the loaded content should take any part in loading plugins.
You have to initialize plugins every time you load new content.
Typically, for plugins, you will need to re-init them after you programmatically replace the part of the DOM on which they have been applied, e.g.:
function loadContent(htmlfile){
jQuery("#content").load(htmlfile), function(response) {
// this gets executed after the response has been inserted into the DOM
jQuery(response).find("#someElement").fooPlugin();
});
};
For event handlers, you can simply use live
or delegate
to ensure that they remain intact after the elements to which they are attached get replaced. The (live) manual says:
Attach a handler to the event for all elements which match the current selector, now or in the future.
Example:
$("a").live("click", function() {
alert("this will alert even after this anchor has been replaced via ajax");
});
If plugin is html page that can be opened standalone in the browser, may be you should use page fragment load
$('#content').load('plugin.html #plugin-body');
not load the whole page (more)
May be I should have predefined function on plugin page called
pluginInitialize(initParams);
function is called from loader page when plugin is loaded. This function contains plugin initialization logic (may be sophisticated and rather complex).
The call to jquery should be only used one, in the index file.
If you are using jQuery in your sub-pages, on some occassions you have to call it again within that actual sub-page.
Although, a much handier method for your ul menu and subpages would be,
$('ul#menu li a').click(function() {
var url = $(this).attr('href');
$('#content').load(url);
});
Sorry if there are any typos there, on my itouch :)
精彩评论