JS高程三第二章一二天笔记

一、在HTML中使用JavaScript

1、HTML4.0.1为<script>定义了下列6个属性

(1)async:可选,表示应该立即下载脚本,但不应该妨碍页面中的其他操作,比如下载其他资源或等待加载其他脚本,只对外部脚本有效。

(2)charset:可选,表示通过src属性指定的代码的字符集,由于大多数浏览器会忽略他的值,因此这个属性很少有人用。

(3)defer:可选,表示脚本可以延迟到文档完全被解析和显示之后再执行,只对外部脚本文件有效。

(4)language: 已废弃

(5)src: 可选,表示包含要执行代码的外部文件

(6)type:可选,可以看成language的替代属性,表示编写代码使用的脚本语言的内容类型(也成为MIME类型)。虽然text/javascript和text/ecmascript都不被推荐使用,但人们一直使用前者。实际上,服务器在传送JavaScript文件时使用的MIME类型通常是application/x-javascript,但在type中设置这个值却可能导致脚本被忽略。另外,在非IE浏览器下还可以使用以下值,application/javascript和application/ecmascript。考虑到约定俗成和最大限度的浏览器兼容性,目前type属性依旧还是text/javascript。不过这个属性不是必须的,如果没有指定这个属性,则其默认值仍为text/javascript。


2、使用<script>元素的方式有两种,直接在页面中嵌入JavaScript代码和包含外部JavaScript文件。

在使用<script>元素嵌入JavaScript代码时,只需为<script>指定type类型,然后,像下面把JavaScript代码直接放在元素内部即可。

<script type="text/javascript">
  function sayHi() {
    alert("Hi!");
  }
</script>

包含在<script>中的JavaScript代码将被从上至下依次解释,就拿前面这个例子来说,解释器会解释一个函数的定义,然后将该定义保存在自己的环境中,在解释器对<script>元素内部求值完毕之前,页面中的其余内容都不会被浏览器加载或者显示。

在<script>嵌入JavaScript代码时,记住不要在代码中的任何地方出现</script>字符串,因为根据解析嵌入式代码的规则,当浏览器遇到字符串</script>时,就会认为那是结束的<script>标签,而通过转移字符\可以解决这个问题。比如:

<\/script>


如果要通过<script>元素来包含外部JavaScript文件,那么src属性就是必须的,这个属性的值是指向一个外部JavaScript链接,例如

<script type="text/javascript" src="example.js"></script>

在这个例子中,挖女友文化部example.js将被加载到当前页面中,外部文件只需包含通常要放在开始的<script>和结束的</script>,与解析嵌入式JavaScript代码一样,在解析外部Javascript文件时,页面的处理也会暂时停止,如果在XHTML文档中,也可以省略</script>的结束标签。但是不能在HTML文档中使用这种语法,而且也得不到某些浏览器(尤其是IE的正确解析)。

需要注意的是,带有src属性的<srcipt>值不应该在其<script></script>标签之剑再包含额外的JavaScript代码,如果包含了嵌入的代码,嵌入的代码将被忽略。

另外,通过<srcipt>元素的src属性还可以包含来自外部域的JavaScript文件。例如:

<script type="text/javascript src=...../example.js"></script>
这样,位于外部域的代码也会被加载和解析,就像这些代码位于加载他们的页面一样。

无论如何包含代码,只要不存在defer和async属性,浏览器就会按照<script>元素在页面中出现的先后顺序进行解析。


3、标签的位置

按照传统的做法,所有<script>元素都应该放在页面的<head>元素中,例如:

<html>
<head>
<script>....</script>
</head>
</html>

这种做法的目的是把所有外部文件(包括css文件和JavaScript文件)的引用都放在相同的地方。

可是在文档的<head>元素中包含所有JavaScript文件,意味着必须等所有JS文件都被下载之后页面才会显示,为了避免这个问题,现代的Web程序一般都把JS引用放在<body>元素中页面内容的后面。例如

<html>
<head>
</head>
<body>
<内容>
<script>....</script>
</body>
</html>


这样,在解析包含的JavaScript代码之前,页面的内容将完全呈现在浏览器中。


4、延迟脚本

HTML4为<script>标签定义了defer属性,这个属性的用途是表明脚本在执行时不会影响页面的构造,也就是说,脚本会被延迟到整个页面都解析完毕后再运行,因此,在<script>元素中设置defer属性,相当于告诉浏览器立即下载,但是延迟执行。

<head>
<script defer="defer">....</script>
</head>


在这个例子中,虽然我们把<script>元素放在<head>中,但其中包含的脚本将延迟到遇到</html>标签之后再执行。HTML5规范要求脚本按照他们出现的先后顺序执行,因此第一个延迟脚本会先于第二个延迟脚本执行,而这两个脚本会先于DOMContentLoaded事件触发前执行。在现实中,延迟脚本不一定按照顺序执行,也不一定会在DOMContentLoad事件触发之前执行,因此最好只包含一个延迟脚本。

defer只适用于外部属性,这点在HTML5中明确规定,因此支持HTML5的实现会忽略给嵌入脚本设置的defer属性。在IE8之后完全支持HTML5的行为。IE、火狐、Safari和Chrome支持这个属性,但是其他浏览器会忽略这个属性,因此把延迟脚本放在页面底部仍然是最佳选择。

在XHTML中,要把defer属性设置为defer="defer"


5、异步脚本

HTML5为<script>定义了async属性,这个属性和defer属性类似,都用于处理脚本的行为,同样的,async也只适用与外部脚本文件,并告诉浏览器立即下载文件,但与defer属性不同的是,标记为async的脚本并不保证按照指定他们的先后顺序执行。例如:

<script type="text/javascript" async src...></script>
<script type="text/javascript" async src...></script>




在上述脚本中,第二个脚本文件可能会在第一个脚本文件之前执行,因此确保两者之间互不依赖非常重要,指定async属性的目的是不让页面等待两个脚本的下载和执行,从而异步加载其他内容,为此,建议异步脚本不要在加载期间修改DOM。

异步脚本一定会在页面的load事件前执行,但可能会在DOMContentLoaded事件触发之前或之后执行,支持异步脚本的浏览器有火狐3.6,Safari5和Chrome



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值