js和HTML结合(补充知识:如何防止文件缓存的js代码)
来自《javascript高级程序设计 第三版:作者Nicholas C. Zakas》的学习笔记(二)
使用html标签<script>可以把js嵌入到html页面中,让脚本与标记混合一起;也可以包含外部的js文件。如:
- 脚本和标记混合:
<script type="text/javascript">
function sayHi(){
alert("Hi");
}
</script>在使用<script>嵌入代码时,记住不要在代码中的任何地方出现'<script>'字符串。例如,
<script text="text/javascript">
function sayScript(){
alert("</script>");
}
</script>浏览器在加载上述代码时将会报错,因为当浏览器遇到字符串</script>时,就会认为那是结束的</script>标签。解决办法如下:
<script text="text/javascript">
function sayScript(){
alert("<\/script>");
}
</script> - 外部js文件的链接,例如:
<script type="text/javascript" src="example.js"></script>
需要注意的是:带有src属性的<script>元素不应该在其<script></script>标签之间有额外js代码。只会下载并执行外部脚本文件,嵌入的代码会被忽略。src属性还可以包含来自外部域的js文件,如:
<script type="text/javascript" src="http://www.somewhere.com/afile.js"></script>
不过随意加载外部域js文件存在潜在危险,需要引起警惕。
而我们需要注意的地方有:
- 在包含外部js文件时,必须将src属性设置为指向相应文件的URL。而这个文件可以与包含它的页面位于同一个服务器上,也可以是其他任何域中的文件(如:)
- 所有<script>元素都会按照它们在页面中出现的先后顺序依次被解析。在不使用defer和async属性的情况下,只有在解析完前面<script>元素中的代码之后,才会开始解析后面<script>元素中的代码(后面将会补充defer和async的知识,就如你此时脑瓜子里猜测的那样,defer和async就是能够控制解析顺序的。不过还有细节方面的知识,如果您此时已经迫不及待想知道,可以先翻阅到该文章的相应段落,抢先阅读)。
- 由于浏览器会先解析完不使用defer属性的<script>元素中的代码,然后再解析后面的内容,所以一般应该把<script>元素放在页面最后,即主要内容后面,</body>标签前面。从而可以避免出现js文件下载过慢出现页面无法渲染的情况。
- 使用defer属性可以让脚本在文档完全呈现之后执行。延迟脚本总是按照指定它们的顺序执行。
- 使用async属性可以表示当前脚本不必等待其他脚本,也不必阻塞文档呈现。不能保证异步脚本按照它们在页面中出现的顺序执行。
- 使用<noscript>元素可以指定不支持脚本的浏览器中显示的替代内容。但在启动了脚本的情况下,浏览器不会显示<noscript>元素中的任何内容。
defer和async介绍:
标签<script>的defer属性的定义(defer只适用于外部脚本),是脚本会被延迟到整个页面都解析完毕后再运行。这个属性的用途表明脚本在执行时不会影响页面的构成。如:
<script type="text/javascript" defer="defer" src="example1.js"></script>
<script type="text/javascript" defer="defer" src="example2.js"></script>
需要注意的是,现实生活中,example1.js和example2.js虽然延迟了,但是彼此作为都是延迟脚本并不是example1.js一定会先于example2.js执行,也不一定会在DOMContentLoaded事件触发前执行,因此最好只包含一个延迟脚本。
同样属性async也只适用于外部脚本,并告诉浏览器立即下载文件,但不妨碍页面中的其它操作,比如下载其它资源或是等待加载其它脚本。标记为async的脚本并不保证按照指定它们的先后顺序执行。所以。确保两者之间互不依赖非常重要。指定async属性的目的是不让页面等待两个脚本执行和下载,从而异步加载页面其它内容。建议异步脚本不要在加载期间修改DOM。
补充:如何防止浏览器缓存外部js文件,很多时候用于动态验证码等需要多次加载文件的时候。
原理其实就是通过在固定地址后面,加上一个不同值的日期数值,以达到地址不重复的目的,让浏览器每次都实时加载,不从缓存中读取文件。
<script type="text/javascript">
//防止js文件缓存下来,以后更新时不再需要用户重新删除IE文件等操作。
var now=new Date();
var number = now.getYear().toString()+now.getMonth().toString()+now.getDate().toString()+now.getHours().toString()+now.getMinutes().toString()+now.getSeconds().toString();
document.write('<scr'+'ipt language="javascript" type="text/javascript" src="jb51net.js?"+number+""></scr'+'ipt>');
</script>
学习笔记。
js和HTML结合(补充知识:如何防止文件缓存的js代码)的更多相关文章
- Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识
目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...
- Nodejs学习笔记(六)—Node.js + Express 构建网站预备知识
前言 前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识! 主要是些基础的东西... 如何去创建路由规则.如何去提交表单并接收表单项的值.如何去给密 ...
- modeJS 深了解(1): Node.js + Express 构建网站预备知识
转载:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp1.html 目录 前言 新建express项目并自定义路由规则 如何提取页面中的 ...
- BBS项目补充知识(后台文章展示功能)
BBS项目补充知识 1. 开放 media 文件路径 # 以用户注册页面为例 用户头像文件我们默认时保存在 根路径下的static下的img文件夹 但也可以单独放置在指定路径下 # 根路径下创建 me ...
- 《Ext JS模板与组件基本知识框架图----模板》
最近在整理Ext JS的模板和组件,在参考<Ext JS权威指南>,<Ext JS Web应用程序开发指南>,<Ext JS API>等相关书籍后才写下这篇< ...
- 031医疗项目-模块三:药品供应商目录模块——供货商药品目录查询功能----------sql补充知识
这个补充知识有一个点很有必要,视屏上的老师提出一点: 内链接关联查询: 如果表A和表B有一个外键关联 ,可以通过外键进行内链接查询 select dictinfo.*, dicttype.typena ...
- JS模块化工具require.js教程(二):基本知识
前一篇:JS模块化工具我们以非常简单的方式引入了requirejs,这一篇将讲述一下requirejs中的一些基本知识,包括API使用方式等 基本API require会定义三个变量:define,r ...
- 面向对象 - 1.面向过程/2.面向对象/3.如何使用类/4.__init__方法/5.属性查找/6.补充知识/7.可扩展性高
编程范式(流派): 面向对象编程,面向过程编程 各有用处!! 编程:语法+数据结构(list dict)+算法(逻辑)-----------------------------------1.面向过程 ...
- freeMarker(五)——模板开发指南补充知识
学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南补充知识 1. 自定义指令 自定义指令可以使用 macro ...
随机推荐
- Linux 命令 - head: 打印文件的开头部分
命令格式 head [OPTION]... [FILE]... 命令参数 -c, --bytes=[-]K 显示每个文件的前 K 字节内容. -n, --lines=[-]K 显示每个文件的前 K 行 ...
- Linux 命令 - ss: 查看套接字统计信息
命令格式 ss [options] [ FILTER ] 命令参数 -h, --help 显示帮助信息. -V, --version 显示版本信息. -n, --numeric 不解析服务名称. -r ...
- 随机提取N条记录[多种数据库方法]
随机提取10条记录的例子: Sql server: select top 10 * from 表 order by newid() Access: SELECT top 10 * FROM 表 ORD ...
- ios app名字的多语言支持
经测试,不同版本的xcode会有操作细节不同,本次环境xcode6.4 1)编辑Info.plist,添加一个新的属性Application has localized display name, 设 ...
- MSSQL AlwaysOn中的“主角色中的连接”和“可读辅助副本”初探
一.开篇 在进行配置只读路由的时候,需要进行配置可用性组中的可用性副本,如下如所示: 每一项都是啥意思可以看看这个链接 https://msdn.microsoft.com/zh-cn/library ...
- android application类的用法
android application类的用法 Application是android系统Framework提供的一个组件,它是单例模式(singleton),即每个应用只有一个实例,用来存储系统的一 ...
- ### Caffe
Caffe学习. #@author: gr #@date: 2015-08-30 #@email: forgerui@gmail.com 1. Install 详细可以见官方文档,博客1,博客2. 1 ...
- Swift静态方法
与静态属性类似,Swift中还定义了静态方法,也称为类型方法,所谓“类型”是指枚举.结构体和类.静态方法定义的方法也是与静态属性类似的,枚举和结构体的静态方法使用的关键字是static,类的静态方法使 ...
- 在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 链表结点与函数的定义如下: struct ListNode { int m_nValue; ListNode* m_p ...
- 服务器 tfs不提供 TeamFoundation服务。基础连接已经关闭
服务器 tfs(服务器名或url)不提供 TeamFoundation服务.基础连接已经关闭,发送时发生错误.TFS突然间连接不上到,到服务器上配置团队项目的组成员资格提示这样的错误,客户端连接的时候 ...