WEB程序员必备之 关于<script>标志的一些小知识
正如你大概知道的,<script>标志是用来指定在网页上施行哪个 JavaScript 的。<script>标志可以直接包括 JavaScript 代码,或者指向一个 JavaScript 外链 URL。
<script>标志依照它们显现的次序被施行
下面的代码很直不雅地说明了这一点:
<script> var x = 3; </script> <script> alert(x); // Will alert '3'; </script>
使用外链资源时加载次序没有那么直不雅,但仍然是成立的:
<script src="//typekit.com/fj3j1j2.js"></script> <!-- This second script won’t execute until typekit has executed, or timed out --> <script src="//my.site/script.js"></script>
相关学习引荐:javascript视频教程
假如你混合使用外链和内联的 JavaScript,这个规则一样适用。
这意味着假如你的网站有很慢的足本在页面较前部分被加载,你的网页加载就会被显著拖慢。这也意味着后加载的足本可以依靠先加载的足本。
页面元素在它此前的所有足本都加载完毕此前是不会施行渲染的。这意味着你可以你可以在页面加载此前在网页上做各种疯狂的事情,当然前提是你不在意因此而造成的机能问题。
然而这个规则不适用于你在网页加载完成之后通过 document.appendChild
之类的办法增加 <script>标志到 DOM 中。这些标志会按照阅读器恳求处置完成的前后施行足本,不再包管加载次序。
当一个 <script>标志被施行,在它此前的 HTML 元素可以拜访(但是在它之后的还不克不及用)
<html> <head> <script> // document.head is available // document.body is not! </script> </head> <body> <script> // document.head is available // document.body is available </script> </body> </html>
你可以想象 HTML 解析器一个标志一个标志地拜访文档,当它解析到 <script>标志时,立刻施行其中的 JavaScript。这意味着只要当开端标志显现在当前足本此前的 DOM 节点才可以在当前 JavaScript 中被拜访(通过 querySelectorALl
,jQuery 等等)。
一个有用的推论是 document.head
在任何写在网页上的 JavaScript 几乎总是可用。document.body
只要当你将 <script>标志写在 <body>
标志中或者它之后的时候才可用。
async
和 defer
HTML5 增加了两个工具来操纵足本的施行。
async
表示“不消立刻施行它”。更详细地它表示:我不介意你在整个网页加载完成之后施行这个足本,把它放在其他足本施行之后。这关于统计剖析足原本说非常有用,由于页面上没有其他的代码需要依靠于统计足本施行。定义一个页面需要的变量或函数在async
的代码中是不可的,由于你没有办法知道什么时候async
代码将会被实际施行。defer
表示“等候页面解析完成之后施行”。它大致等价于将你的足本绑定到DOMContentedLoaded
事件,或者使用jQuery.ready
。当这个代码被施行,DOM 中的一切元素都可用。不一样于async
,所有加了defer
的足本将会依照它们显现在 HTML 页面中的次序施行,它只是延迟到 HTML 页面解析完毕后开端施行。
type
属性
从历史上看(自 Netsacpe 2 产生起),在 <script>标志上可否写上 type=text/javascript
没有什么关系。假如你通过 type
设定一个非 JavaScript 的 MIME 类型,阅读器不会施行它。当你想要定义你本人的说话时,这会很酷:
<script type="text/emerald"> make a social network but for cats </script>
这段代码实际施行结果由你本人决议,例如:
<script> var codez = document.querySelectorAll('script[type="text/emerald"]'); for (var i=0; i < codez.length; i++) runEmeraldCode(codez[i].innerHTML); </script>
定义 runEmeraldCode
函数留给你们作为练习。
假如你有特殊的需要,你也可以重写页面上 <script>标志的默许 type
,办法是通过一个 meta
标志:
<meta http-equiv="Content-Script-Type" content="text/vbscript">
或者一个恳求返回一个 Content-Script-Type
header。
可以读一下 Web 上惊奇的足本说话的一个简短历史这篇文章有关于 type
用途的更具体信息。
用 integrity
属性?
integrity
属性是子资源完全性新标准的一部分。它同意你为足本文件将包括的内容内容供给一个 hash。这意味着可以防止在传输的时候内容丧失或者被歹意修改。就算使用了 SSL,这个标准也是成心义的,由于有时候你要加载的资源是你没法操纵的站外资源,比方 code.jquery.com
。
假如你选中使用它,你要在 <script>标志里包括一个 hash 类型乃至 hash 值,将它们以连字符隔开。看起来相似下面这样:
<script src="//code.jquery.com/jquery.js" integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"> </script>
我还没有看到有人用了它,然而假如你知道有哪个网站用了,可以鄙人面评论。
还可以用 crossorigin
!
虽然还没有完全被标准化,但是一些阅读器支撑 crossorigin
属性。根本的设法是,阅读器会限制对非同源资源的使用(同源资源是指雷同的和谈、hostname 乃至端口,例如: `http://google.com:80)。
这是为了防止你,例如,向你的竞争敌手网站发恳求,注销你的会员在对方网站的账号(这不好!)。这个问题牵扯到 <script>标志虽然有点不测,但假如实现了 crossorigin
,你只要加一个 handler 到 window.onerror
事件上,就能在看操纵台上看到一些警告信息,提醒你引入了一个不该引入的外站足本。在平安的阅读器下,除非你指定 crossorigin
属性,不然加载外站足本不会出错。
crossorgin
不是一个奇妙的平安手段,它所做的只是让阅读器启用正常的 CORS 拜访检查,发起一个 OPTIONS
恳求并检查 Access-Control
header。
document.currentScript
IE 不支撑的一个别致的东西是个叫做 document.currentScript
的属性。它指向当前正在被施行的足本。假如你想要从你嵌入的 <script>标志中拿一些属性来用,它会非常有用。我个人非常快乐它还没有被完全支撑,不然它会让我们在一部分工作中盼望嵌入更复杂的代码。
onafterscriptexecute
?!
这个超没用,由于它只被 Firefox 支撑。使用 onbeforescriptexecute
能让你绑定事件到每一个足本的施行前和施行后,这很酷。
假如你对这个感到好奇,你可以研讨下。event 对象包括一个被施行的足本的援用,而 before
事件能通过 perventDefault()
取消足本的施行。
for
/ event
到今天, HTML5 标准包括了一个很少见的,之前是 IE 非凡的办法来绑一段代码到一个事件。你应当能向下面这样让一段代码不被施行直到页面加载完成:
<script for="window" event="onload"> alert("Hi!") </script>
这段代码在 Chrome 或者 Firefox 下不克不及实际工作,但是它仍然能够在 IE 下工作。
NOSCRIPT
犹如你父母一样,很难信赖 JavaScript 也曾经年少过。曾经有过这样一段时间你不克不及肯定可否一个阅读器支撑 JavaScript。更糟的是,你乃至不克不及肯定阿谁阅读器能识别 script
标志。而假如一个阅读器不克不及识别标志,它应当会将它渲染成一个 inline 元素,意味着你所有 JavaScript 代码会被作为文本渲染在页面上!
荣幸地是,标准已经能足够有效地幸免这个状况发生,你只需要将你的代码包在 HTML 注释里,那些不支撑足本的阅读器会把下面的文本当做注释:
<script> <!-- to hide script contents from old browsers // You would probably be pasting a ‘rollover’ script // you got from hotscripts.net here // end hiding contents from old browsers --> </script>
当然,像许多事情一样,XHTML将这变得更糟。XML用非凡的办法来转义大概包括完毕标志的内容,这是 CDATA
的来历:
<script> //<![CDATA[ // Is this the right incantation to get this to pass // the XHTML validator? //]]> </script>
像上面这样写,你的代码可以是一个标准的 XHTML。它对实际功效没有什么影响,但是它对你作为一个 Web 开发者的声誉或许很重要(此刻这个时代,谁还用 XHTML 啊——译者注)。
阅读器也包括一个有用的办法来让你把那些不支撑 JavaScript 人赶走,通过 noscript
标志。<noscript>
标志里的内容只要阅读器不支撑足本的时候才会被渲染出来:
<noscript> Please use Internet Explorer 5.5 or above. </noscript> <script> exploitInternetExplorer0Day(); </script>
假如你有敏捷的视察力,你会意识到 noscript
不接受 type
参数,这使得那些使用别的 type
类型的足本的页面上假如显现 noscript
会显得有点歧义。noscript
实际行动在各个阅读器下有所不一样。
<script>标志和 innerHTML
通过 DOM 动态增加到页面上的 <script>标志会被阅读器施行:
var myScript = document.createElement('script'); myScript.textContent = 'alert("?")'; document.head.appendChild(myScript);
通过 innerHTML
动态增加到页面上的 <script>标志则不会被施行:
document.head.innerHTML += '<script>alert("?")</script>';
为什么会是这样的缘由不是很肯定,但是它解决了一个小问题:“可否有一个方法让一个 <script>标志在 Chrome 代码检查器中显示但不实际施行?”你可以利用这个来对你的同事做恶作剧。
以上就是WEB程序员必备之 关于<script>标志的一些小知识的具体内容,更多请关注百分百源码网其它相关文章!