在多个页面使用同一个HTML片段《续》


Posted in Javascript onMarch 04, 2011

1. HTML页面:

<script type="text/javascript"> 
$(function() { 
$("#clickToInsert").click(function() { 
$.get("service.ashx?file=pages2_1.txt", function(data) { 
$("#placeholder").html(data); 
}, "text"); 
}); 
}); 
</script> 
<input type="button" id="clickToInsert" value="Insert HTML" /> 
<div id="placeholder"> 
</div>

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 文件:
<script type="text/javascript"> 
$(function() { 
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"); 
}); 
}); 
</script> 
<div id="complex_page_segment"> 
<input type="button" value="Previous Page" class="previous" /> 
<input type="button" value="Next Page" class="next" /> 
<div class="content">Page Content</div> 
</div>

将HTML片段中的JavaScript提取为一个文件
这也是自然而然就想到的,特别是HTML片段中JavaScript代码比较多的情况下,
提取为一个JS文件,让浏览器帮忙缓存不失为一种好方法。
1. 重新定义pages2_2.txt
<script type="text/javascript"> 
$(function() { 
setup(); 
}); 
</script> 
<script src="pages2_2.js" type="text/javascript"></script> 
<div id="complex_page_segment"> 
<input type="button" value="Previous Page" class="previous" /> 
<input type="button" value="Next Page" class="next" /> 
<div class="content">Page Content</div> 
</div>

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. 运行,居然报错! 

在多个页面使用同一个HTML片段《续》

问题分析
错误信息是 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的实现:

<script type="text/javascript"> 
$(function() { 
$("#clickToInsert").click(function() { 
$.getScript("pages2_2.js", function() { 
$.get("service.ashx?file=pages2_3.txt", function(data) { 
$("#placeholder").html(data); 
}, "text"); 
}); 
}); 
}); 
</script> 
<input type="button" id="clickToInsert" value="Insert HTML" /> 
<div id="placeholder"> 
</div>

3. 利用JavaScript在页面上是顺序加载的特性,将HTML片段中外部JS引用放在最上面
pages2_4.htm:
<script type="text/javascript"> 
$(function() { 
$("#clickToInsert").click(function() { 
$.get("service.ashx?file=pages2_4.txt", function(data) { 
$("#placeholder").html(data); 
}, "text"); 
}); 
}); 
</script> 
<input type="button" id="clickToInsert" value="Insert HTML" /> 
<div id="placeholder"> 
</div>

pages2_4.txt:
<script src="pages2_2.js" type="text/javascript"></script> 
<script type="text/javascript"> 
setup(); 
</script> 
<div id="complex_page_segment"> 
<input type="button" value="Previous Page" class="previous" /> 
<input type="button" value="Next Page" class="next" /> 
<div class="content"> 
Page Content</div> 
</div>

可能你会觉得第三种方法没有必要,但是如果你碰到这样的需求,你就知道第三种方法的重要性了。

不要在每个页面都加载这个JS文件
调用者不知道一个HTML片段关联哪些JS文件
============================================================
关于JS的顺序执行特性
可能有人对这个特性并不是很清楚,我就通过一个例子来说明。

<html> 
<head> 
<title></title> 
<script src="js1.js" type="text/javascript"></script> 
<script src="js2.js" type="text/javascript"></script> 
<script type="text/javascript"> 
console.log("after js2:" + new Date().toLocaleTimeString()); 
</script> 
</head> 
<body> 
</body> 
</html>

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的记录: 

在多个页面使用同一个HTML片段《续》

在多个页面使用同一个HTML片段《续》

可以看到,虽然js2.js更早的被加载,但是还是js1.js执行结束之后,才开始执行js2.js。
源代码下载

Javascript 相关文章推荐
将Datatable转化成json发送前台实现思路
Sep 06 Javascript
JavaScript中使用Object.create()创建对象介绍
Dec 30 Javascript
AngularJS基础 ng-cut 指令介绍及简单示例
Aug 01 Javascript
Angular2 环境配置详细介绍
Sep 21 Javascript
js本地图片预览实现代码
Oct 09 Javascript
JS获取年月日时分秒的方法分析
Nov 28 Javascript
微信小程序实战之仿android fragment可滑动底部导航栏(4)
Apr 16 Javascript
解决vue attr取不到属性值的问题
Sep 18 Javascript
vue项目中全局引入1个.scss文件的问题解决
Aug 01 Javascript
微信小程序3D轮播实现代码
Sep 19 Javascript
基于JavaScript判断两个对象内容是否相等
Jan 10 Javascript
js实现跳一跳小游戏
Jul 31 Javascript
在多个页面使用同一个HTML片段的代码
Mar 04 #Javascript
如何确保JavaScript的执行顺序 之实战篇
Mar 03 #Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
Mar 03 #Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 #Javascript
jQuery 操作option的实现代码
Mar 03 #Javascript
基于Jquery的$.cookie()实现跨越页面tabs导航实现代码
Mar 03 #Javascript
jquery中实现简单的tabs插件功能的代码
Mar 02 #Javascript
You might like
PHP 安全检测代码片段(分享)
2013/07/05 PHP
PHP打开和关闭文件操作函数总结
2014/11/18 PHP
PHP实现获取某个月份周次信息的方法
2015/08/11 PHP
详解php中 === 的使用
2016/10/24 PHP
php实现微信扫码支付
2017/03/26 PHP
php用wangeditor3实现图片上传功能
2019/08/22 PHP
php自动加载代码实例详解
2021/02/26 PHP
javascript中的107个基础知识收集整理 推荐
2010/03/29 Javascript
JavaScript异步编程:异步数据收集的具体方法
2013/08/19 Javascript
extjs render 用法介绍
2013/09/11 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
利用JavaScript脚本实现滚屏效果的方法
2015/07/07 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
jQuery实现图片局部放大镜效果
2016/03/17 Javascript
jQuery实现的无限级下拉菜单功能示例
2016/09/12 Javascript
探索Vue.js component内容实现
2016/11/03 Javascript
详解vue axios中文文档
2017/09/12 Javascript
jQuery实现的form转json经典示例
2017/10/10 jQuery
Vue实现按钮旋转和移动位置的实例代码
2018/08/09 Javascript
nodejs 如何手动实现服务器
2018/08/20 NodeJs
微信小程序利用swiper+css实现购物车商品删除功能
2019/03/06 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
[46:03]LGD vs VGJ.T 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Pyspider中给爬虫伪造随机请求头的实例
2018/05/07 Python
Flask之flask-script模块使用
2018/07/26 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
Python MySQLdb 执行sql语句时的参数传递方式
2020/03/04 Python
python GUI库图形界面开发之PyQt5滚动条控件QScrollBar详细使用方法与实例
2020/03/06 Python
详解基于python的图像Gabor变换及特征提取
2020/10/26 Python
如何创建一个Flask项目并进行简单配置
2020/11/18 Python
Calphalon美国官网:美国顶级锅具品牌
2020/02/05 全球购物
2014年党员创先争优承诺书
2014/05/29 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
安全责任协议书范本
2016/03/23 职场文书
2019最新校园运动会广播稿!
2019/06/28 职场文书