1. html页面:
复制代码 代码如下:
2. service.ashx 后台代码:
复制代码 代码如下:
public void processrequest(httpcontext context)
{
string filepath = context.request[file].tostring();
string filecontent = string.empty;
using (streamreader sr = new streamreader(context.server.mappath(filepath)))
{
filecontent = sr.readtoend();
}
context.response.contenttype = text/plain;
context.response.write(filecontent);
}
3. pages2_1.txt 文件:
复制代码 代码如下:
page content
将html片段中的javascript提取为一个文件
这也是自然而然就想到的,特别是html片段中javascript代码比较多的情况下,
提取为一个js文件,让浏览器帮忙缓存不失为一种好方法。
1. 重新定义pages2_2.txt
复制代码 代码如下:
page content
2. pages2_2.js
复制代码 代码如下:
function setup() {
var parent = $(#complex_page_segment);
$(.previous, parent).click(function() {
$(.content, parent).html(previous page content);
});
$(.next, parent).click(function() {
$(.content, parent).html(next page content);
});
}
3. 运行,居然报错!
问题分析
错误信息是 setup 这个函数没有定义,但是从firebug中我们明显看到pages2_2.js的确被加载了。
那个极有可能是在 pages2_2.js 加载之前就调用了 setup 这个函数。
但是我们的setup 函数调用是放在jquery的 $(function(){ }) 之中的,也就是在页面加载完毕才调用的。
其实现在问题已经很明显了,在ajax返回页面片段的时候,整个页面是已经加载完成了,也就是dom ready。
所以在页面片段中:
复制代码 代码如下:
$(function() {
setup();
});
和下面直接调用是等价的:
复制代码 代码如下:
setup();
解决问题
对于这个问题,我们有三种解决办法。
1. 将外部js文件在页面中加载,而不是在ajax返回的html片段。
2. 我们可以通过javascript先加载外部js,再加载纯粹的html片段。
看一下pages2_3.htm的实现:
复制代码 代码如下:
3. 利用javascript在页面上是顺序加载的特性,将html片段中外部js引用放在最上面
pages2_4.htm:
复制代码 代码如下:
pages2_4.txt:
复制代码 代码如下:
page content
可能你会觉得第三种方法没有必要,但是如果你碰到这样的需求,你就知道第三种方法的重要性了。
不要在每个页面都加载这个js文件
调用者不知道一个html片段关联哪些js文件
============================================================
关于js的顺序执行特性
可能有人对这个特性并不是很清楚,我就通过一个例子来说明。
复制代码 代码如下:
js1.js:
复制代码 代码如下:
console.log(start load js1: + new date().tolocaletimestring());
// 中间是很长很长的一段javascript,有12m之多
console.log(end load js2: + new date().tolocaletimestring());
js2.js:
复制代码 代码如下:
console.log(load js2: + new date().tolocaletimestring());
我们来看下firebug的记录:
可以看到,虽然js2.js更早的被加载,但是还是js1.js执行结束之后,才开始执行js2.js。
源代码下载