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

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

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

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

时间: 2024-09-10 19:53:59

在多个页面使用同一个HTML片段《续》_javascript技巧的相关文章

在多个页面使用同一个HTML片段的代码_javascript技巧

问题描述 有一个比较复杂的HTML片段(A),如果把这个HTML片段嵌入到其他页面中(B,C,D....). 问题的关键是在HTML片段中有大量的JavaScript逻辑需要处理,比如说分页,点击事件响应等. 对于这个问题,我们用一个简单的例子来说明: "页面上有一个按钮,点击此按钮引入一个HTML片段,此HTML片段中有分页按钮." 1. 使用IFrame 主页面,点击一个按钮向页面引入一个IFrame: 复制代码 代码如下:     <script type="te

js实现同一个页面多个渐变效果的方法_javascript技巧

本文实例讲述了js实现同一个页面多个渐变效果的方法.分享给大家供大家参考.具体分析如下: 这里可实现5个元素中随便一个,鼠标移上去透明度渐渐增加,鼠标移出,透明度渐渐减小的效果. 要点一: var speed = 0; if(target>obj.alpha){ speed = 5; }else{ speed = -5; } 根据目标值和当时值的对比,来决定是正向还是负向速度. 要点二: for(i=0; i<runs_li.length; i++){ runs_li[i].timer = n

javascript页面渲染速度测试脚本分享_javascript技巧

复制代码 代码如下: /* 获取渲染开始的时间戳, 保存在数组PAGE_SPEED_TIME中 */<html><script type="text/javascript">/*tag*/PAGE_SPEED_TIME = [new Date().getTime()];</script><head>......</head> 复制代码 代码如下: ....../* 页面最末端,计算页面加载耗用的时间 */</body&g

BootStrap实用代码片段之一_javascript技巧

如题,持续总结自己在使用BootStrap中遇到的问题,并记录解决方法,希望能帮到需要的小伙伴. 应用场景:经典上下布局中,顶部导航条固定,下部填充不显示滚动条 解决方案:导航条固定在顶部,同时为body设置内边距(padding-top),内边距为导航条高度(默认50px,可自己调整高度),html代码如下: <!--html页面布局--> <div class="container-fluid page-wrapper"> <!--导航栏-->

JavaScript保存并运算页面中数字类型变量的写法_javascript技巧

之前在html页面嵌入一段如下javascript片段,但是在单击一个按钮的时候会对i值加一,但是两次单击之后,i的初始值没变. 复制代码 代码如下: <script language=javascript>       var i=2; </script> 后来把变量声明在一个test对象里面,如下代码.这样每次变更test.i之后,test.i的值就可以保存下来 复制代码 代码如下: <script language=javascript>       var te

非常漂亮的让背景如此暗淡(一种弹出提示信息时页面背景色调改变的方法)_javascript技巧

本站提示信息 × 本人申明此博客所有文章(包括文章插图)均为原创,如需引用或转载请注明出处. 欢迎大家对博文中观点留言评述,谢绝无聊人士无素质无观点的灌水漫骂. 本站已设背景音乐,听音乐盒中收集的音乐时请先到页面底部关闭背景音乐. 显示提示信息

用JS实现一个页面多个css样式实现_javascript技巧

第一步:在连接样式表的元素里定义一个id,例如 复制代码 代码如下: <link href="1.css" rel="stylesheet" type="text/css" id="css">, 我定义的id是css. 第二步:写一个js函数,代码如下: 复制代码 代码如下: <script type="text/javascript">  function change(a){  

用Javascript 获取页面元素的位置的代码_javascript技巧

下面的教程总结了Javascript在网页定位方面的相关知识. 一.网页的绝对大小和相对大小 首先,要明确两个基本概念. 一张网页的全部面积,就是它的绝对大小.通常情况下,网页的绝对大小由内容和CSS样式表决定. 网页的相对大小则是指在浏览器窗口中看到的那部分网页,也就是浏览器窗口的大小,又叫做viewport(视口). 下图中央的方框就代表浏览器窗口,每次只能显示一部分网页. (图一 网页的绝对大小和相对大小) 很显然,如果网页的内容能够在浏览器窗口中全部显示(也就是不出现滚动条),那么网页的

JS获取整个页面文档的实现代码_javascript技巧

唯一需要注意的地方: innerText与textContent,显示页面的时候不能用innerHTML,否则会被解析.innerText与textContent是在除FF之外的浏览器与FF之间的差异. 复制代码 代码如下: var innerText = document.body.innerText ? 'innerText' : 'textContent'; 上面的语句在开头处理以避免多次判断 demo贴图: demo: 复制代码 代码如下: <!DOCTYPE html PUBLIC &qu