百分百源码网-让建站变得如此简单! 登录 注册 签到领金币!

主页 | 如何升级VIP | TAG标签

当前位置: 主页>网站教程>JS教程> WEB程序员必备之 关于<script>标志的一些小知识
分享文章到:

WEB程序员必备之 关于<script>标志的一些小知识

发布时间:09/01 来源:未知 浏览: 关键词:

正如你大概知道的,<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> 标志中或者它之后的时候才可用。

asyncdefer

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>标志的一些小知识的具体内容,更多请关注百分百源码网其它相关文章!

打赏

打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

百分百源码网 建议打赏1~10元,土豪随意,感谢您的阅读!

共有154人阅读,期待你的评论!发表评论
昵称: 网址: 验证码: 点击我更换图片
最新评论

本文标签

广告赞助

能出一分力是一分吧!

订阅获得更多模板

本文标签

广告赞助

订阅获得更多模板